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 72 65 74 75 72 6e 20 70 3b 0a );. return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 }../*.** Remembe
0420: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 r the SQL string
0430: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20 for a prepared
0440: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f statement..*/.vo
0450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 id sqlite3VdbeSe
0460: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f tSql(Vdbe *p, co
0470: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 nst char *z, int
0480: 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70 61 72 n, int isPrepar
0490: 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74 28 20 eV2){. assert(
04a0: 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31 20 7c isPrepareV2==1 |
04b0: 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 30 | isPrepareV2==0
04c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 );. if( p==0 )
04d0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65 66 return;.#if def
04e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
04f0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 _TRACE) && !defi
0500: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c ned(SQLITE_ENABL
0510: 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28 20 E_SQLLOG). if(
0520: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72 !isPrepareV2 ) r
0530: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 eturn;.#endif.
0540: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d assert( p->zSql=
0550: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 =0 );. p->zSql
0560: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 = sqlite3DbStrND
0570: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b up(p->db, z, n);
0580: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56 . p->isPrepareV
0590: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72 2 = (u8)isPrepar
05a0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 eV2;.}../*.** Re
05b0: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73 turn the SQL ass
05c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70 ociated with a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
05e0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 t.*/.const char
05f0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c *sqlite3_sql(sql
0600: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 ite3_stmt *pStmt
0610: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28 ){. Vdbe *p = (
0620: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20 Vdbe *)pStmt;.
0630: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e return (p && p->
0640: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70 isPrepareV2) ? p
0650: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f ->zSql : 0;.}../
0660: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f *.** Swap all co
0670: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 ntent between tw
0680: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65 o VDBE structure
0690: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 s..*/.void sqlit
06a0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20 e3VdbeSwap(Vdbe
06b0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a *pA, Vdbe *pB){.
06c0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d Vdbe tmp, *pTm
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b p;. char *zTmp;
06e0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 . tmp = *pA;.
06f0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 *pA = *pB;. *pB
0700: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d = tmp;. pTmp =
0710: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 pA->pNext;. pA
0720: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e ->pNext = pB->pN
0730: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 ext;. pB->pNext
0740: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 = pTmp;. pTmp
0750: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 = pA->pPrev;. p
0760: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 A->pPrev = pB->p
0770: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 Prev;. pB->pPre
0780: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 v = pTmp;. zTmp
0790: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 = pA->zSql;. p
07a0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 A->zSql = pB->zS
07b0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d ql;. pB->zSql =
07c0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 zTmp;. pB->isP
07d0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 repareV2 = pA->i
07e0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f sPrepareV2;.}../
07f0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 *.** Resize the
0800: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 Vdbe.aOp array s
0810: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 o that it is at
0820: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e least nOp elemen
0830: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 ts larger .** th
0840: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 an its current s
0850: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 ize. nOp is guar
0860: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 anteed to be les
0870: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a s than or equal.
0880: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f ** to 1024/sizeo
0890: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 f(Op)..**.** If
08a0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 an out-of-memory
08b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 error occurs wh
08c0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 ile resizing the
08d0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a array, return.*
08e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 * SQLITE_NOMEM.
08f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62 In this case Vdb
0900: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e e.aOp and Parse.
0910: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 nOpAlloc remain
0920: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 .** unchanged (t
0930: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 his is so that a
0940: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 ny opcodes alrea
0950: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e dy allocated can
0960: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c be .** correctl
0970: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c y deallocated al
0980: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 ong with the res
0990: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a t of the Vdbe)..
09a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 */.static int gr
09b0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a owOpArray(Vdbe *
09c0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 v, int nOp){. V
09d0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 dbeOp *pNew;. P
09e0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 arse *p = v->pPa
09f0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 rse;.. /* The S
0a00: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c QLITE_TEST_REALL
0a10: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c OC_STRESS compil
0a20: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 e-time option is
0a30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 designed to for
0a40: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 ce. ** more fre
0a50: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 quent reallocs a
0a60: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 nd hence provide
0a70: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 more opportunit
0a80: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 ies for . ** si
0a90: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c mulated OOM faul
0aa0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 ts. SQLITE_TEST
0ab0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 _REALLOC_STRESS
0ac0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 is generally use
0ad0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 d. ** during te
0ae0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 sting only. Wit
0af0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 h SQLITE_TEST_RE
0b00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f ALLOC_STRESS gro
0b10: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 w the op array.
0b20: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d ** by the minim
0b30: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 um* amount requi
0b40: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 red until the si
0b50: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 ze reaches 512.
0b60: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 Normal. ** ope
0b70: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 ration (without
0b80: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c SQLITE_TEST_REAL
0b90: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 LOC_STRESS) is t
0ba0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 o double the cur
0bb0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f rent. ** size o
0bc0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f f the op array o
0bd0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 r add 1KB of spa
0be0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 ce, whichever is
0bf0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 smaller. */.#if
0c00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f def SQLITE_TEST_
0c10: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 REALLOC_STRESS.
0c20: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e int nNew = (p->
0c30: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 nOpAlloc>=512 ?
0c40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 p->nOpAlloc*2 :
0c50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 p->nOpAlloc+nOp)
0c60: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e ;.#else. int nN
0c70: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f ew = (p->nOpAllo
0c80: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a c ? p->nOpAlloc*
0c90: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 2 : (int)(1024/s
0ca0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 izeof(Op)));. U
0cb0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
0cc0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 nOp);.#endif..
0cd0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 assert( nOp<=(10
0ce0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 24/sizeof(Op)) )
0cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 ;. assert( nNew
0d00: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e >=(p->nOpAlloc+n
0d10: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 Op) );. pNew =
0d20: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 sqlite3DbRealloc
0d30: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 (p->db, v->aOp,
0d40: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 nNew*sizeof(Op))
0d50: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a ;. if( pNew ){.
0d60: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 p->nOpAlloc
0d70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f = sqlite3DbMallo
0d80: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 cSize(p->db, pNe
0d90: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 w)/sizeof(Op);.
0da0: 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 v->aOp = pNew
0db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 ;. }. return (
0dc0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b pNew ? SQLITE_OK
0dd0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 : SQLITE_NOMEM)
0de0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 ;.}..#ifdef SQLI
0df0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 TE_DEBUG./* This
0e00: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 routine is just
0e10: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c a convenient pl
0e20: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 ace to set a bre
0e30: 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c akpoint that wil
0e40: 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 l.** fire after
0e50: 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 each opcode is i
0e60: 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 nserted and disp
0e70: 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 layed using.** "
0e80: 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f PRAGMA vdbe_addo
0e90: 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 ptrace=on"..*/.s
0ea0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f tatic void test_
0eb0: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 addop_breakpoint
0ec0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 (void){. static
0ed0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b int n = 0;. n+
0ee0: 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a +;.}.#endif../*.
0ef0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 ** Add a new ins
0f00: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 truction to the
0f10: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 list of instruct
0f20: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 ions current in
0f30: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 the.** VDBE. Re
0f40: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 turn the address
0f50: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 of the new inst
0f60: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 ruction..**.** P
0f70: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a arameters:.**.**
0f80: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 p
0f90: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 Pointer to t
0fa0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 he VDBE.**.**
0fb0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 op
0fc0: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 The opcode for
0fd0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e this instruction
0fe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 .**.** p1, p2
0ff0: 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e , p3 Operan
1000: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 ds.**.** Use the
1010: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f sqlite3VdbeReso
1020: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 lveLabel() funct
1030: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 ion to fix an ad
1040: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 dress and.** the
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
1060: 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 geP4() function
1070: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 to change the va
1080: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a lue of the P4.**
1090: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 operand..*/.int
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
10b0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 p3(Vdbe *p, int
10c0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 op, int p1, int
10d0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 p2, int p3){. i
10e0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a nt i;. VdbeOp *
10f0: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e pOp;.. i = p->n
1100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d Op;. assert( p-
1110: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
1120: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 IC_INIT );. ass
1130: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c ert( op>0 && op<
1140: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 0xff );. if( p-
1150: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f >pParse->nOpAllo
1160: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 c<=i ){. if(
1170: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 growOpArray(p, 1
1180: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 ) ){. retur
1190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 n 1;. }. }.
11a0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 p->nOp++;. pOp
11b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 = &p->aOp[i];.
11c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 pOp->opcode = (
11d0: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 u8)op;. pOp->p5
11e0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 = 0;. pOp->p1
11f0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 = p1;. pOp->p2
1200: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 = p2;. pOp->p3
1210: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e = p3;. pOp->p4.
1220: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 p = 0;. pOp->p4
1230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 type = P4_NOTUSE
1240: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 D;.#ifdef SQLITE
1250: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
1260: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e COMMENTS. pOp->
1270: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 zComment = 0;.#e
1280: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 ndif.#ifdef SQLI
1290: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 TE_DEBUG. if( p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 ->db->flags & SQ
12b0: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 LITE_VdbeAddopTr
12c0: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a ace ){. int j
12d0: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 j, kk;. Parse
12e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 *pParse = p->pP
12f0: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a arse;. for(jj
1300: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 =kk=0; jj<SQLITE
1310: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b _N_COLCACHE; jj+
1320: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 +){. struct
1330: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 yColCache *x =
1340: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 pParse->aColCach
1350: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66 e + jj;. if
1360: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 ( x->iLevel>pPar
1370: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 se->iCacheLevel
1380: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20 || x->iReg==0 )
1390: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 continue;.
13a0: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b printf(" r[%d]={
13b0: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 %d:%d}", x->iReg
13c0: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e , x->iTable, x->
13d0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 iColumn);.
13e0: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 kk++;. }.
13f0: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 if( kk ) printf(
1400: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 "\n");. sqlit
1410: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c e3VdbePrintOp(0,
1420: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b i, &p->aOp[i]);
1430: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f . test_addop_
1440: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 breakpoint();.
1450: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 }.#endif.#ifdef
1460: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 VDBE_PROFILE. p
1470: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a Op->cycles = 0;.
1480: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a pOp->cnt = 0;.
1490: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 #endif.#ifdef SQ
14a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 LITE_VDBE_COVERA
14b0: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 GE. pOp->iSrcLi
14c0: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 ne = 0;.#endif.
14d0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 return i;.}.int
14e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
14f0: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 p0(Vdbe *p, int
1500: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 op){. return sq
1510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 lite3VdbeAddOp3(
1520: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b p, op, 0, 0, 0);
1530: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 .}.int sqlite3Vd
1540: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 beAddOp1(Vdbe *p
1550: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 , int op, int p1
1560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 ){. return sqli
1570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c te3VdbeAddOp3(p,
1580: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a op, p1, 0, 0);.
1590: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 }.int sqlite3Vdb
15a0: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c eAddOp2(Vdbe *p,
15b0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c int op, int p1,
15c0: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 int p2){. retu
15d0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 rn sqlite3VdbeAd
15e0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 dOp3(p, op, p1,
15f0: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a p2, 0);.}.../*.*
1600: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 * Add an opcode
1610: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 that includes th
1620: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 e p4 value as a
1630: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 pointer..*/.int
1640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
1650: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 4(. Vdbe *p,
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 /* Add
1670: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 the opcode to th
1680: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f is VM */. int o
1690: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f p, /
16a0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 * The new opcode
16b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 */. int p1,
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
16d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 P1 operand */.
16e0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 int p2,
16f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f /* The P2 o
1700: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 perand */. int
1710: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 p3,
1720: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e /* The P3 operan
1730: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 d */. const cha
1740: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 r *zP4, /* Th
1750: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a e P4 operand */.
1760: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 int p4type
1770: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 /* P4 oper
1780: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 and type */.){.
1790: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 int addr = sqli
17a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c te3VdbeAddOp3(p,
17b0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 op, p1, p2, p3)
17c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 ;. sqlite3VdbeC
17d0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c hangeP4(p, addr,
17e0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 zP4, p4type);.
17f0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a return addr;.}.
1800: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 ./*.** Add an OP
1810: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 _ParseSchema opc
1820: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 ode. This routi
1830: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 ne is broken out
1840: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 from.** sqlite3
1850: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e VdbeAddOp4() sin
1860: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 ce it needs to a
1870: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 lso needs to mar
1880: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 k all btrees.**
1890: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 as having been u
18a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a sed..**.** The z
18b0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 Where string mus
18c0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 t have been obta
18d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 ined from sqlite
18e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 3_malloc()..** T
18f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c his routine will
1900: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 take ownership
1910: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 of the allocated
1920: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 memory..*/.void
1930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 sqlite3VdbeAddP
1940: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 arseSchemaOp(Vdb
1950: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 e *p, int iDb, c
1960: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 har *zWhere){.
1970: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 int j;. int add
1980: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 r = sqlite3VdbeA
1990: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 ddOp3(p, OP_Pars
19a0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c eSchema, iDb, 0,
19b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 0);. sqlite3Vd
19c0: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 beChangeP4(p, ad
19d0: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 dr, zWhere, P4_D
19e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a YNAMIC);. for(j
19f0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 =0; j<p->db->nDb
1a00: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 ; j++) sqlite3Vd
1a10: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a beUsesBtree(p, j
1a20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 );.}../*.** Add
1a30: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 an opcode that i
1a40: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 ncludes the p4 v
1a50: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 alue as an integ
1a60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 er..*/.int sqlit
1a70: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 e3VdbeAddOp4Int(
1a80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 . Vdbe *p,
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 /* Add th
1aa0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 e opcode to this
1ab0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c VM */. int op,
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ad0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a The new opcode *
1ae0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 /. int p1,
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 /* The P
1b00: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 1 operand */. i
1b10: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 nt p2,
1b20: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 /* The P2 ope
1b30: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 rand */. int p3
1b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a , /*
1b50: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 The P3 operand
1b60: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 */. int p4
1b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
1b80: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e P4 operand as an
1b90: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 integer */.){.
1ba0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 int addr = sqli
1bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c te3VdbeAddOp3(p,
1bc0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 op, p1, p2, p3)
1bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 ;. sqlite3VdbeC
1be0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c hangeP4(p, addr,
1bf0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 SQLITE_INT_TO_P
1c00: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 TR(p4), P4_INT32
1c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 );. return addr
1c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 ;.}../*.** Creat
1c30: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 e a new symbolic
1c40: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e label for an in
1c50: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 struction that h
1c60: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 as yet to be.**
1c70: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 coded. The symb
1c80: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 olic label is re
1c90: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 ally just a nega
1ca0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 tive number. Th
1cb0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 e.** label can b
1cc0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 e used as the P2
1cd0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 value of an ope
1ce0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 ration. Later,
1cf0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 when.** the labe
1d00: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f l is resolved to
1d10: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 a specific addr
1d20: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 ess, the VDBE wi
1d30: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 ll scan.** throu
1d40: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e gh its operation
1d50: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 list and change
1d60: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 all values of P
1d70: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 2 which match.**
1d80: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 the label into
1d90: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 the resolved add
1da0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ress..**.** The
1db0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 VDBE knows that
1dc0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 a P2 value is a
1dd0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 label because la
1de0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 bels are.** alwa
1df0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 ys negative and
1e00: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 P2 values are su
1e10: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d ppose to be non-
1e20: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e negative..** Hen
1e30: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 ce, a negative P
1e40: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 2 value is a lab
1e50: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 el that has yet
1e60: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a to be resolved..
1e70: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 **.** Zero is re
1e80: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c turned if a mall
1e90: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 oc() fails..*/.i
1ea0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 nt sqlite3VdbeMa
1eb0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29 keLabel(Vdbe *v)
1ec0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 {. Parse *p = v
1ed0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 ->pParse;. int
1ee0: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b i = p->nLabel++;
1ef0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 . assert( v->ma
1f00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
1f10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69 INIT );. if( (i
1f20: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a & (i-1))==0 ){.
1f30: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 p->aLabel =
1f40: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 sqlite3DbRealloc
1f50: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d OrFree(p->db, p-
1f60: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 >aLabel, .
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f90: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 (i*2+1)*sizeof(
1fa0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a p->aLabel[0]));.
1fb0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 }. if( p->aLa
1fc0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c bel ){. p->aL
1fd0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 abel[i] = -1;.
1fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b }. return -1-i;
1ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 .}../*.** Resolv
2000: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 e label "x" to b
2010: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 e the address of
2020: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 the next instru
2030: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 ction to.** be i
2040: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 nserted. The pa
2050: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 rameter "x" must
2060: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 have been obtai
2070: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 ned from.** a pr
2080: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 ior call to sqli
2090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c te3VdbeMakeLabel
20a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ()..*/.void sqli
20b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 te3VdbeResolveLa
20c0: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 bel(Vdbe *v, int
20d0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 x){. Parse *p
20e0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 = v->pParse;. i
20f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 nt j = -1-x;. a
2100: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d ssert( v->magic=
2110: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 =VDBE_MAGIC_INIT
2120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c );. assert( j<
2130: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 p->nLabel );. i
2140: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20 f( ALWAYS(j>=0)
2150: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a && p->aLabel ){.
2160: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d p->aLabel[j]
2170: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 = v->nOp;. }.
2180: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76 p->iFixedOp = v
2190: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a ->nOp - 1;.}../*
21a0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 .** Mark the VDB
21b0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 E as one that ca
21c0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e n only be run on
21d0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 e time..*/.void
21e0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e sqlite3VdbeRunOn
21f0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b lyOnce(Vdbe *p){
2200: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 . p->runOnlyOnc
2210: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 e = 1;.}..#ifdef
2220: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a SQLITE_DEBUG /*
2230: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 sqlite3AssertMa
2240: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a yAbort() logic *
2250: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c /../*.** The fol
2260: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 lowing type and
2270: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 function are use
2280: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 d to iterate thr
2290: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 ough all opcodes
22a0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 .** in a Vdbe ma
22b0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 in program and e
22c0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 ach of the sub-p
22d0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 rograms (trigger
22e0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e s) it may .** in
22f0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 voke directly or
2300: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 indirectly. It
2310: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 should be used a
2320: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a s follows:.**.**
2330: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 Op *pOp;.**
2340: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 VdbeOpIter sIte
2350: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 r;.**.** memse
2360: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a t(&sIter, 0, siz
2370: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 eof(sIter));.**
2380: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 sIter.v = v;
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 // v i
23b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 s of type Vdbe*
23c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f .** while( (pO
23d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 p = opIterNext(&
23e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 sIter)) ){.**
23f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e // Do somethin
2400: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 g with pOp.**
2410: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 }.** sqlite3Db
2420: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 Free(v->db, sIte
2430: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f r.apSub);.** .*/
2440: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
2450: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f VdbeOpIter VdbeO
2460: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 pIter;.struct Vd
2470: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 beOpIter {. Vdb
2480: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 e *v;
2490: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 /* Vdbe
24a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 to iterate throu
24b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f gh the opcodes o
24c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 f */. SubProgra
24d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 m **apSub;
24e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 /* Array of su
24f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 bprograms */. i
2500: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 nt nSub;
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
2520: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 ber of entries i
2530: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 n apSub */. int
2540: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 iAddr;
2550: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 /* Addre
2560: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 ss of next instr
2570: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e uction to return
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 */. int iSub;
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f /* 0 = main pro
25b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 gram, 1 = first
25c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e sub-program etc.
25d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 */.};.static Op
25e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 *opIterNext(Vdb
25f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 eOpIter *p){. V
2600: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 dbe *v = p->v;.
2610: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 Op *pRet = 0;.
2620: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 Op *aOp;. int
2630: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 nOp;.. if( p->i
2640: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a Sub<=p->nSub ){.
2650: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 . if( p->iSub
2660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 ==0 ){. aOp
2670: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 = v->aOp;.
2680: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 nOp = v->nOp;.
2690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
26a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 aOp = p->apSub[p
26b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a ->iSub-1]->aOp;.
26c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 nOp = p->a
26d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d pSub[p->iSub-1]-
26e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 >nOp;. }.
26f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 assert( p->iAddr
2700: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 <nOp );.. pRe
2710: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 t = &aOp[p->iAdd
2720: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 r];. p->iAddr
2730: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 ++;. if( p->i
2740: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 Addr==nOp ){.
2750: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 p->iSub++;.
2760: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 p->iAddr = 0
2770: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 ;. }. . i
2780: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d f( pRet->p4type=
2790: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 =P4_SUBPROGRAM )
27a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 {. int nByt
27b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a e = (p->nSub+1)*
27c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 sizeof(SubProgra
27d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a m*);. int j
27e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b ;. for(j=0;
27f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 j<p->nSub; j++)
2800: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d {. if( p-
2810: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d >apSub[j]==pRet-
2820: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 >p4.pProgram ) b
2830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
2840: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 if( j==p->nS
2850: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d ub ){. p-
2860: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 >apSub = sqlite3
2870: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 DbReallocOrFree(
2880: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c v->db, p->apSub,
2890: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 nByte);.
28a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 if( !p->apSub )
28b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74 {. pRet
28c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 = 0;. }e
28d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 lse{. p
28e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b ->apSub[p->nSub+
28f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 +] = pRet->p4.pP
2900: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 rogram;.
2910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }. }.
2920: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 }.. return pR
2930: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 et;.}../*.** Che
2940: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 ck if the progra
2950: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 m stored in the
2960: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 VM associated wi
2970: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a th pParse may.**
2980: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 throw an ABORT
2990: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 exception (causi
29a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 ng the statement
29b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 , but not entire
29c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 transaction.**
29d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 to be rolled bac
29e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 k). This conditi
29f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 on is true if th
2a00: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f e main program o
2a10: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f r any.** sub-pro
2a20: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 grams contains a
2a30: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ny of the follow
2a40: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 ing:.**.** *
2a50: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d OP_Halt with P1=
2a60: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e SQLITE_CONSTRAIN
2a70: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 T and P2=OE_Abor
2a80: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 t..** * OP_Ha
2a90: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 ltIfNull with P1
2aa0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 =SQLITE_CONSTRAI
2ab0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f NT and P2=OE_Abo
2ac0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 rt..** * OP_D
2ad0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f estroy.** * O
2ae0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a P_VUpdate.** *
2af0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 OP_VRename.**
2b00: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 * OP_FkCounte
2b10: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d r with P2==0 (im
2b20: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 mediate foreign
2b30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a key constraint).
2b40: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b **.** Then check
2b50: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 that the value
2b60: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 of Parse.mayAbor
2b70: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a t is true if an.
2b80: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 ** ABORT may be
2b90: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 thrown, or false
2ba0: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 otherwise. Retu
2bb0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f rn true if it do
2bc0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 es.** match, or
2bd0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e false otherwise.
2be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 This function i
2bf0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 s intended to be
2c00: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 used as.** part
2c10: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 of an assert st
2c20: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 atement in the c
2c30: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 ompiler. Similar
2c40: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 to:.**.** ass
2c50: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 ert( sqlite3Vdbe
2c60: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 AssertMayAbort(p
2c70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 Parse->pVdbe, pP
2c80: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 arse->mayAbort)
2c90: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 );.*/.int sqlite
2ca0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 3VdbeAssertMayAb
2cb0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 ort(Vdbe *v, int
2cc0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e mayAbort){. in
2cd0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a t hasAbort = 0;.
2ce0: 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 int hasFkCount
2cf0: 65 72 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f er = 0;. Op *pO
2d00: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 p;. VdbeOpIter
2d10: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 sIter;. memset(
2d20: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f &sIter, 0, sizeo
2d30: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 f(sIter));. sIt
2d40: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 er.v = v;.. whi
2d50: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 le( (pOp = opIte
2d60: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d rNext(&sIter))!=
2d70: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 0 ){. int opc
2d80: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 ode = pOp->opcod
2d90: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 e;. if( opcod
2da0: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c e==OP_Destroy ||
2db0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 opcode==OP_VUpd
2dc0: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f ate || opcode==O
2dd0: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 P_VRename .
2de0: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f || ((opcode==OP_
2df0: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d Halt || opcode==
2e00: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a OP_HaltIfNull) .
2e10: 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e && ((pOp->
2e20: 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 p1&0xff)==SQLITE
2e30: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 _CONSTRAINT && p
2e40: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 Op->p2==OE_Abort
2e50: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 )). ){.
2e60: 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 hasAbort = 1;.
2e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
2e80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
2e90: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 OMIT_FOREIGN_KEY
2ea0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d . if( opcode=
2eb0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 =OP_FkCounter &&
2ec0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 pOp->p1==0 && p
2ed0: 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 Op->p2==1 ){.
2ee0: 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 hasFkCounter
2ef0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 = 1;. }.#endi
2f00: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 f. }. sqlite3D
2f10: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 bFree(v->db, sIt
2f20: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a er.apSub);.. /*
2f30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 Return true if
2f40: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f hasAbort==mayAbo
2f50: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c rt. Or if a mall
2f60: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 oc failure occur
2f70: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c red.. ** If mal
2f80: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e loc failed, then
2f90: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f the while() loo
2fa0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 p above may not
2fb0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 have iterated.
2fc0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f ** through all o
2fd0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 pcodes and hasAb
2fe0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 ort may be set i
2ff0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 ncorrectly. Retu
3000: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 rn. ** true for
3010: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 this case to pr
3020: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 event the assert
3030: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 () in the caller
3040: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f s frame. ** fro
3050: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 m failing. */.
3060: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d return ( v->db-
3070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c >mallocFailed ||
3080: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 hasAbort==mayAb
3090: 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e ort || hasFkCoun
30a0: 74 65 72 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 ter );.}.#endif
30b0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 /* SQLITE_DEBUG
30c0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 - the sqlite3Ass
30d0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 ertMayAbort() fu
30e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a nction */../*.**
30f0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 Loop through th
3100: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e e program lookin
3110: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 g for P2 values
3120: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 that are negativ
3130: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 e.** on jump ins
3140: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 tructions. Each
3150: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 such value is a
3160: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 label. Resolve
3170: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 the.** label by
3180: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 setting the P2
3190: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 value to its cor
31a0: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 rect non-zero va
31b0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 lue..**.** This
31c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
31d0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c d once after all
31e0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 opcodes have be
31f0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a en inserted..**.
3200: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 ** Variable *pMa
3210: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 xFuncArgs is set
3220: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 to the maximum
3230: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 value of any P2
3240: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 argument .** to
3250: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 an OP_Function,
3260: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 OP_AggStep or OP
3270: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e _VFilter opcode.
3280: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 This is used by
3290: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 .** sqlite3Vdbe
32a0: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 MakeReady() to s
32b0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 ize the Vdbe.apA
32c0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a rg[] array..**.*
32d0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 * The Op.opflags
32e0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e field is set on
32f0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f all opcodes..*/
3300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 .static void res
3310: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 olveP2Values(Vdb
3320: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 e *p, int *pMaxF
3330: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 uncArgs){. int
3340: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 i;. int nMaxArg
3350: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 s = *pMaxFuncArg
3360: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 s;. Op *pOp;.
3370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 Parse *pParse =
3380: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 p->pParse;. int
3390: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 *aLabel = pPars
33a0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e e->aLabel;. p->
33b0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 readOnly = 1;.
33c0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 p->bIsReader = 0
33d0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 ;. for(pOp=p->a
33e0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 Op, i=p->nOp-1;
33f0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b i>=0; i--, pOp++
3400: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 ){. u8 opcode
3410: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a = pOp->opcode;.
3420: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 . /* NOTE: Be
3430: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 sure to update
3440: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68 mkopcodeh.awk wh
3450: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d en adding or rem
3460: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73 oving. ** cas
3470: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 es from this swi
3480: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74 tch! */. swit
3490: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20 ch( opcode ){.
34a0: 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75 6e 63 case OP_Func
34b0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 tion:. case
34c0: 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 OP_AggStep: {.
34d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e if( pOp->
34e0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d p5>nMaxArgs ) nM
34f0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 axArgs = pOp->p5
3500: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
3510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 . }. c
3520: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 ase OP_Transacti
3530: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 on: {. if
3540: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 ( pOp->p2!=0 ) p
3550: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a ->readOnly = 0;.
3560: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 /* fall
3570: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a thru */. }.
3580: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 case OP_Au
3590: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 toCommit:.
35a0: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e case OP_Savepoin
35b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e t: {. p->
35c0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 bIsReader = 1;.
35d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
35e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 }.#ifndef SQ
35f0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 LITE_OMIT_WAL.
3600: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 case OP_Chec
3610: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 kpoint:.#endif.
3620: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 case OP_Vac
3630: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 uum:. case
3640: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 OP_JournalMode:
3650: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 {. p->rea
3660: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 dOnly = 0;.
3670: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 p->bIsReader
3680: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 = 1;. bre
3690: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e ak;. }.#ifn
36a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
36b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 VIRTUALTABLE.
36c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 case OP_VUpda
36d0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 te: {. if
36e0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 ( pOp->p2>nMaxAr
36f0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 gs ) nMaxArgs =
3700: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 pOp->p2;.
3710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
3720: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 case OP_VF
3730: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 ilter: {.
3740: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 int n;.
3750: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d assert( p->nOp -
3760: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 i >= 3 );.
3770: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d assert( pOp[-
3780: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 1].opcode==OP_In
3790: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 teger );.
37a0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b n = pOp[-1].p1;
37b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e . if( n>n
37c0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 MaxArgs ) nMaxAr
37d0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 gs = n;.
37e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 break;. }.#
37f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 endif. case
3800: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 OP_Next:.
3810: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 case OP_NextIfOp
3820: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f en:. case O
3830: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a P_SorterNext: {.
3840: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e pOp->p4.
3850: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 xAdvance = sqlit
3860: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 e3BtreeNext;.
3870: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 pOp->p4type
3880: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 = P4_ADVANCE;.
3890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
38a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
38b0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 OP_Prev:.
38c0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 case OP_PrevIfOp
38d0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f en: {. pO
38e0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d p->p4.xAdvance =
38f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 sqlite3BtreePre
3900: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 vious;. p
3910: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f Op->p4type = P4_
3920: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 ADVANCE;.
3930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
3940: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e }.. pOp->
3950: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 opflags = sqlite
3960: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 3OpcodeProperty[
3970: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 opcode];. if(
3980: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 (pOp->opflags &
3990: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 OPFLG_JUMP)!=0
39a0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a && pOp->p2<0 ){.
39b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 assert( -1
39c0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d -pOp->p2<pParse-
39d0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 >nLabel );.
39e0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 pOp->p2 = aLabe
39f0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 l[-1-pOp->p2];.
3a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 }. }. sqlit
3a10: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 e3DbFree(p->db,
3a20: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b pParse->aLabel);
3a30: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 . pParse->aLabe
3a40: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d l = 0;. pParse-
3a50: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a >nLabel = 0;. *
3a60: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e pMaxFuncArgs = n
3a70: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 MaxArgs;. asser
3a80: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 t( p->bIsReader!
3a90: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a =0 || DbMaskAllZ
3aa0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b ero(p->btreeMask
3ab0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 ) );.}../*.** Re
3ac0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 turn the address
3ad0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 of the next ins
3ae0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 truction to be i
3af0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 nserted..*/.int
3b00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 sqlite3VdbeCurre
3b10: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b ntAddr(Vdbe *p){
3b20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 . assert( p->ma
3b30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
3b40: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e INIT );. return
3b50: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a p->nOp;.}../*.*
3b60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
3b70: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 returns a pointe
3b80: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f r to the array o
3b90: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 f opcodes associ
3ba0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 ated with.** the
3bb0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 Vdbe passed as
3bc0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 the first argume
3bd0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 nt. It is the ca
3be0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 llers responsibi
3bf0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e lity.** to arran
3c00: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 ge for the retur
3c10: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 ned array to be
3c20: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 eventually freed
3c30: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 using the .** v
3c40: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 dbeFreeOpArray()
3c50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a function..**.**
3c60: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e Before returnin
3c70: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 g, *pnOp is set
3c80: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 to the number of
3c90: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 entries in the
3ca0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 returned.** arra
3cb0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 y. Also, *pnMaxA
3cc0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 rg is set to the
3cd0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 larger of its c
3ce0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 urrent value and
3cf0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 .** the number
3d00: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 of entries in th
3d10: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 e Vdbe.apArg[] a
3d20: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f rray required to
3d30: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a execute the .**
3d40: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 returned progra
3d50: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 m..*/.VdbeOp *sq
3d60: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 lite3VdbeTakeOpA
3d70: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e rray(Vdbe *p, in
3d80: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e t *pnOp, int *pn
3d90: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f MaxArg){. VdbeO
3da0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b p *aOp = p->aOp;
3db0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 . assert( aOp &
3dc0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 & !p->db->malloc
3dd0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 Failed );.. /*
3de0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 Check that sqlit
3df0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 e3VdbeUsesBtree(
3e00: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 ) was not called
3e10: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 on this VM */.
3e20: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 assert( DbMaskA
3e30: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d llZero(p->btreeM
3e40: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c ask) );.. resol
3e50: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e veP2Values(p, pn
3e60: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 MaxArg);. *pnOp
3e70: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e = p->nOp;. p->
3e80: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 aOp = 0;. retur
3e90: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 n aOp;.}../*.**
3ea0: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 Add a whole list
3eb0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 of operations t
3ec0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 o the operation
3ed0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 stack. Return t
3ee0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 he.** address of
3ef0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 the first opera
3f00: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 tion added..*/.i
3f10: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
3f20: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c dOpList(Vdbe *p,
3f30: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 int nOp, VdbeOp
3f40: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c List const *aOp,
3f50: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20 int iLineno){.
3f60: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 int addr;. ass
3f70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
3f80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 DBE_MAGIC_INIT )
3f90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b ;. if( p->nOp +
3fa0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65 nOp > p->pParse
3fb0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 ->nOpAlloc && gr
3fc0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 owOpArray(p, nOp
3fd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ) ){. return
3fe0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 0;. }. addr =
3ff0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c p->nOp;. if( AL
4000: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 WAYS(nOp>0) ){.
4010: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 int i;. Vd
4020: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a beOpList const *
4030: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 pIn = aOp;. f
4040: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 or(i=0; i<nOp; i
4050: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 ++, pIn++){.
4060: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e int p2 = pIn->
4070: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 p2;. VdbeOp
4080: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 *pOut = &p->aOp
4090: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 [i+addr];.
40a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 pOut->opcode = p
40b0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 In->opcode;.
40c0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e pOut->p1 = pIn
40d0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 ->p1;. if(
40e0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 p2<0 ){.
40f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f assert( sqlite3O
4100: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f pcodeProperty[pO
4110: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 ut->opcode] & OP
4120: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20 FLG_JUMP );.
4130: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 pOut->p2 = a
4140: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a ddr + ADDR(p2);.
4150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
4160: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 pOut->p2 =
4170: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 p2;. }.
4180: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e pOut->p3 = pIn
4190: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 ->p3;. pOut
41a0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f ->p4type = P4_NO
41b0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 TUSED;. pOu
41c0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 t->p4.p = 0;.
41d0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b pOut->p5 = 0;
41e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
41f0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f NABLE_EXPLAIN_CO
4200: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75 MMENTS. pOu
4210: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b t->zComment = 0;
4220: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 .#endif.#ifdef S
4230: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 QLITE_VDBE_COVER
4240: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e AGE. pOut->
4250: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 iSrcLine = iLine
4260: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 no+i;.#else.
4270: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b (void)iLineno;
4280: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 .#endif.#ifdef S
4290: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 QLITE_DEBUG.
42a0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 if( p->db->fla
42b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 gs & SQLITE_Vdbe
42c0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 AddopTrace ){.
42d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
42e0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 ePrintOp(0, i+ad
42f0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 dr, &p->aOp[i+ad
4300: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 dr]);. }.#e
4310: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 ndif. }. p
4320: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 ->nOp += nOp;.
4330: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b }. return addr;
4340: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 .}..#if defined(
4350: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 SQLITE_ENABLE_ST
4360: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f MT_SCANSTATUS)./
4370: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 *.** Add an entr
4380: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f y to the array o
4390: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 f counters manag
43a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 ed by sqlite3_st
43b0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e mt_scanstatus().
43c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
43d0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a VdbeScanStatus(.
43e0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 Vdbe *p,
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4400: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 /* VM to add s
4410: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a canstatus() to *
4420: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c /. int addrExpl
4430: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 ain,
4440: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f /* Address o
4450: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 f OP_Explain (or
4460: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 0) */. int add
4470: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 rLoop,
4480: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 /* Addr
4490: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e ess of loop coun
44a0: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 ter */ . int ad
44b0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 drVisit,
44c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 /* Add
44d0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 ress of rows vis
44e0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a ited counter */.
44f0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 LogEst nEst,
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4510: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e /* Estimated n
4520: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 umber of output
4530: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 rows */. const
4540: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 char *zName
4550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
4560: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e e of table or in
4570: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 dex being scanne
4580: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 d */.){. int nB
4590: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b yte = (p->nScan+
45a0: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e 1) * sizeof(Scan
45b0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53 Status);. ScanS
45c0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61 tatus *aNew;. a
45d0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75 New = (ScanStatu
45e0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c s*)sqlite3DbReal
45f0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 loc(p->db, p->aS
4600: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 can, nByte);. i
4610: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53 f( aNew ){. S
4620: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20 canStatus *pNew
4630: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e = &aNew[p->nScan
4640: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 ++];. pNew->a
4650: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64 ddrExplain = add
4660: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e rExplain;. pN
4670: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61 ew->addrLoop = a
4680: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 ddrLoop;. pNe
4690: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61 w->addrVisit = a
46a0: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e ddrVisit;. pN
46b0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b ew->nEst = nEst;
46c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 . pNew->zName
46d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 = sqlite3DbStrD
46e0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 up(p->db, zName)
46f0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d ;. p->aScan =
4700: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e aNew;. }.}.#en
4710: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e dif.../*.** Chan
4720: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 ge the value of
4730: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 the P1 operand f
4740: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e or a specific in
4750: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 struction..** Th
4760: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 is routine is us
4770: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 eful when a larg
4780: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 e program is loa
4790: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 ded from a.** st
47a0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 atic array using
47b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
47c0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e pList but we wan
47d0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 t to make a.** f
47e0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 ew minor changes
47f0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e to the program.
4800: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
4810: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 VdbeChangeP1(Vdb
4820: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 e *p, u32 addr,
4830: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 int val){. asse
4840: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 rt( p!=0 );. if
4850: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e ( ((u32)p->nOp)>
4860: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 addr ){. p->a
4870: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 Op[addr].p1 = va
4880: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 l;. }.}../*.**
4890: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 Change the value
48a0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 of the P2 opera
48b0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 nd for a specifi
48c0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a c instruction..*
48d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
48e0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 s useful for set
48f0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 ting a jump dest
4900: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 ination..*/.void
4910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
4920: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33 geP2(Vdbe *p, u3
4930: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 2 addr, int val)
4940: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 {. assert( p!=0
4950: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 );. if( ((u32)
4960: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a p->nOp)>addr ){.
4970: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d p->aOp[addr]
4980: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d .p2 = val;. }.}
4990: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 ../*.** Change t
49a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 he value of the
49b0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 P3 operand for a
49c0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 specific instru
49d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ction..*/.void s
49e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
49f0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 P3(Vdbe *p, u32
4a00: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a addr, int val){.
4a10: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 assert( p!=0 )
4a20: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d ;. if( ((u32)p-
4a30: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 >nOp)>addr ){.
4a40: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 p->aOp[addr].p
4a50: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 3 = val;. }.}..
4a60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 /*.** Change the
4a70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 value of the P5
4a80: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 operand for the
4a90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a most recently.*
4aa0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f * added operatio
4ab0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 n..*/.void sqlit
4ac0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 e3VdbeChangeP5(V
4ad0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b dbe *p, u8 val){
4ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 . assert( p!=0
4af0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 );. if( p->aOp
4b00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 ){. assert( p
4b10: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 ->nOp>0 );. p
4b20: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e ->aOp[p->nOp-1].
4b30: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a p5 = val;. }.}.
4b40: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 ./*.** Change th
4b50: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 e P2 operand of
4b60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 instruction addr
4b70: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e so that it poin
4b80: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 ts to.** the add
4b90: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 ress of the next
4ba0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 instruction to
4bb0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 be coded..*/.voi
4bc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d d sqlite3VdbeJum
4bd0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 pHere(Vdbe *p, i
4be0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 nt addr){. sqli
4bf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 te3VdbeChangeP2(
4c00: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 p, addr, p->nOp)
4c10: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69 ;. p->pParse->i
4c20: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 FixedOp = p->nOp
4c30: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 - 1;.}.../*.**
4c40: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e If the input Fun
4c50: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 cDef structure i
4c60: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 s ephemeral, the
4c70: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a n free it. If.*
4c80: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 * the FuncDef is
4c90: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 not ephermal, t
4ca0: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a hen do nothing..
4cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 */.static void f
4cc0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 reeEphemeralFunc
4cd0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 tion(sqlite3 *db
4ce0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 , FuncDef *pDef)
4cf0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 {. if( ALWAYS(p
4d00: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 Def) && (pDef->f
4d10: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 uncFlags & SQLIT
4d20: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 E_FUNC_EPHEM)!=0
4d30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 ){. sqlite3D
4d40: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b bFree(db, pDef);
4d50: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 . }.}..static v
4d60: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 oid vdbeFreeOpAr
4d70: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f ray(sqlite3 *, O
4d80: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a p *, int);../*.*
4d90: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 * Delete a P4 va
4da0: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 lue if necessary
4db0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
4dc0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 freeP4(sqlite3
4dd0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c *db, int p4type,
4de0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 void *p4){. if
4df0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 ( p4 ){. asse
4e00: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 rt( db );. sw
4e10: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a itch( p4type ){.
4e20: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 case P4_RE
4e30: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 AL:. case P
4e40: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 4_INT64:. c
4e50: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a ase P4_DYNAMIC:.
4e60: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e case P4_IN
4e70: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 TARRAY: {.
4e80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
4e90: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 db, p4);.
4ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
4eb0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 case P4_KE
4ec0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20 YINFO: {.
4ed0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 if( db->pnBytes
4ee0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 Freed==0 ) sqlit
4ef0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 e3KeyInfoUnref((
4f00: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 KeyInfo*)p4);.
4f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
4f20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 }. case
4f30: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 P4_MPRINTF: {.
4f40: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e if( db->pn
4f50: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 BytesFreed==0 )
4f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 sqlite3_free(p4)
4f70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
4f80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 . }. c
4f90: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 ase P4_FUNCDEF:
4fa0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 {. freeEp
4fb0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 hemeralFunction(
4fc0: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 db, (FuncDef*)p4
4fd0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b );. break
4fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
4ff0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 case P4_MEM: {.
5000: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 if( db->p
5010: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 nBytesFreed==0 )
5020: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 {. sqli
5030: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 te3ValueFree((sq
5040: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 lite3_value*)p4)
5050: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
5060: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a . Mem *
5070: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 p = (Mem*)p4;.
5080: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 if( p->s
5090: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 zMalloc ) sqlite
50a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 3DbFree(db, p->z
50b0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 Malloc);.
50c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
50d0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 (db, p);.
50e0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b }. break
50f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
5100: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b case P4_VTAB : {
5110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d . if( db-
5120: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 >pnBytesFreed==0
5130: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e ) sqlite3VtabUn
5140: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 lock((VTable *)p
5150: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 4);. brea
5160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d k;. }. }
5170: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 . }.}../*.** Fr
5180: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c ee the space all
5190: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 ocated for aOp a
51a0: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 nd any p4 values
51b0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 allocated for t
51c0: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f he.** opcodes co
51d0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 ntained within.
51e0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 If aOp is not NU
51f0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 LL it is assumed
5200: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 to contain .**
5210: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f nOp entries. .*/
5220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 .static void vdb
5230: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c eFreeOpArray(sql
5240: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f ite3 *db, Op *aO
5250: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 p, int nOp){. i
5260: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 f( aOp ){. Op
5270: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 *pOp;. for(p
5280: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 Op=aOp; pOp<&aOp
5290: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 [nOp]; pOp++){.
52a0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 freeP4(db,
52b0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 pOp->p4type, pOp
52c0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 ->p4.p);.#ifdef
52d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 SQLITE_ENABLE_EX
52e0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 PLAIN_COMMENTS.
52f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
5300: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d ee(db, pOp->zCom
5310: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 ment);.#endif
5320: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 . }. }. s
5330: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
5340: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 aOp);.}../*.**
5350: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 Link the SubProg
5360: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 ram object passe
5370: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 d as the second
5380: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 argument into th
5390: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 e linked.** list
53a0: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f at Vdbe.pSubPro
53b0: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 gram. This list
53c0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 is used to delet
53d0: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 e all sub-progra
53e0: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 m.** objects whe
53f0: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c n the VM is no l
5400: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a onger required..
5410: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
5420: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 dbeLinkSubProgra
5430: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 m(Vdbe *pVdbe, S
5440: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 ubProgram *p){.
5450: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 p->pNext = pVdb
5460: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 e->pProgram;. p
5470: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d Vdbe->pProgram =
5480: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 p;.}../*.** Cha
5490: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 nge the opcode a
54a0: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e t addr into OP_N
54b0: 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 oop.*/.void sqli
54c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e te3VdbeChangeToN
54d0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 oop(Vdbe *p, int
54e0: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61 64 addr){. if( ad
54f0: 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 dr<p->nOp ){.
5500: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 VdbeOp *pOp = &
5510: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 p->aOp[addr];.
5520: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
5530: 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 p->db;. freeP
5540: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 4(db, pOp->p4typ
5550: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 e, pOp->p4.p);.
5560: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 memset(pOp, 0
5570: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 , sizeof(pOp[0])
5580: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f );. pOp->opco
5590: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 de = OP_Noop;.
55a0: 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e 6e if( addr==p->n
55b0: 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b Op-1 ) p->nOp--;
55c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 . }.}../*.** If
55d0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 the last opcode
55e0: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 is "op" and it
55f0: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 is not a jump de
5600: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 stination,.** th
5610: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 en remove it. R
5620: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e eturn true if an
5630: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 d only if an opc
5640: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e ode was removed.
5650: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
5660: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 dbeDeletePriorOp
5670: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 code(Vdbe *p, u8
5680: 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e op){. if( (p->
5690: 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73 nOp-1)>(p->pPars
56a0: 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20 e->iFixedOp) &&
56b0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d p->aOp[p->nOp-1]
56c0: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 .opcode==op ){.
56d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 sqlite3VdbeCh
56e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d angeToNoop(p, p-
56f0: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74 >nOp-1);. ret
5700: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a urn 1;. }else{.
5710: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
5720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 }.}../*.** Chang
5730: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 e the value of t
5740: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f he P4 operand fo
5750: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 r a specific ins
5760: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 truction..** Thi
5770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 s routine is use
5780: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 ful when a large
5790: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 program is load
57a0: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 ed from a.** sta
57b0: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 tic array using
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
57d0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 List but we want
57e0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 to make a.** fe
57f0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 w minor changes
5800: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a to the program..
5810: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 **.** If n>=0 th
5820: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e en the P4 operan
5830: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 d is dynamic, me
5840: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 aning that a cop
5850: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 y of.** the stri
5860: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 ng is made into
5870: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 memory obtained
5880: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c from sqlite3_mal
5890: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 loc()..** A valu
58a0: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 e of n==0 means
58b0: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 copy bytes of zP
58c0: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 4 up to and incl
58d0: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 uding the.** fir
58e0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 st null byte. I
58f0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 f n>0 then copy
5900: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 n+1 bytes of zP4
5910: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 ..** .** Other v
5920: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 alues of n (P4_S
5930: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 TATIC, P4_COLLSE
5940: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 Q etc.) indicate
5950: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 that zP4 points
5960: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 .** to a string
5970: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 or structure tha
5980: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 t is guaranteed
5990: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 to exist for the
59a0: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 lifetime of.**
59b0: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 the Vdbe. In the
59c0: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 se cases we can
59d0: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f just copy the po
59e0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 inter..**.** If
59f0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e addr<0 then chan
5a00: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 ge P4 on the mos
5a10: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 t recently inser
5a20: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e ted instruction.
5a30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
5a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 VdbeChangeP4(Vdb
5a50: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 e *p, int addr,
5a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c const char *zP4,
5a70: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 int n){. Op *p
5a80: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 Op;. sqlite3 *d
5a90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d b;. assert( p!=
5aa0: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 0 );. db = p->d
5ab0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e b;. assert( p->
5ac0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
5ad0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 C_INIT );. if(
5ae0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d p->aOp==0 || db-
5af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b >mallocFailed ){
5b00: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 . if( n!=P4_V
5b10: 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65 TAB ){. fre
5b20: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 eP4(db, n, (void
5b30: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 *)*(char**)&zP4)
5b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
5b50: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 rn;. }. assert
5b60: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 ( p->nOp>0 );.
5b70: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e assert( addr<p->
5b80: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 nOp );. if( add
5b90: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 r<0 ){. addr
5ba0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 = p->nOp - 1;.
5bb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f }. pOp = &p->aO
5bc0: 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 p[addr];. asser
5bd0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d t( pOp->p4type==
5be0: 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20 P4_NOTUSED.
5bf0: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 || pOp->p4type
5c00: 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20 ==P4_INT32.
5c10: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 || pOp->p4type
5c20: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a ==P4_KEYINFO );.
5c30: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 freeP4(db, pOp
5c40: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 ->p4type, pOp->p
5c50: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 4.p);. pOp->p4.
5c60: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d p = 0;. if( n==
5c70: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 P4_INT32 ){.
5c80: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 /* Note: this ca
5c90: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 st is safe, beca
5ca0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 use the origin d
5cb0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e ata point was an
5cc0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 int. ** that
5cd0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 was cast to a (
5ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a const char *). *
5cf0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 /. pOp->p4.i
5d00: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f = SQLITE_PTR_TO_
5d10: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f INT(zP4);. pO
5d20: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 p->p4type = P4_I
5d30: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 NT32;. }else if
5d40: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 ( zP4==0 ){.
5d50: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 pOp->p4.p = 0;.
5d60: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d pOp->p4type =
5d70: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d P4_NOTUSED;. }
5d80: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b else if( n==P4_K
5d90: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f EYINFO ){. pO
5da0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a p->p4.p = (void*
5db0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 )zP4;. pOp->p
5dc0: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 4type = P4_KEYIN
5dd0: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 FO;. }else if(
5de0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 n==P4_VTAB ){.
5df0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 pOp->p4.p = (v
5e00: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f oid*)zP4;. pO
5e10: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 p->p4type = P4_V
5e20: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 TAB;. sqlite3
5e30: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 VtabLock((VTable
5e40: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 *)zP4);. ass
5e50: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 ert( ((VTable *)
5e60: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 zP4)->db==p->db
5e70: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e );. }else if( n
5e80: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 <0 ){. pOp->p
5e90: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 4.p = (void*)zP4
5ea0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 ;. pOp->p4typ
5eb0: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 e = (signed char
5ec0: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 )n;. }else{.
5ed0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 if( n==0 ) n =
5ee0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
5ef0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 zP4);. pOp->p
5f00: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 4.z = sqlite3DbS
5f10: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 trNDup(p->db, zP
5f20: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 4, n);. pOp->
5f30: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 p4type = P4_DYNA
5f40: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a MIC;. }.}../*.*
5f50: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 * Set the P4 on
5f60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c the most recentl
5f70: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 y added opcode t
5f80: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f o the KeyInfo fo
5f90: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 r the.** index g
5fa0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 iven..*/.void sq
5fb0: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 lite3VdbeSetP4Ke
5fc0: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 yInfo(Parse *pPa
5fd0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 rse, Index *pIdx
5fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 ){. Vdbe *v = p
5ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 Parse->pVdbe;.
6000: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a assert( v!=0 );.
6010: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d assert( pIdx!=
6020: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 0 );. sqlite3Vd
6030: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 beChangeP4(v, -1
6040: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 , (char*)sqlite3
6050: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 KeyInfoOfIndex(p
6060: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 Parse, pIdx),.
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6080: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b P4_KEYINFO);
6090: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 .}..#ifdef SQLIT
60a0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e E_ENABLE_EXPLAIN
60b0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 _COMMENTS./*.**
60c0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 Change the comme
60d0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 nt on the most r
60e0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e ecently coded in
60f0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a struction. Or.*
6100: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 * insert a No-op
6110: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d and add the com
6120: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 ment to that new
6130: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 instruction. T
6140: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 his.** makes the
6150: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 code easier to
6160: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 read during debu
6170: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 gging. None of
6180: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 this happens.**
6190: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 in a production
61a0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 build..*/.static
61b0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 void vdbeVComme
61c0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 nt(Vdbe *p, cons
61d0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
61e0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 va_list ap){.
61f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 assert( p->nOp>0
6200: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b || p->aOp==0 );
6210: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f . assert( p->aO
6220: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 p==0 || p->aOp[p
6230: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e ->nOp-1].zCommen
6240: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d t==0 || p->db->m
6250: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
6260: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 if( p->nOp ){.
6270: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f assert( p->aO
6280: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 p );. sqlite3
6290: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d DbFree(p->db, p-
62a0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a >aOp[p->nOp-1].z
62b0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d Comment);. p-
62c0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a >aOp[p->nOp-1].z
62d0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 Comment = sqlite
62e0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 3VMPrintf(p->db,
62f0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 zFormat, ap);.
6300: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 }.}.void sqlite
6310: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 3VdbeComment(Vdb
6320: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 e *p, const char
6330: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
6340: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
6350: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 if( p ){. va
6360: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d _start(ap, zForm
6370: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f at);. vdbeVCo
6380: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 mment(p, zFormat
6390: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e , ap);. va_en
63a0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 d(ap);. }.}.voi
63b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f d sqlite3VdbeNoo
63c0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 pComment(Vdbe *p
63d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
63e0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 ormat, ...){. v
63f0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 a_list ap;. if(
6400: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 p ){. sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 3VdbeAddOp0(p, O
6420: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f P_Noop);. va_
6430: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
6440: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d t);. vdbeVCom
6450: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c ment(p, zFormat,
6460: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 ap);. va_end
6470: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 (ap);. }.}.#end
6480: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f if /* NDEBUG */
6490: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
64a0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a VDBE_COVERAGE./*
64b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 .** Set the valu
64c0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e e if the iSrcLin
64d0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 e field for the
64e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 previously coded
64f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f instruction..*/
6500: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
6510: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 eSetLineNumber(V
6520: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e dbe *v, int iLin
6530: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 e){. sqlite3Vdb
6540: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 eGetOp(v,-1)->iS
6550: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a rcLine = iLine;.
6560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 }.#endif /* SQLI
6570: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 TE_VDBE_COVERAGE
6580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 */../*.** Retur
6590: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 n the opcode for
65a0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 a given address
65b0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 . If the addres
65c0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a s is -1, then.**
65d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 return the most
65e0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 recently insert
65f0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a ed opcode..**.**
6600: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c If a memory all
6610: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 ocation error ha
6620: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 s occurred prior
6630: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 to the calling
6640: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 of this.** routi
6650: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 ne, then a point
6660: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 er to a dummy Vd
6670: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 beOp will be ret
6680: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 urned. That opc
6690: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 ode.** is readab
66a0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 le but not writa
66b0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 ble, though it i
66c0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 s cast to a writ
66d0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 able value..** T
66e0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 he return of a d
66f0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f ummy opcode allo
6700: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 ws the call to c
6710: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e ontinue function
6720: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 ing.** after an
6730: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 OOM fault withou
6740: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 t having to chec
6750: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 k to see if the
6760: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 return from .**
6770: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
6780: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e a valid pointer.
6790: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 But because th
67a0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 e dummy.opcode i
67b0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 s 0,.** dummy wi
67c0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 ll never be writ
67d0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 ten to. This is
67e0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 verified by cod
67f0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 e inspection and
6800: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 .** by running w
6810: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f ith Valgrind..*/
6820: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 .VdbeOp *sqlite3
6830: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a VdbeGetOp(Vdbe *
6840: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 p, int addr){.
6850: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 /* C89 specifies
6860: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 that the consta
6870: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 nt "dummy" will
6880: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 be initialized t
6890: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 o all. ** zeros
68a0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 , which is corre
68b0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 ct. MSVC genera
68c0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e tes a warning, n
68d0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a evertheless. */.
68e0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 static VdbeOp
68f0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 dummy; /* Ignor
6900: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 e the MSVC warni
6910: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 ng about no init
6920: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 ializer */. ass
6930: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
6940: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 DBE_MAGIC_INIT )
6950: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 ;. if( addr<0 )
6960: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e {. addr = p->
6970: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 nOp - 1;. }. a
6980: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 ssert( (addr>=0
6990: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 && addr<p->nOp)
69a0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 || p->db->malloc
69b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 Failed );. if(
69c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
69d0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 led ){. retur
69e0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d n (VdbeOp*)&dumm
69f0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 y;. }else{.
6a00: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 return &p->aOp[a
6a10: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 ddr];. }.}..#if
6a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
6a30: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 ENABLE_EXPLAIN_C
6a40: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 OMMENTS)./*.** R
6a50: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
6a60: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f value for one o
6a70: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 f the parameters
6a80: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 to the opcode p
6a90: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 Op.** determined
6aa0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e by character c.
6ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .*/.static int t
6ac0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 ranslateP(char c
6ad0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 , const Op *pOp)
6ae0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 {. if( c=='1' )
6af0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b return pOp->p1;
6b00: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 . if( c=='2' )
6b10: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a return pOp->p2;.
6b20: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 if( c=='3' ) r
6b30: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 eturn pOp->p3;.
6b40: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 if( c=='4' ) re
6b50: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a turn pOp->p4.i;.
6b60: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 return pOp->p5
6b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 ;.}../*.** Compu
6b80: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 te a string for
6b90: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 the "comment" fi
6ba0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 eld of a VDBE op
6bb0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a code listing..**
6bc0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 .** The Synopsis
6bd0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 : field in comme
6be0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e nts in the vdbe.
6bf0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 c source file ge
6c00: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 ts converted.**
6c10: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 to an extra stri
6c20: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e ng that is appen
6c30: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 ded to the sqlit
6c40: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 e3OpcodeName().
6c50: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e In the.** absen
6c60: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d ce of other comm
6c70: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 ents, this synop
6c80: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 sis becomes the
6c90: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f comment on the o
6ca0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 pcode..** Some t
6cb0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 ranslation occur
6cc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 s:.**.** "
6cd0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b PX" -> "r[
6ce0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 X]".** "PX
6cf0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e @PY" -> "r[X.
6d00: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b .X+Y-1]" or "r[
6d10: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 x]" if y is 0 or
6d20: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 1.** "PX@
6d30: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e PY+1" -> "r[X..
6d40: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 X+Y]" or "r[x
6d50: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 ]" if y is 0.**
6d60: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 "PY..PY"
6d70: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 -> "r[X..Y]"
6d80: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 or "r[x]" if
6d90: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 y<=x.*/.static i
6da0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e nt displayCommen
6db0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 t(. const Op *p
6dc0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f Op, /* The o
6dd0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d pcode to be comm
6de0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 ented */. const
6df0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a char *zP4, /*
6e00: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 Previously obta
6e10: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 ined value for P
6e20: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 4 */. char *zTe
6e30: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 mp, /* Wri
6e40: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a te result here *
6e50: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 /. int nTemp
6e60: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 /* Space
6e70: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 available in zTe
6e80: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e mp[] */.){. con
6e90: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 st char *zOpName
6ea0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ;. const char *
6eb0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 zSynopsis;. int
6ec0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 nOpName;. int
6ed0: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d ii, jj;. zOpNam
6ee0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 e = sqlite3Opcod
6ef0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 eName(pOp->opcod
6f00: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 e);. nOpName =
6f10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
6f20: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 zOpName);. if(
6f30: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b zOpName[nOpName+
6f40: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 1] ){. int se
6f50: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 enCom = 0;. c
6f60: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f har c;. zSyno
6f70: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b psis = zOpName +
6f80: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 = nOpName + 1;.
6f90: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 for(ii=jj=0;
6fa0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 jj<nTemp-1 && (c
6fb0: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d = zSynopsis[ii]
6fc0: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 )!=0; ii++){.
6fd0: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b if( c=='P' ){
6fe0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 . c = zSy
6ff0: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 nopsis[++ii];.
7000: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 if( c=='4'
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
7020: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
7030: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a Temp-jj, zTemp+j
7040: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 j, "%s", zP4);.
7050: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
7060: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 c=='X' ){.
7070: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
7080: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 rintf(nTemp-jj,
7090: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 zTemp+jj, "%s",
70a0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a pOp->zComment);.
70b0: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f seenCo
70c0: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d m = 1;. }
70d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 else{.
70e0: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 int v1 = transla
70f0: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 teP(c, pOp);.
7100: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 int v2;.
7110: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
7120: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d _snprintf(nTemp-
7130: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 jj, zTemp+jj, "%
7140: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 d", v1);.
7150: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a if( strncmp(z
7160: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 Synopsis+ii+1, "
7170: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 @P", 2)==0 ){.
7180: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 ii +=
7190: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 3;. j
71a0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c j += sqlite3Strl
71b0: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a en30(zTemp+jj);.
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d v2 =
71d0: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e translateP(zSyn
71e0: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b opsis[ii], pOp);
71f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 . if(
7200: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 strncmp(zSynops
7210: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d is+ii+1,"+1",2)=
7220: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
7230: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 ii += 2;.
7240: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b v2++;
7250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
7260: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 if( v
7270: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 2>1 ){.
7280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
7290: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 rintf(nTemp-jj,
72a0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 zTemp+jj, "..%d"
72b0: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 , v1+v2-1);.
72c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
72d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 }else if( st
72e0: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b rncmp(zSynopsis+
72f0: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 ii+1, "..P3", 4)
7300: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d ==0 && pOp->p3==
7310: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0 ){.
7320: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 ii += 4;.
7330: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a }. }.
7340: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 jj += sq
7350: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 lite3Strlen30(zT
7360: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d emp+jj);. }
7370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 else{. zT
7380: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 emp[jj++] = c;.
7390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
73a0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 if( !seenCom &&
73b0: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 jj<nTemp-5 && p
73c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a Op->zComment ){.
73d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
73e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c printf(nTemp-jj,
73f0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 zTemp+jj, "; %s
7400: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 ", pOp->zComment
7410: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 );. jj += s
7420: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
7430: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a Temp+jj);. }.
7440: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 if( jj<nTemp
7450: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 ) zTemp[jj] = 0
7460: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f ;. }else if( pO
7470: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 p->zComment ){.
7480: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
7490: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
74a0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f , "%s", pOp->zCo
74b0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d mment);. jj =
74c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
74d0: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 (zTemp);. }else
74e0: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d {. zTemp[0] =
74f0: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 0;. jj = 0;.
7500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b }. return jj;
7510: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c .}.#endif /* SQL
7520: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 ITE_DEBUG */...#
7530: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 if !defined(SQLI
7540: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 TE_OMIT_EXPLAIN)
7550: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 || !defined(NDE
7560: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 BUG) \. || d
7570: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 efined(VDBE_PROF
7580: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 ILE) || defined(
7590: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a SQLITE_DEBUG)./*
75a0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 .** Compute a st
75b0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 ring that descri
75c0: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d bes the P4 param
75d0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f eter for an opco
75e0: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 de..** Use zTemp
75f0: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 for any require
7600: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 d temporary buff
7610: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 er space..*/.sta
7620: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 tic char *displa
7630: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 yP4(Op *pOp, cha
7640: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 r *zTemp, int nT
7650: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 emp){. char *zP
7660: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 4 = zTemp;. ass
7670: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 ert( nTemp>=20 )
7680: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d ;. switch( pOp-
7690: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 >p4type ){. c
76a0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 ase P4_KEYINFO:
76b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a {. int i, j
76c0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 ;. KeyInfo
76d0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d *pKeyInfo = pOp-
76e0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 >p4.pKeyInfo;.
76f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 assert( pKey
7700: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 Info->aSortOrder
7710: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c !=0 );. sql
7720: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
7730: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 emp, zTemp, "k(%
7740: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 d", pKeyInfo->nF
7750: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d ield);. i =
7760: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
7770: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 (zTemp);. f
7780: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e or(j=0; j<pKeyIn
7790: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 fo->nField; j++)
77a0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 {. CollSe
77b0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 q *pColl = pKeyI
77c0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 nfo->aColl[j];.
77d0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 const cha
77e0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c r *zColl = pColl
77f0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 ? pColl->zName
7800: 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 : "nil";.
7810: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 int n = sqlite3
7820: 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b Strlen30(zColl);
7830: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d . if( n==
7840: 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6 && memcmp(zCol
7850: 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 l,"BINARY",6)==0
7860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 ){. zC
7870: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 oll = "B";.
7880: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 n = 1;.
7890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
78a0: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b ( i+n>nTemp-6 ){
78b0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 . memcp
78c0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e y(&zTemp[i],",..
78d0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 .",4);.
78e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
78f0: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b }. zTemp[
7900: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 i++] = ',';.
7910: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f if( pKeyInfo
7920: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 ->aSortOrder[j]
7930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 ){. zTe
7940: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 mp[i++] = '-';.
7950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
7960: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 memcpy(&zTemp[i
7970: 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a ], zColl, n+1);.
7980: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a i += n;.
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 }. zT
79a0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a emp[i++] = ')';.
79b0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d zTemp[i] =
79c0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 0;. assert
79d0: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 ( i<nTemp );.
79e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
79f0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c case P4_COLL
7a00: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c SEQ: {. Col
7a10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f lSeq *pColl = pO
7a20: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 p->p4.pColl;.
7a30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
7a40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
7a50: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f , "(%.20s)", pCo
7a60: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 ll->zName);.
7a70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
7a80: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 case P4_FUNCD
7a90: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 EF: {. Func
7aa0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d Def *pDef = pOp-
7ab0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 >p4.pFunc;.
7ac0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
7ad0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 f(nTemp, zTemp,
7ae0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e "%s(%d)", pDef->
7af0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 zName, pDef->nAr
7b00: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b g);. break;
7b10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
7b20: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 P4_INT64: {.
7b30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
7b40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
7b50: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 "%lld", *pOp->p
7b60: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 4.pI64);. b
7b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
7b80: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b case P4_INT32: {
7b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 . sqlite3_s
7ba0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
7bb0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d Temp, "%d", pOp-
7bc0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 >p4.i);. br
7bd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
7be0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 ase P4_REAL: {.
7bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
7c00: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 rintf(nTemp, zTe
7c10: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f mp, "%.16g", *pO
7c20: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 p->p4.pReal);.
7c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
7c40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d . case P4_MEM
7c50: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 : {. Mem *p
7c60: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d Mem = pOp->p4.pM
7c70: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d em;. if( pM
7c80: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f em->flags & MEM_
7c90: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a Str ){. z
7ca0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 P4 = pMem->z;.
7cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d }else if( pM
7cc0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f em->flags & MEM_
7cd0: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 Int ){. s
7ce0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
7cf0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 nTemp, zTemp, "%
7d00: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 lld", pMem->u.i)
7d10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 ;. }else if
7d20: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 ( pMem->flags &
7d30: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 MEM_Real ){.
7d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
7d50: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d intf(nTemp, zTem
7d60: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d p, "%.16g", pMem
7d70: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 ->u.r);. }e
7d80: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c lse if( pMem->fl
7d90: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 ags & MEM_Null )
7da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
7db0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 3_snprintf(nTemp
7dc0: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 , zTemp, "NULL")
7dd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
7de0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
7df0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
7e00: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 _Blob );.
7e10: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b zP4 = "(blob)";
7e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 . }. b
7e30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e reak;. }.#ifn
7e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
7e50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 VIRTUALTABLE.
7e60: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b case P4_VTAB: {
7e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 . sqlite3_v
7e80: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 tab *pVtab = pOp
7e90: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 ->p4.pVtab->pVta
7ea0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 b;. sqlite3
7eb0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c _snprintf(nTemp,
7ec0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 zTemp, "vtab:%p
7ed0: 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 ", pVtab);.
7ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 break;. }.#e
7ef0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 ndif. case P4
7f00: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 _INTARRAY: {.
7f10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
7f20: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
7f30: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 , "intarray");.
7f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
7f50: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 }. case P4_SU
7f60: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 BPROGRAM: {.
7f70: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
7f80: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
7f90: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 "program");.
7fa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
7fb0: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 case P4_ADVA
7fc0: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 NCE: {. zTe
7fd0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 mp[0] = 0;.
7fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
7ff0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 default: {.
8000: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 zP4 = pOp->p4
8010: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 .z;. if( zP
8020: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4==0 ){.
8030: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 zP4 = zTemp;.
8040: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 zTemp[0] =
8050: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0;. }. }
8060: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a . }. assert( z
8070: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 P4!=0 );. retur
8080: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a n zP4;.}.#endif.
8090: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 ./*.** Declare t
80a0: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 o the Vdbe that
80b0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 the BTree object
80c0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 at db->aDb[i] i
80d0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 s used..**.** Th
80e0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 e prepared state
80f0: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e ments need to kn
8100: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 ow in advance th
8110: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f e complete set o
8120: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 f.** attached da
8130: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c tabases that wil
8140: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 l be use. A mas
8150: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 k of these datab
8160: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 ases.** is maint
8170: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 ained in p->btre
8180: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c eMask. The p->l
8190: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 ockMask value is
81a0: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a the subset of.*
81b0: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f * p->btreeMask o
81c0: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 f databases that
81d0: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 will require a
81e0: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 lock..*/.void sq
81f0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 lite3VdbeUsesBtr
8200: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 ee(Vdbe *p, int
8210: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e i){. assert( i>
8220: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e =0 && i<p->db->n
8230: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a Db && i<(int)siz
8240: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 eof(yDbMask)*8 )
8250: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 ;. assert( i<(i
8260: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 nt)sizeof(p->btr
8270: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 eeMask)*8 );. D
8280: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 bMaskSet(p->btre
8290: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 eMask, i);. if(
82a0: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 i!=1 && sqlite3
82b0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d BtreeSharable(p-
82c0: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 >db->aDb[i].pBt)
82d0: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 ){. DbMaskSe
82e0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 t(p->lockMask, i
82f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 );. }.}..#if !d
8300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
8310: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 IT_SHARED_CACHE)
8320: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 && SQLITE_THREA
8330: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 DSAFE>0./*.** If
8340: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 SQLite is compi
8350: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 led to support s
8360: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 hared-cache mode
8370: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 and to be threa
8380: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 dsafe,.** this r
8390: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 outine obtains t
83a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 he mutex associa
83b0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 ted with each Bt
83c0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 Shared structure
83d0: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 .** that may be
83e0: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 accessed by the
83f0: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 VM passed as an
8400: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 argument. In doi
8410: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a ng so it also.**
8420: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 sets the BtShar
8430: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 ed.db member of
8440: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 each of the BtSh
8450: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c ared structures,
8460: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 ensuring.** tha
8470: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 t the correct bu
8480: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 sy-handler callb
8490: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 ack is invoked i
84a0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a f required..**.*
84b0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e * If SQLite is n
84c0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 ot threadsafe bu
84d0: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 t does support s
84e0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 hared-cache mode
84f0: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 , then.** sqlite
8500: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 3BtreeEnter() is
8510: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 invoked to set
8520: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 the BtShared.db
8530: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 variables.** of
8540: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 all of BtShared
8550: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 structures acces
8560: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 sible via the da
8570: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a tabase handle .*
8580: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 * associated wit
8590: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 h the VM..**.**
85a0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 If SQLite is not
85b0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 threadsafe and
85c0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 does not support
85d0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f shared-cache mo
85e0: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 de, this.** func
85f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e tion is a no-op.
8600: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 .**.** The p->bt
8610: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 reeMask field is
8620: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c a bitmask of al
8630: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 l btrees that th
8640: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 e prepared .** s
8650: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 tatement p will
8660: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e ever use. Let N
8670: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f be the number o
8680: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 f bits in p->btr
8690: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 eeMask.** corres
86a0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 ponding to btree
86b0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 s that use share
86c0: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 d cache. Then t
86d0: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a he runtime of.**
86e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 this routine is
86f0: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 N*N. But as N
8700: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 is rarely more t
8710: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 han 1, this shou
8720: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 ld not.** be a p
8730: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 roblem..*/.void
8740: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 sqlite3VdbeEnter
8750: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 (Vdbe *p){. int
8760: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 i;. sqlite3 *d
8770: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 b;. Db *aDb;.
8780: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 int nDb;. if( D
8790: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e bMaskAllZero(p->
87a0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 lockMask) ) retu
87b0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d rn; /* The comm
87c0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 on case */. db
87d0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d = p->db;. aDb =
87e0: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 db->aDb;. nDb
87f0: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 = db->nDb;. for
8800: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b (i=0; i<nDb; i++
8810: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 ){. if( i!=1
8820: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d && DbMaskTest(p-
8830: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 >lockMask,i) &&
8840: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 ALWAYS(aDb[i].pB
8850: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 t!=0) ){. s
8860: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
8870: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 (aDb[i].pBt);.
8880: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 }. }.}.#endif
8890: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 ..#if !defined(S
88a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 QLITE_OMIT_SHARE
88b0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 D_CACHE) && SQLI
88c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a TE_THREADSAFE>0.
88d0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c /*.** Unlock all
88e0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 of the btrees p
88f0: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 reviously locked
8900: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 by a call to sq
8910: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 lite3VdbeEnter()
8920: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
8930: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 3VdbeLeave(Vdbe
8940: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 *p){. int i;.
8950: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 sqlite3 *db;. D
8960: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 b *aDb;. int nD
8970: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 b;. if( DbMaskA
8980: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 llZero(p->lockMa
8990: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f sk) ) return; /
89a0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 * The common cas
89b0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 e */. db = p->d
89c0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 b;. aDb = db->a
89d0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e Db;. nDb = db->
89e0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 nDb;. for(i=0;
89f0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 i<nDb; i++){.
8a00: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d if( i!=1 && DbM
8a10: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d askTest(p->lockM
8a20: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 ask,i) && ALWAYS
8a30: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 (aDb[i].pBt!=0)
8a40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
8a50: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 BtreeLeave(aDb[i
8a60: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 ].pBt);. }.
8a70: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 }.}.#endif..#if
8a80: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f defined(VDBE_PRO
8a90: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 FILE) || defined
8aa0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f (SQLITE_DEBUG)./
8ab0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e *.** Print a sin
8ac0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 gle opcode. Thi
8ad0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 s routine is use
8ae0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 d for debugging
8af0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 only..*/.void sq
8b00: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 lite3VdbePrintOp
8b10: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 (FILE *pOut, int
8b20: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 pc, Op *pOp){.
8b30: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 char *zP4;. ch
8b40: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 ar zPtr[50];. c
8b50: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 har zCom[100];.
8b60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
8b70: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 ar *zFormat1 = "
8b80: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 %4d %-13s %4d %4
8b90: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 d %4d %-13s %.2X
8ba0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f %s\n";. if( pO
8bb0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 ut==0 ) pOut = s
8bc0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 tdout;. zP4 = d
8bd0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 isplayP4(pOp, zP
8be0: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 tr, sizeof(zPtr)
8bf0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
8c00: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
8c10: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c COMMENTS. displ
8c20: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a ayComment(pOp, z
8c30: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 P4, zCom, sizeof
8c40: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 (zCom));.#else.
8c50: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 zCom[0] = 0;.#e
8c60: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 ndif. /* NB: T
8c70: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 he sqlite3Opcode
8c80: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 Name() function
8c90: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 is implemented b
8ca0: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 y code created.
8cb0: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 ** by the mkopc
8cc0: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f odeh.awk and mko
8cd0: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 pcodec.awk scrip
8ce0: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 ts which extract
8cf0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d the. ** inform
8d00: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 ation from the v
8d10: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 dbe.c source tex
8d20: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 t */. fprintf(p
8d30: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 Out, zFormat1, p
8d40: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 c, . sqlite
8d50: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3OpcodeName(pOp-
8d60: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 >opcode), pOp->p
8d70: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 1, pOp->p2, pOp-
8d80: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 >p3, zP4, pOp->p
8d90: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 5,. zCom.
8da0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 );. fflush(pOut
8db0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a );.}.#endif../*.
8dc0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 ** Release an ar
8dd0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 ray of N Mem ele
8de0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 ments.*/.static
8df0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 void releaseMemA
8e00: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 rray(Mem *p, int
8e10: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 N){. if( p &&
8e20: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 N ){. Mem *pE
8e30: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 nd = &p[N];.
8e40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d sqlite3 *db = p-
8e50: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c >db;. u8 mall
8e60: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e oc_failed = db->
8e70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 mallocFailed;.
8e80: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 if( db->pnByte
8e90: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 sFreed ){.
8ea0: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 do{. if(
8eb0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 p->szMalloc ) sq
8ec0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
8ed0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 p->zMalloc);.
8ee0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 }while( (++p)
8ef0: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 <pEnd );. r
8f00: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 eturn;. }.
8f10: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 do{. asser
8f20: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 t( (&p[1])==pEnd
8f30: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 || p[0].db==p[1
8f40: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 ].db );. as
8f50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 sert( sqlite3Vdb
8f60: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 eCheckMemInvaria
8f70: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 nts(p) );..
8f80: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 /* This block i
8f90: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 s really an inli
8fa0: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 ned version of s
8fb0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
8fc0: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 ease(). **
8fd0: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e that takes advan
8fe0: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 tage of the fact
8ff0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 that the memory
9000: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a cell value is .
9010: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 ** being s
9020: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 et to NULL after
9030: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 releasing any d
9040: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 ynamic resources
9050: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 .. **.
9060: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 ** The justific
9070: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 ation for duplic
9080: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 ating code is th
9090: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 at according to
90a0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 . ** callgr
90b0: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 ind, this causes
90c0: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 a certain test
90d0: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 case to hit the
90e0: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a CPU 4.7 . *
90f0: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 * percent less (
9100: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 x86 linux, gcc v
9110: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f ersion 4.1.2, -O
9120: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 6) than if .
9130: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 ** sqlite3MemR
9140: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 elease() were ca
9150: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 lled from here.
9160: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a With -O2, this j
9170: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f umps. ** to
9180: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 6.6 percent. Th
9190: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 e test case is i
91a0: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f nserting 1000 ro
91b0: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 ws into a table
91c0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e . ** with n
91d0: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 o indexes using
91e0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 a single prepare
91f0: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 d INSERT stateme
9200: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 nt, bind() .
9210: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 ** and reset()
9220: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 . Inserts are gr
9230: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 ouped into a tra
9240: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 nsaction..
9250: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 */. testcas
9260: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 e( p->flags & ME
9270: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 M_Agg );. t
9280: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 estcase( p->flag
9290: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 s & MEM_Dyn );.
92a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 testcase( p
92b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 ->flags & MEM_Fr
92c0: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 ame );. tes
92d0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 tcase( p->flags
92e0: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a & MEM_RowSet );.
92f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 if( p->fla
9300: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f gs&(MEM_Agg|MEM_
9310: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 Dyn|MEM_Frame|ME
9320: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 M_RowSet) ){.
9330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 sqlite3Vdbe
9340: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 MemRelease(p);.
9350: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 }else if( p
9360: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 ->szMalloc ){.
9370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 sqlite3DbF
9380: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c ree(db, p->zMall
9390: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e oc);. p->
93a0: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 szMalloc = 0;.
93b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e }.. p->
93c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 flags = MEM_Unde
93d0: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c fined;. }whil
93e0: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b e( (++p)<pEnd );
93f0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 . db->mallocF
9400: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 ailed = malloc_f
9410: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a ailed;. }.}../*
9420: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 .** Delete a Vdb
9430: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e eFrame object an
9440: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 d its contents.
9450: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 VdbeFrame object
9460: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 s are.** allocat
9470: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f ed by the OP_Pro
9480: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 gram opcode in s
9490: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 qlite3VdbeExec()
94a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
94b0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 3VdbeFrameDelete
94c0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a (VdbeFrame *p){.
94d0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a int i;. Mem *
94e0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 aMem = VdbeFrame
94f0: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 Mem(p);. VdbeCu
9500: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 rsor **apCsr = (
9510: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 VdbeCursor **)&a
9520: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d Mem[p->nChildMem
9530: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c ];. for(i=0; i<
9540: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b p->nChildCsr; i+
9550: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 +){. sqlite3V
9560: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d dbeFreeCursor(p-
9570: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 >v, apCsr[i]);.
9580: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 }. releaseMemA
9590: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 rray(aMem, p->nC
95a0: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 hildMem);. sqli
95b0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e te3DbFree(p->v->
95c0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 db, p);.}..#ifnd
95d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 ef SQLITE_OMIT_E
95e0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 XPLAIN./*.** Giv
95f0: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 e a listing of t
9600: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 he program in th
9610: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e e virtual machin
9620: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 e..**.** The int
9630: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 erface is the sa
9640: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 me as sqlite3Vdb
9650: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e eExec(). But in
9660: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e stead of.** runn
9670: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 ing the code, it
9680: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c invokes the cal
9690: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 lback once for e
96a0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e ach instruction.
96b0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 .** This feature
96c0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c is used to impl
96d0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e ement "EXPLAIN".
96e0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 .**.** When p->e
96f0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 xplain==1, each
9700: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c instruction is l
9710: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 isted. When.**
9720: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f p->explain==2, o
9730: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 nly OP_Explain i
9740: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 nstructions are
9750: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 listed and these
9760: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e .** are shown in
9770: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 a different for
9780: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e mat. p->explain
9790: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 ==2 is used to i
97a0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c mplement.** EXPL
97b0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a AIN QUERY PLAN..
97c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 **.** When p->ex
97d0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 plain==1, first
97e0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d the main program
97f0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e is listed, then
9800: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 each of.** the
9810: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 trigger subprogr
9820: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f ams are listed o
9830: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e ne by one..*/.in
9840: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 t sqlite3VdbeLis
9850: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 t(. Vdbe *p
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
9870: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b * The VDBE */.){
9880: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 . int nRow;
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
98a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 /* Stop
98b0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 when row count r
98c0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 eaches this */.
98d0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 int nSub = 0;
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
98f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
9900: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 of sub-vdbes see
9910: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 n so far */. Su
9920: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 bProgram **apSub
9930: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
9940: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 /* Array of s
9950: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 ub-vdbes */. Me
9960: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 m *pSub = 0;
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9980: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c /* Memory cel
9990: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 l hold array of
99a0: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 subprogs */. sq
99b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
99c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
99d0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 /* The databa
99e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f se connection */
99f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 . int i;
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 /* Loop
9a20: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 counter */. int
9a30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9a50: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 /* Return code
9a60: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 */. Mem *pMem
9a70: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 = &p->aMem[1];
9a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
9a90: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c rst Mem of resul
9aa0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 t set */.. asse
9ab0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 rt( p->explain )
9ac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d ;. assert( p->m
9ad0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 agic==VDBE_MAGIC
9ae0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 _RUN );. assert
9af0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
9b00: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c OK || p->rc==SQL
9b10: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 ITE_BUSY || p->r
9b20: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 c==SQLITE_NOMEM
9b30: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 );.. /* Even th
9b40: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 ough this opcode
9b50: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 does not use dy
9b60: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f namic strings fo
9b70: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c r. ** the resul
9b80: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e t, result column
9b90: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e s may become dyn
9ba0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 amic if the user
9bb0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 calls. ** sqli
9bc0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 te3_column_text1
9bd0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 6(), causing a t
9be0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 ranslation to UT
9bf0: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 F-16 encoding..
9c00: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d */. releaseMem
9c10: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a Array(pMem, 8);.
9c20: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 p->pResultSet
9c30: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 = 0;.. if( p->r
9c40: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 c==SQLITE_NOMEM
9c50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 ){. /* This h
9c60: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c appens if a mall
9c70: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 oc() inside a ca
9c80: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f ll to sqlite3_co
9c90: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 lumn_text() or.
9ca0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f ** sqlite3_co
9cb0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 lumn_text16() fa
9cc0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 iled. */. db
9cd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
9ce0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 1;. return S
9cf0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d QLITE_ERROR;. }
9d00: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 .. /* When the
9d10: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 number of output
9d20: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 rows reaches nR
9d30: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 ow, that means t
9d40: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 he. ** listing
9d50: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 has finished and
9d60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 sqlite3_step()
9d70: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 should return SQ
9d80: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 LITE_DONE.. **
9d90: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 nRow is the sum
9da0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 of the number of
9db0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 rows in the mai
9dc0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a n program, plus.
9dd0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 ** the sum of
9de0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f the number of ro
9df0: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 ws in all trigge
9e00: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e r subprograms en
9e10: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 countered. ** s
9e20: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 o far. The nRow
9e30: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 value will incr
9e40: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 ease as new trig
9e50: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 ger subprograms
9e60: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 are. ** encount
9e70: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 ered, but p->pc
9e80: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 will eventually
9e90: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 catch up to nRow
9ea0: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 .. */. nRow =
9eb0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d p->nOp;. if( p-
9ec0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 >explain==1 ){.
9ed0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 /* The first
9ee0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 8 memory cells a
9ef0: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 re used for the
9f00: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 result set. So
9f10: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 we will. ** c
9f20: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 ommandeer the 9t
9f30: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 h cell to use as
9f40: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 storage for an
9f50: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 array of pointer
9f60: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 s. ** to trig
9f70: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e ger subprograms.
9f80: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 The VDBE is gu
9f90: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 aranteed to have
9fa0: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 at least 9.
9fb0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 ** cells. */.
9fc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 assert( p->nMe
9fd0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 m>9 );. pSub
9fe0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 = &p->aMem[9];.
9ff0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 if( pSub->fla
a000: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 gs&MEM_Blob ){.
a010: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 /* On the f
a020: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c irst call to sql
a030: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 ite3_step(), pSu
a040: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 b will hold a NU
a050: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 LL. It is.
a060: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 ** initialized
a070: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 to a BLOB by the
a080: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 P4_SUBPROGRAM p
a090: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 rocessing logic
a0a0: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e below */. n
a0b0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 Sub = pSub->n/si
a0c0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 zeof(Vdbe*);.
a0d0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 apSub = (SubP
a0e0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e rogram **)pSub->
a0f0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 z;. }. for
a100: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b (i=0; i<nSub; i+
a110: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b +){. nRow +
a120: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b = apSub[i]->nOp;
a130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f . }. }.. do
a140: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b {. i = p->pc+
a150: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e +;. }while( i<n
a160: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 Row && p->explai
a170: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 n==2 && p->aOp[i
a180: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 ].opcode!=OP_Exp
a190: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e lain );. if( i>
a1a0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e =nRow ){. p->
a1b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
a1c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
a1d0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 DONE;. }else if
a1e0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 ( db->u1.isInter
a1f0: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d rupted ){. p-
a200: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 >rc = SQLITE_INT
a210: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d ERRUPT;. rc =
a220: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 SQLITE_ERROR;.
a230: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 sqlite3SetStr
a240: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c ing(&p->zErrMsg,
a250: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 db, "%s", sqlit
a260: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 e3ErrStr(p->rc))
a270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 ;. }else{. c
a280: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 har *zP4;. Op
a290: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 *pOp;. if( i
a2a0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 <p->nOp ){.
a2b0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c /* The output l
a2c0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d ine number is sm
a2d0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 all enough that
a2e0: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 we are still in
a2f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 the. ** mai
a300: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 n program. */.
a310: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f pOp = &p->aO
a320: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b p[i];. }else{
a330: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 . /* We are
a340: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 currently listi
a350: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 ng subprograms.
a360: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 Figure out whic
a370: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 h one and.
a380: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 ** pick up the a
a390: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 ppropriate opcod
a3a0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 e. */. int
a3b0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d j;. i -= p-
a3c0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 >nOp;. for(
a3d0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d j=0; i>=apSub[j]
a3e0: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 ->nOp; j++){.
a3f0: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b i -= apSub[
a400: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d j]->nOp;. }
a410: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 . pOp = &ap
a420: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a Sub[j]->aOp[i];.
a430: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d }. if( p-
a440: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 >explain==1 ){.
a450: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
a460: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
a470: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b pMem->u.i = i;
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a4a0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 /* Program count
a4b0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d er */. pMem
a4c0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 ++;. . pMe
a4d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 m->flags = MEM_S
a4e0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 tatic|MEM_Str|ME
a4f0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d M_Term;. pM
a500: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 em->z = (char*)s
a510: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 qlite3OpcodeName
a520: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f (pOp->opcode); /
a530: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 * Opcode */.
a540: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e assert( pMem->
a550: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d z!=0 );. pM
a560: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 em->n = sqlite3S
a570: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 trlen30(pMem->z)
a580: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e ;. pMem->en
a590: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b c = SQLITE_UTF8;
a5a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a . pMem++;..
a5b0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e /* When an
a5c0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f OP_Program opco
a5d0: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 de is encounter
a5e0: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 (the only opcode
a5f0: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 that has.
a600: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 ** a P4_SUBPROGR
a610: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 AM argument), ex
a620: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 pand the size of
a630: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 the array of su
a640: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 bprograms.
a650: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d ** kept in p->aM
a660: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 em[9].z to hold
a670: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 the new program
a680: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 - assuming this
a690: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 subprogram.
a6a0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 ** has not alre
a6b0: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 ady been seen..
a6c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
a6d0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 ( pOp->p4type==P
a6e0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 4_SUBPROGRAM ){.
a6f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 int nByt
a700: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a e = (nSub+1)*siz
a710: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 eof(SubProgram*)
a720: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b ;. int j;
a730: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 . for(j=0
a740: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a ; j<nSub; j++){.
a750: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 if( ap
a760: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e Sub[j]==pOp->p4.
a770: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b pProgram ) break
a780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
a790: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 if( j==nSub
a7a0: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 && SQLITE_OK==sq
a7b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 lite3VdbeMemGrow
a7c0: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 (pSub, nByte, nS
a7d0: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 ub!=0) ){.
a7e0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 apSub = (Sub
a7f0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d Program **)pSub-
a800: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 >z;. ap
a810: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f Sub[nSub++] = pO
a820: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a p->p4.pProgram;.
a830: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e pSub->
a840: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f flags |= MEM_Blo
a850: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 b;. pSu
a860: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 b->n = nSub*size
a870: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b of(SubProgram*);
a880: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
a890: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d }. }.. pM
a8a0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
a8b0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 Int;. pMem->u
a8c0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 .i = pOp->p1;
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a8e0: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a /* P1 */.
a8f0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 pMem++;..
a900: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
a910: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d EM_Int;. pMem
a920: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b ->u.i = pOp->p2;
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 /* P2
a950: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a */. pMem++;..
a960: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
a970: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 = MEM_Int;. p
a980: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e Mem->u.i = pOp->
a990: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 p3;
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
a9b0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b P3 */. pMem++
a9c0: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 ;.. if( sqlit
a9d0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e e3VdbeMemClearAn
a9e0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32 dResize(pMem, 32
a9f0: 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 ) ){ /* P4 */.
aa00: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 assert( p->d
aa10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
aa20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
aa30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 SQLITE_ERROR;.
aa40: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c }. pMem->fl
aa50: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 ags = MEM_Str|ME
aa60: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 M_Term;. zP4
aa70: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c = displayP4(pOp,
aa80: 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 pMem->z, 32);.
aa90: 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d if( zP4!=pMem
aaa0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ->z ){. sql
aab0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 ite3VdbeMemSetSt
aac0: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c r(pMem, zP4, -1,
aad0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 SQLITE_UTF8, 0)
aae0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
aaf0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d assert( pMem-
ab00: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 >z!=0 );. p
ab10: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 Mem->n = sqlite3
ab20: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a Strlen30(pMem->z
ab30: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 );. pMem->e
ab40: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 nc = SQLITE_UTF8
ab50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d ;. }. pMem
ab60: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e ++;.. if( p->
ab70: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 explain==1 ){.
ab80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 if( sqlite3V
ab90: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 dbeMemClearAndRe
aba0: 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b size(pMem, 4) ){
abb0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
abc0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 p->db->mallocFa
abd0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 iled );.
abe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
abf0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ROR;. }.
ac00: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
ac10: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 MEM_Str|MEM_Ter
ac20: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e m;. pMem->n
ac30: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 = 2;. sqli
ac40: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 te3_snprintf(3,
ac50: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c pMem->z, "%.2x",
ac60: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 pOp->p5); /*
ac70: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d P5 */. pMem
ac80: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 ->enc = SQLITE_U
ac90: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b TF8;. pMem+
aca0: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c +;. .#ifdef SQL
acb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 ITE_ENABLE_EXPLA
acc0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 IN_COMMENTS.
acd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 if( sqlite3Vdb
ace0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 eMemClearAndResi
acf0: 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b ze(pMem, 500) ){
ad00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
ad10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 p->db->mallocFa
ad20: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 iled );.
ad30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
ad40: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ROR;. }.
ad50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
ad60: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 MEM_Str|MEM_Ter
ad70: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e m;. pMem->n
ad80: 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e = displayCommen
ad90: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d t(pOp, zP4, pMem
ada0: 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 ->z, 500);.
adb0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c pMem->enc = SQL
adc0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a ITE_UTF8;.#else.
add0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 pMem->flag
ade0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 s = MEM_Null;
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae00: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a /* Comment *
ae10: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a /.#endif. }..
ae20: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d p->nResColum
ae30: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 n = 8 - 4*(p->ex
ae40: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d plain-1);. p-
ae50: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 >pResultSet = &p
ae60: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 ->aMem[1];. p
ae70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b ->rc = SQLITE_OK
ae80: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 ;. rc = SQLIT
ae90: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 E_ROW;. }. ret
aea0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 urn rc;.}.#endif
aeb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f /* SQLITE_OMIT_
aec0: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 EXPLAIN */..#ifd
aed0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
aee0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 /*.** Print the
aef0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 SQL that was use
af00: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 d to generate a
af10: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f VDBE program..*/
af20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
af30: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a ePrintSql(Vdbe *
af40: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 p){. const char
af50: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 *z = 0;. if( p
af60: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 ->zSql ){. z
af70: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c = p->zSql;. }el
af80: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 se if( p->nOp>=1
af90: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 ){. const Vd
afa0: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e beOp *pOp = &p->
afb0: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 aOp[0];. if(
afc0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f pOp->opcode==OP_
afd0: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e Init && pOp->p4.
afe0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 z!=0 ){. z
aff0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 = pOp->p4.z;.
b000: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 while( sqlite
b010: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 3Isspace(*z) ) z
b020: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 ++;. }. }.
b030: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 if( z ) printf("
b040: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 SQL: [%s]\n", z)
b050: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 ;.}.#endif..#if
b060: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
b070: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 OMIT_TRACE) && d
b080: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e efined(SQLITE_EN
b090: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a ABLE_IOTRACE)./*
b0a0: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 .** Print an IOT
b0b0: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f RACE message sho
b0c0: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 wing SQL content
b0d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
b0e0: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 3VdbeIOTraceSql(
b0f0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 Vdbe *p){. int
b100: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 nOp = p->nOp;.
b110: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 VdbeOp *pOp;. i
b120: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 f( sqlite3IoTrac
b130: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 e==0 ) return;.
b140: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 if( nOp<1 ) ret
b150: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d urn;. pOp = &p-
b160: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 >aOp[0];. if( p
b170: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 Op->opcode==OP_I
b180: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a nit && pOp->p4.z
b190: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 !=0 ){. int i
b1a0: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b , j;. char z[
b1b0: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 1000];. sqlit
b1c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 e3_snprintf(size
b1d0: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 of(z), z, "%s",
b1e0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 pOp->p4.z);.
b1f0: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 for(i=0; sqlite3
b200: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 Isspace(z[i]); i
b210: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d ++){}. for(j=
b220: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 0; z[i]; i++){.
b230: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 if( sqlite3
b240: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b Isspace(z[i]) ){
b250: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 . if( z[i
b260: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 -1]!=' ' ){.
b270: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 z[j++] = '
b280: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ';. }.
b290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
b2a0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d z[j++] = z[i]
b2b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
b2c0: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 z[j] = 0;.
b2d0: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 sqlite3IoTrace
b2e0: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b ("SQL %s\n", z);
b2f0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a . }.}.#endif /*
b300: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 !SQLITE_OMIT_TR
b310: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e ACE && SQLITE_EN
b320: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a ABLE_IOTRACE */.
b330: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 ./*.** Allocate
b340: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 space from a fix
b350: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 ed size buffer a
b360: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e nd return a poin
b370: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 ter to.** that s
b380: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 pace. If insuff
b390: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 icient space is
b3a0: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 available, retur
b3b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 n NULL..**.** Th
b3c0: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 e pBuf parameter
b3d0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 is the initial
b3e0: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 value of a point
b3f0: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a er which will.**
b400: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 receive the new
b410: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 memory. pBuf i
b420: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e s normally NULL.
b430: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 If pBuf is not
b440: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 .** NULL, it mea
b450: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 ns that memory s
b460: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 pace has already
b470: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 been allocated
b480: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 and that.** this
b490: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 routine should
b4a0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 not allocate any
b4b0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 new memory. Wh
b4c0: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a en pBuf is not.*
b4d0: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 * NULL simply re
b4e0: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 turn pBuf. Only
b4f0: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 allocate new me
b500: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 mory space when
b510: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e pBuf.** is NULL.
b520: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 .**.** nByte is
b530: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
b540: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 tes of space nee
b550: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 ded..**.** *ppFr
b560: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 om points to ava
b570: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 ilable space and
b580: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 pEnd points to
b590: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a the end of the.*
b5a0: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 * available spac
b5b0: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 e. When space i
b5c0: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 s allocated, *pp
b5d0: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 From is advanced
b5e0: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 past.** the end
b5f0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 of the allocate
b600: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a d space..**.** *
b610: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e pnByte is a coun
b620: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 ter of the numbe
b630: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 r of bytes of sp
b640: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 ace that have fa
b650: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 iled.** to alloc
b660: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 ate. If there i
b670: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 s insufficient s
b680: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 pace in *ppFrom
b690: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a to satisfy the.*
b6a0: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 * request, then
b6b0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 increment *pnByt
b6c0: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 e by the amount
b6d0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a of the request..
b6e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a */.static void *
b6f0: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f allocSpace(. vo
b700: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 id *pBuf,
b710: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 /* Where retu
b720: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 rn pointer will
b730: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 be stored */. i
b740: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 nt nByte,
b750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
b760: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 bytes to alloca
b770: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 te */. u8 **ppF
b780: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 rom, /*
b790: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 IN/OUT: Allocate
b7a0: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f from *ppFrom */
b7b0: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 . u8 *pEnd,
b7c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
b7d0: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 er to 1 byte pas
b7e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 t the end of *pp
b7f0: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 From buffer */.
b800: 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 int *pnByte
b810: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f /* If allo
b820: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 cation cannot be
b830: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 made, increment
b840: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 *pnByte */.){.
b850: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 assert( EIGHT_B
b860: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 YTE_ALIGNMENT(*p
b870: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 pFrom) );. if(
b880: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 pBuf ) return pB
b890: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f uf;. nByte = RO
b8a0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 UND8(nByte);. i
b8b0: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 f( &(*ppFrom)[nB
b8c0: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a yte] <= pEnd ){.
b8d0: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 pBuf = (void
b8e0: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a *)*ppFrom;. *
b8f0: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b ppFrom += nByte;
b900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 . }else{. *p
b910: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a nByte += nByte;.
b920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 }. return pBu
b930: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 f;.}../*.** Rewi
b940: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b nd the VDBE back
b950: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e to the beginnin
b960: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e g in preparation
b970: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 for.** running
b980: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 it..*/.void sqli
b990: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 te3VdbeRewind(Vd
b9a0: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 be *p){.#if defi
b9b0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
b9c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 ) || defined(VDB
b9d0: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 E_PROFILE). int
b9e0: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 i;.#endif. ass
b9f0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 ert( p!=0 );. a
ba00: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d ssert( p->magic=
ba10: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 =VDBE_MAGIC_INIT
ba20: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 );.. /* There
ba30: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 should be at lea
ba40: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 st one opcode..
ba50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d */. assert( p-
ba60: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 >nOp>0 );.. /*
ba70: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f Set the magic to
ba80: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 VDBE_MAGIC_RUN
ba90: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 sooner rather th
baa0: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 an later. */. p
bab0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d ->magic = VDBE_M
bac0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 AGIC_RUN;..#ifde
bad0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 f SQLITE_DEBUG.
bae0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e for(i=1; i<p->n
baf0: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 Mem; i++){. a
bb00: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 ssert( p->aMem[i
bb10: 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 ].db==p->db );.
bb20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 }.#endif. p->p
bb30: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 c = -1;. p->rc
bb40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 = SQLITE_OK;. p
bb50: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 ->errorAction =
bb60: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d OE_Abort;. p->m
bb70: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 agic = VDBE_MAGI
bb80: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 C_RUN;. p->nCha
bb90: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 nge = 0;. p->ca
bba0: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d cheCtr = 1;. p-
bbb0: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 >minWriteFileFor
bbc0: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e mat = 255;. p->
bbd0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a iStatement = 0;.
bbe0: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 p->nFkConstrai
bbf0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 nt = 0;.#ifdef V
bc00: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f DBE_PROFILE. fo
bc10: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b r(i=0; i<p->nOp;
bc20: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f i++){. p->aO
bc30: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 p[i].cnt = 0;.
bc40: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c p->aOp[i].cycl
bc50: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 es = 0;. }.#end
bc60: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 if.}../*.** Prep
bc70: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 are a virtual ma
bc80: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 chine for execut
bc90: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 ion for the firs
bca0: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 t time after.**
bcb0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 creating the vir
bcc0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 tual machine. T
bcd0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 his involves thi
bce0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 ngs such.** as a
bcf0: 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 llocating regist
bd00: 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 ers and initiali
bd10: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d zing the program
bd20: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 counter..** Aft
bd30: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 er the VDBE has
bd40: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 be prepped, it c
bd50: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 an be executed b
bd60: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a y one or more.**
bd70: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 calls to sqlite
bd80: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 3VdbeExec(). .*
bd90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
bda0: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 on may be called
bdb0: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e exactly once on
bdc0: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 each virtual ma
bdd0: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 chine..** After
bde0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
bdf0: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 called the VM ha
be00: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 s been "packaged
be10: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a " and is ready.*
be20: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 * to run. After
be30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 this routine is
be40: 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 called, further
be50: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 calls to .** sq
be60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 lite3VdbeAddOp()
be70: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 functions are p
be80: 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 rohibited. This
be90: 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e routine disconn
bea0: 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 ects.** the Vdbe
beb0: 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 from the Parse
bec0: 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 object that help
bed0: 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 ed generate it s
bee0: 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 o that the.** th
bef0: 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 e Vdbe becomes a
bf00: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e n independent en
bf10: 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 tity and the Par
bf20: 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 se object can be
bf30: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a .** destroyed..*
bf40: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c *.** Use the sql
bf50: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 ite3VdbeRewind()
bf60: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 procedure to re
bf70: 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 store a virtual
bf80: 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 machine back.**
bf90: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 to its initial s
bfa0: 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 tate after it ha
bfb0: 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 s been run..*/.v
bfc0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d oid sqlite3VdbeM
bfd0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 akeReady(. Vdbe
bfe0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
c000: 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 e VDBE */. Pars
c010: 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 e *pParse
c020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 /* Pa
c030: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f rsing context */
c040: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 .){. sqlite3 *d
c050: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
c060: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 /* The data
c070: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
c080: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 */. int nVar;
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c0a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
c0b0: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 parameters */.
c0c0: 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 int nMem;
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c0e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 /* Number of VM
c0f0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 memory registers
c100: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f */. int nCurso
c110: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
c120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
c130: 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 f cursors requir
c140: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 ed */. int nArg
c150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
c160: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
c170: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e of arguments in
c180: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a subprograms */.
c190: 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 int nOnce;
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c1b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 /* Number of OP
c1c0: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f _Once instructio
c1d0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 ns */. int n;
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c1f0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 /* Loop c
c200: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a ounter */. u8 *
c210: 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 zCsr;
c220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 /* Me
c230: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 mory available f
c240: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f or allocation */
c250: 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 . u8 *zEnd;
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c270: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 /* First byte
c280: 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d past allocated m
c290: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e emory */. int n
c2a0: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 Byte;
c2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 /* How
c2c0: 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f much extra memo
c2d0: 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a ry is needed */.
c2e0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 . assert( p!=0
c2f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
c300: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 nOp>0 );. asser
c310: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a t( pParse!=0 );.
c320: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 assert( p->mag
c330: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 ic==VDBE_MAGIC_I
c340: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 NIT );. assert(
c350: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 pParse==p->pPar
c360: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e se );. db = p->
c370: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 db;. assert( db
c380: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d ->mallocFailed==
c390: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 0 );. nVar = pP
c3a0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d arse->nVar;. nM
c3b0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 em = pParse->nMe
c3c0: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 m;. nCursor = p
c3d0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e Parse->nTab;. n
c3e0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d Arg = pParse->nM
c3f0: 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d axArg;. nOnce =
c400: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a pParse->nOnce;.
c410: 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 if( nOnce==0 )
c420: 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 nOnce = 1; /* E
c430: 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f nsure at least o
c440: 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f ne byte in p->aO
c450: 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a nceFlag[] */. .
c460: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 /* For each cu
c470: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 rsor required, a
c480: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d lso allocate a m
c490: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f emory cell. Memo
c4a0: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e ry. ** cells (n
c4b0: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e Mem+1-nCursor)..
c4c0: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c nMem, inclusive,
c4d0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 will never be u
c4e0: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 sed by. ** the
c4f0: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e vdbe program. In
c500: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 stead they are u
c510: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 sed to allocate
c520: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 space for. ** V
c530: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 dbeCursor/BtCurs
c540: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 or structures. T
c550: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 he blob of memor
c560: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
c570: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 h . ** cursor 0
c580: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 is stored in me
c590: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 mory cell nMem.
c5a0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 Memory cell (nMe
c5b0: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 m-1). ** stores
c5c0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d the blob of mem
c5d0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 ory associated w
c5e0: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 ith cursor 1, et
c5f0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 c.. **. ** See
c600: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 also: allocateC
c610: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 ursor().. */.
c620: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b nMem += nCursor;
c630: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 .. /* Allocate
c640: 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 space for memory
c650: 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 registers, SQL
c660: 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 variables, VDBE
c670: 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a cursors and . *
c680: 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 * an array to ma
c690: 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 rshal SQL functi
c6a0: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e on arguments in.
c6b0: 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 . */. zCsr = (
c6c0: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e u8*)&p->aOp[p->n
c6d0: 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 Op];
c6e0: 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 /* Memory avalia
c6f0: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 ble for allocati
c700: 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 on */. zEnd = (
c710: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 u8*)&p->aOp[pPar
c720: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 se->nOpAlloc];
c730: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 /* First byte pa
c740: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d st end of zCsr[]
c750: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 */.. resolveP2
c760: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 Values(p, &nArg)
c770: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a ;. p->usesStmtJ
c780: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 ournal = (u8)(pP
c790: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 arse->isMultiWri
c7a0: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 te && pParse->ma
c7b0: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 yAbort);. if( p
c7c0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 Parse->explain &
c7d0: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 & nMem<10 ){.
c7e0: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a nMem = 10;. }.
c7f0: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 memset(zCsr, 0
c800: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 , zEnd-zCsr);.
c810: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 zCsr += (zCsr -
c820: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 (u8*)0)&7;. ass
c830: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f ert( EIGHT_BYTE_
c840: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 ALIGNMENT(zCsr)
c850: 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 );. p->expired
c860: 3d 20 30 3b 0a 0a 20 20 70 2d 3e 65 78 70 69 72 = 0;.. p->expir
c870: 65 64 20 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20 ed = 0;. . /*
c880: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 Memory for regis
c890: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 ters, parameters
c8a0: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 , cursor, etc, i
c8b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 s allocated in t
c8c0: 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 wo. ** passes.
c8d0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 On the first pa
c8e0: 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 ss, we try to re
c8f0: 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 use unused space
c900: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e at the . ** en
c910: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 d of the opcode
c920: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 array. If we ar
c930: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 e unable to sati
c940: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 sfy all memory.
c950: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 ** requirements
c960: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 by reusing the
c970: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 opcode array tai
c980: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f l, then the seco
c990: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c nd. ** pass wil
c9a0: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 l fill in the re
c9b0: 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 st using a fresh
c9c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 allocation. .
c9d0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 **. ** This tw
c9e0: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 o-pass approach
c9f0: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d that reuses as m
ca00: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f uch memory as po
ca10: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a ssible from. **
ca20: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 the leftover sp
ca30: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f ace at the end o
ca40: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 f the opcode arr
ca50: 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 ay can significa
ca60: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 ntly. ** reduce
ca70: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d the amount of m
ca80: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 emory held by a
ca90: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
caa0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a nt.. */. do {.
cab0: 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 nByte = 0;.
cac0: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c p->aMem = all
cad0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c ocSpace(p->aMem,
cae0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d nMem*sizeof(Mem
caf0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 ), &zCsr, zEnd,
cb00: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e &nByte);. p->
cb10: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 aVar = allocSpac
cb20: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a e(p->aVar, nVar*
cb30: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 sizeof(Mem), &zC
cb40: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 sr, zEnd, &nByte
cb50: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 );. p->apArg
cb60: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e = allocSpace(p->
cb70: 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 apArg, nArg*size
cb80: 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c of(Mem*), &zCsr,
cb90: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a zEnd, &nByte);.
cba0: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 p->azVar = a
cbb0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 llocSpace(p->azV
cbc0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 ar, nVar*sizeof(
cbd0: 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a char*), &zCsr, z
cbe0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 End, &nByte);.
cbf0: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c p->apCsr = all
cc00: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 ocSpace(p->apCsr
cc10: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 , nCursor*sizeof
cc20: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 (VdbeCursor*),.
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cc40: 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 &zCsr,
cc50: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 zEnd, &nByte);.
cc60: 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 p->aOnceFlag
cc70: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e = allocSpace(p->
cc80: 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 aOnceFlag, nOnce
cc90: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 , &zCsr, zEnd, &
cca0: 6e 42 79 74 65 29 3b 0a 23 69 66 64 65 66 20 53 nByte);.#ifdef S
ccb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d QLITE_ENABLE_STM
ccc0: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 T_SCANSTATUS.
ccd0: 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c p->anExec = all
cce0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e 45 78 65 ocSpace(p->anExe
ccf0: 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 c, p->nOp*sizeof
cd00: 28 69 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a 45 (i64), &zCsr, zE
cd10: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e nd, &nByte);.#en
cd20: 64 69 66 0a 20 20 20 20 69 66 28 20 6e 42 79 74 dif. if( nByt
cd30: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 e ){. p->pF
cd40: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d ree = sqlite3DbM
cd50: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 allocZero(db, nB
cd60: 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 yte);. }.
cd70: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b zCsr = p->pFree;
cd80: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 . zEnd = &zCs
cd90: 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 r[nByte];. }whi
cda0: 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 le( nByte && !db
cdb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
cdc0: 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 ;.. p->nCursor
cdd0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e = nCursor;. p->
cde0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 nOnceFlag = nOnc
cdf0: 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 e;. if( p->aVar
ce00: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 ){. p->nVar
ce10: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 = (ynVar)nVar;.
ce20: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 for(n=0; n<nV
ce30: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 ar; n++){.
ce40: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 p->aVar[n].flags
ce50: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 = MEM_Null;.
ce60: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 p->aVar[n].db
ce70: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d = db;. }. }
ce80: 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 . if( p->azVar
ce90: 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 && pParse->nzVar
cea0: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 >0 ){. p->nzV
ceb0: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 ar = pParse->nzV
cec0: 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 ar;. memcpy(p
ced0: 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d ->azVar, pParse-
cee0: 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 >azVar, p->nzVar
cef0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 *sizeof(p->azVar
cf00: 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 [0]));. memse
cf10: 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c t(pParse->azVar,
cf20: 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 0, pParse->nzVa
cf30: 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d r*sizeof(pParse-
cf40: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d >azVar[0]));. }
cf50: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 . if( p->aMem )
cf60: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b {. p->aMem--;
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cf80: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 /* aMem[]
cf90: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 goes from 1..nMe
cfa0: 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d m */. p->nMem
cfb0: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 = nMem;
cfc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 /*
cfd0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d not from 0..nM
cfe0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 em-1 */. for(
cff0: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b n=1; n<=nMem; n+
d000: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 +){. p->aMe
d010: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d m[n].flags = MEM
d020: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 _Undefined;.
d030: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 p->aMem[n].db
d040: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = db;. }. }.
d050: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 p->explain = p
d060: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a Parse->explain;.
d070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 sqlite3VdbeRew
d080: 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ind(p);.}../*.**
d090: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 Close a VDBE cu
d0a0: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 rsor and release
d0b0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 all the resourc
d0c0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a es that cursor .
d0d0: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f ** happens to ho
d0e0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ld..*/.void sqli
d0f0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f te3VdbeFreeCurso
d100: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 r(Vdbe *p, VdbeC
d110: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 ursor *pCx){. i
d120: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 f( pCx==0 ){.
d130: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 return;. }. s
d140: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 qlite3VdbeSorter
d150: 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 Close(p->db, pCx
d160: 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 );. if( pCx->pB
d170: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 t ){. sqlite3
d180: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e BtreeClose(pCx->
d190: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 pBt);. /* The
d1a0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 pCx->pCursor wi
d1b0: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f ll be close auto
d1c0: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 matically, if it
d1d0: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 exists, by.
d1e0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 ** the call abov
d1f0: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 e. */. }else if
d200: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 ( pCx->pCursor )
d210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 {. sqlite3Btr
d220: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 eeCloseCursor(pC
d230: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d x->pCursor);. }
d240: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
d250: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c OMIT_VIRTUALTABL
d260: 45 0a 20 20 65 6c 73 65 20 69 66 28 20 70 43 78 E. else if( pCx
d270: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b ->pVtabCursor ){
d280: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 . sqlite3_vta
d290: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 b_cursor *pVtabC
d2a0: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 ursor = pCx->pVt
d2b0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f abCursor;. co
d2c0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 nst sqlite3_modu
d2d0: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 le *pModule = pV
d2e0: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 tabCursor->pVtab
d2f0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 ->pModule;. a
d300: 73 73 65 72 74 28 20 70 56 74 61 62 43 75 72 73 ssert( pVtabCurs
d310: 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e or->pVtab->nRef>
d320: 30 20 29 3b 0a 20 20 20 20 70 56 74 61 62 43 75 0 );. pVtabCu
d330: 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 rsor->pVtab->nRe
d340: 66 2d 2d 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 f--;. pModule
d350: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 ->xClose(pVtabCu
d360: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 rsor);. }.#endi
d370: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 f.}../*.** Copy
d380: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 the values store
d390: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 d in the VdbeFra
d3a0: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 me structure to
d3b0: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a its Vdbe. This.*
d3c0: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 * is used, for e
d3d0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 xample, when a t
d3e0: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 rigger sub-progr
d3f0: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 am is halted to
d400: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 restore.** contr
d410: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 ol to the main p
d420: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 rogram..*/.int s
d430: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 qlite3VdbeFrameR
d440: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 estore(VdbeFrame
d450: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 *pFrame){. Vdb
d460: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 e *v = pFrame->v
d470: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
d480: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e ENABLE_STMT_SCAN
d490: 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 STATUS. v->anEx
d4a0: 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 ec = pFrame->anE
d4b0: 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d xec;.#endif. v-
d4c0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 >aOnceFlag = pFr
d4d0: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a ame->aOnceFlag;.
d4e0: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d v->nOnceFlag =
d4f0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c pFrame->nOnceFl
d500: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 ag;. v->aOp = p
d510: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d Frame->aOp;. v-
d520: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e >nOp = pFrame->n
d530: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 Op;. v->aMem =
d540: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 pFrame->aMem;.
d550: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 v->nMem = pFrame
d560: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 ->nMem;. v->apC
d570: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 sr = pFrame->apC
d580: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 sr;. v->nCursor
d590: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 = pFrame->nCurs
d5a0: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 or;. v->db->las
d5b0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d tRowid = pFrame-
d5c0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d >lastRowid;. v-
d5d0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d >nChange = pFram
d5e0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d e->nChange;. v-
d5f0: 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 >db->nChange = p
d600: 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 Frame->nDbChange
d610: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d ;. return pFram
d620: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 e->pc;.}../*.**
d630: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 Close all cursor
d640: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 s..**.** Also re
d650: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 lease any dynami
d660: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 c memory held by
d670: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 the VM in the V
d680: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 dbe.aMem memory
d690: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 .** cell array.
d6a0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 This is necessar
d6b0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 y as the memory
d6c0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 cell array may c
d6d0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 ontain.** pointe
d6e0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 rs to VdbeFrame
d6f0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d objects, which m
d700: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 ay in turn conta
d710: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a in pointers to.*
d720: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a * open cursors..
d730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 */.static void c
d740: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 loseAllCursors(V
d750: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 dbe *p){. if( p
d760: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 ->pFrame ){.
d770: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d VdbeFrame *pFram
d780: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d e;. for(pFram
d790: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 e=p->pFrame; pFr
d7a0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 ame->pParent; pF
d7b0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 rame=pFrame->pPa
d7c0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 rent);. sqlit
d7d0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f e3VdbeFrameResto
d7e0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 re(pFrame);.
d7f0: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 p->pFrame = 0;.
d800: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 p->nFrame = 0
d810: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
d820: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a p->nFrame==0 );.
d830: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 . if( p->apCsr
d840: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 ){. int i;.
d850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
d860: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 nCursor; i++){.
d870: 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 VdbeCursor
d880: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 *pC = p->apCsr[i
d890: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 ];. if( pC
d8a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
d8b0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 e3VdbeFreeCursor
d8c0: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 (p, pC);.
d8d0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 p->apCsr[i] = 0
d8e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
d8f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 }. if( p->aMe
d900: 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 m ){. release
d910: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 MemArray(&p->aMe
d920: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a m[1], p->nMem);.
d930: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e }. while( p->
d940: 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 pDelFrame ){.
d950: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c VdbeFrame *pDel
d960: 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b = p->pDelFrame;
d970: 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d . p->pDelFram
d980: 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e e = pDel->pParen
d990: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 t;. sqlite3Vd
d9a0: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 beFrameDelete(pD
d9b0: 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 el);. }.. /* D
d9c0: 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 elete any auxdat
d9d0: 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 a allocations ma
d9e0: 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a de by the VM */.
d9f0: 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 if( p->pAuxDat
da00: 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 a ) sqlite3VdbeD
da10: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 eleteAuxData(p,
da20: 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 -1, 0);. assert
da30: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 ( p->pAuxData==0
da40: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 );.}../*.** Cle
da50: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 an up the VM aft
da60: 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e er a single run.
da70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
da80: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 Cleanup(Vdbe *p)
da90: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 {. sqlite3 *db
daa0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 = p->db;..#ifdef
dab0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 SQLITE_DEBUG.
dac0: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 /* Execute asser
dad0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 t() statements t
dae0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 o ensure that th
daf0: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 e Vdbe.apCsr[] a
db00: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d nd . ** Vdbe.aM
db10: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 em[] arrays have
db20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c already been cl
db30: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 eaned up. */.
db40: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e int i;. if( p->
db50: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b apCsr ) for(i=0;
db60: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 i<p->nCursor; i
db70: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 ++) assert( p->a
db80: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 pCsr[i]==0 );.
db90: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 if( p->aMem ){.
dba0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 for(i=1; i<=p
dbb0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 ->nMem; i++) ass
dbc0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e ert( p->aMem[i].
dbd0: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 flags==MEM_Undef
dbe0: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 ined );. }.#end
dbf0: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 if.. sqlite3DbF
dc00: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d ree(db, p->zErrM
dc10: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 sg);. p->zErrMs
dc20: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 g = 0;. p->pRes
dc30: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f ultSet = 0;.}../
dc40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d *.** Set the num
dc50: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f ber of result co
dc60: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 lumns that will
dc70: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 be returned by t
dc80: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 his SQL.** state
dc90: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f ment. This is no
dca0: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 w set at compile
dcb0: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 time, rather th
dcc0: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 an during.** exe
dcd0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 cution of the vd
dce0: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 be program so th
dcf0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d at sqlite3_colum
dd00: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a n_count() can.**
dd10: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e be called on an
dd20: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 SQL statement b
dd30: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 efore sqlite3_st
dd40: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 ep()..*/.void sq
dd50: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 lite3VdbeSetNumC
dd60: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 ols(Vdbe *p, int
dd70: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 nResColumn){.
dd80: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 Mem *pColName;.
dd90: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 int n;. sqlite
dda0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 3 *db = p->db;..
ddb0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 releaseMemArra
ddc0: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 y(p->aColName, p
ddd0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c ->nResColumn*COL
dde0: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 NAME_N);. sqlit
ddf0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e e3DbFree(db, p->
de00: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d aColName);. n =
de10: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e nResColumn*COLN
de20: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 AME_N;. p->nRes
de30: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 Column = (u16)nR
de40: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 esColumn;. p->a
de50: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 ColName = pColNa
de60: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 me = (Mem*)sqlit
de70: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 e3DbMallocZero(d
de80: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e b, sizeof(Mem)*n
de90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f );. if( p->aCo
dea0: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 lName==0 ) retur
deb0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 n;. while( n--
dec0: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e > 0 ){. pColN
ded0: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d ame->flags = MEM
dee0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e _Null;. pColN
def0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b ame->db = p->db;
df00: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b . pColName++;
df10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 . }.}../*.** Se
df20: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 t the name of th
df30: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 e idx'th column
df40: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 to be returned b
df50: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d y the SQL statem
df60: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 ent..** zName mu
df70: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 st be a pointer
df80: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 to a nul termina
df90: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a ted string..**.*
dfa0: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 * This call must
dfb0: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 be made after a
dfc0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 call to sqlite3
dfd0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 VdbeSetNumCols()
dfe0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 ..**.** The fina
dff0: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 l parameter, xDe
e000: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f l, must be one o
e010: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 f SQLITE_DYNAMIC
e020: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a , SQLITE_STATIC.
e030: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 ** or SQLITE_TRA
e040: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 NSIENT. If it is
e050: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c SQLITE_DYNAMIC,
e060: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 then the buffer
e070: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 pointed.** to b
e080: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 y zName will be
e090: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 freed by sqlite3
e0a0: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 DbFree() when th
e0b0: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f e vdbe is destro
e0c0: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 yed..*/.int sqli
e0d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d te3VdbeSetColNam
e0e0: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 e(. Vdbe *p,
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e100: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 /* Vdbe be
e110: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a ing configured *
e120: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 /. int idx,
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e140: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 /* Index of
e150: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 column zName ap
e160: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e plies to */. in
e170: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 t var,
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
e190: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c * One of the COL
e1a0: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 NAME_* constants
e1b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
e1c0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 *zName,
e1d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
e1e0: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 r to buffer cont
e1f0: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 aining name */.
e200: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f void (*xDel)(vo
e210: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 id*)
e220: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 /* Memory mana
e230: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 gement strategy
e240: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a for zName */.){.
e250: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 int rc;. Mem
e260: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 *pColName;. ass
e270: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 ert( idx<p->nRes
e280: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 Column );. asse
e290: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f rt( var<COLNAME_
e2a0: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 N );. if( p->db
e2b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
e2c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a {. assert( !z
e2d0: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 Name || xDel!=SQ
e2e0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a LITE_DYNAMIC );.
e2f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
e300: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 E_NOMEM;. }. a
e310: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 ssert( p->aColNa
e320: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e me!=0 );. pColN
e330: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e ame = &(p->aColN
e340: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e ame[idx+var*p->n
e350: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 ResColumn]);. r
e360: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d c = sqlite3VdbeM
e370: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d emSetStr(pColNam
e380: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 e, zName, -1, SQ
e390: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 LITE_UTF8, xDel)
e3a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d ;. assert( rc!=
e3b0: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 0 || !zName || (
e3c0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 pColName->flags&
e3d0: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a MEM_Term)!=0 );.
e3e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
e3f0: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 /*.** A read or
e400: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f write transactio
e410: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 n may or may not
e420: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 be active on da
e430: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a tabase handle.**
e440: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 db. If a transa
e450: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c ction is active,
e460: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 commit it. If t
e470: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 here is a.** wri
e480: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 te-transaction s
e490: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 panning more tha
e4a0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 n one database f
e4b0: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e ile, this routin
e4c0: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 e.** takes care
e4d0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f of the master jo
e4e0: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a urnal trickery..
e4f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 */.static int vd
e500: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 beCommit(sqlite3
e510: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a *db, Vdbe *p){.
e520: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e int i;. int n
e530: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e Trans = 0; /* N
e540: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 umber of databas
e550: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 es with an activ
e560: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 e write-transact
e570: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 ion */. int rc
e580: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 = SQLITE_OK;. i
e590: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d nt needXcommit =
e5a0: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 0;..#ifdef SQLI
e5b0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
e5c0: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 ABLE. /* With t
e5d0: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 his option, sqli
e5e0: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 te3VtabSync() is
e5f0: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 defined to be s
e600: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 imply . ** SQLI
e610: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f TE_OK so p is no
e620: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 t used. . */.
e630: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
e640: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f (p);.#endif.. /
e650: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 * Before doing a
e660: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 nything else, ca
e670: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 ll the xSync() c
e680: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a allback for any.
e690: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 ** virtual mod
e6a0: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 ule tables writt
e6b0: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 en in this trans
e6c0: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 action. This has
e6d0: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 to. ** be done
e6e0: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e before determin
e6f0: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 ing whether a ma
e700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c ster journal fil
e710: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 e is . ** requi
e720: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 red, as an xSync
e730: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 () callback may
e740: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 add an attached
e750: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f database. ** to
e760: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
e770: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 .. */. rc = sq
e780: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 lite3VtabSync(db
e790: 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 , p);.. /* This
e7a0: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 loop determines
e7b0: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d (a) if the comm
e7c0: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 it hook should b
e7d0: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 e invoked and.
e7e0: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 ** (b) how many
e7f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 database files h
e800: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 ave open write t
e810: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 ransactions, not
e820: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 . ** including
e830: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 the temp databa
e840: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 se. (b) is impor
e850: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 tant because if
e860: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 more than . **
e870: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c one database fil
e880: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 e has an open wr
e890: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c ite transaction,
e8a0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 a master journa
e8b0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 l. ** file is r
e8c0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 equired for an a
e8d0: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 tomic commit..
e8e0: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 */ . for(i=0; r
e8f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
e900: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
e910: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 . Btree *pBt
e920: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 = db->aDb[i].pB
e930: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 t;. if( sqlit
e940: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 e3BtreeIsInTrans
e950: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e (pBt) ){. n
e960: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a eedXcommit = 1;.
e970: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 if( i!=1 )
e980: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 nTrans++;.
e990: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
e9a0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 er(pBt);. r
e9b0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 c = sqlite3Pager
e9c0: 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 ExclusiveLock(sq
e9d0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 lite3BtreePager(
e9e0: 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c pBt));. sql
e9f0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 ite3BtreeLeave(p
ea00: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 Bt);. }. }.
ea10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
ea20: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e OK ){. return
ea30: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 rc;. }.. /* I
ea40: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 f there are any
ea50: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f write-transactio
ea60: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b ns at all, invok
ea70: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f e the commit hoo
ea80: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 k */. if( needX
ea90: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 commit && db->xC
eaa0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b ommitCallback ){
eab0: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 . rc = db->xC
eac0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 ommitCallback(db
ead0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 ->pCommitArg);.
eae0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 if( rc ){.
eaf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
eb00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d _CONSTRAINT_COMM
eb10: 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 ITHOOK;. }.
eb20: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 }.. /* The simp
eb30: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 le case - no mor
eb40: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 e than one datab
eb50: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f ase file (not co
eb60: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 unting the. **
eb70: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 TEMP database) h
eb80: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e as a transaction
eb90: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 active. There
eba0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 is no need for
ebb0: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d the. ** master-
ebc0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 journal.. **.
ebd0: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e ** If the return
ebe0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 value of sqlite
ebf0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 3BtreeGetFilenam
ec00: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 e() is a zero le
ec10: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 ngth. ** string
ec20: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d , it means the m
ec30: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 ain database is
ec40: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 :memory: or a te
ec50: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 mp file. In .
ec60: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 ** that case we
ec70: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 do not support a
ec80: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 tomic multi-file
ec90: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 commits, so use
eca0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c the . ** simpl
ecb0: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e e case then too.
ecc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 . */. if( 0==s
ecd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 qlite3Strlen30(s
ece0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 qlite3BtreeGetFi
ecf0: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 lename(db->aDb[0
ed00: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 ].pBt)). || nT
ed10: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 rans<=1. ){.
ed20: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 for(i=0; rc==SQ
ed30: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d LITE_OK && i<db-
ed40: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nDb; i++){.
ed50: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 Btree *pBt = d
ed60: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 b->aDb[i].pBt;.
ed70: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a if( pBt ){.
ed80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
ed90: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 ite3BtreeCommitP
eda0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b haseOne(pBt, 0);
edb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a . }. }..
edc0: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f /* Do the co
edd0: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c mmit only if all
ede0: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 databases succe
edf0: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 ssfully complete
ee00: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a phase 1. . *
ee10: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 * If one of the
ee20: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
ee30: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c One() calls fail
ee40: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 s, this indicate
ee50: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 s an. ** IO e
ee60: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 rror while delet
ee70: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e ing or truncatin
ee80: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 g a journal file
ee90: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 . It is unlikely
eea0: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 ,. ** but cou
eeb0: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 ld happen. In th
eec0: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 is case abandon
eed0: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 processing and r
eee0: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e eturn the error.
eef0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 . */. for(
ef00: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f i=0; rc==SQLITE_
ef10: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b OK && i<db->nDb;
ef20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 i++){. Btr
ef30: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
ef40: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 b[i].pBt;.
ef50: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 if( pBt ){.
ef60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 rc = sqlite3B
ef70: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 treeCommitPhaseT
ef80: 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 wo(pBt, 0);.
ef90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 }. }. if
efa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
efb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
efc0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a VtabCommit(db);.
efd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 }. }.. /*
efe0: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 The complex case
eff0: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 - There is a mu
f000: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 lti-file write-t
f010: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 ransaction activ
f020: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 e.. ** This req
f030: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a uires a master j
f040: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 ournal file to e
f050: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 nsure the transa
f060: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f ction is. ** co
f070: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c mmitted atomical
f080: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 ly.. */.#ifndef
f090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 SQLITE_OMIT_DIS
f0a0: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 KIO. else{.
f0b0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 sqlite3_vfs *pVf
f0c0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 s = db->pVfs;.
f0d0: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d int needSync =
f0e0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 0;. char *zM
f0f0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 aster = 0; /*
f100: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 File-name for th
f110: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
f120: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e */. char con
f130: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 st *zMainFile =
f140: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 sqlite3BtreeGetF
f150: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b ilename(db->aDb[
f160: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 0].pBt);. sql
f170: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 ite3_file *pMast
f180: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 er = 0;. i64
f190: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 offset = 0;.
f1a0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 int res;. int
f1b0: 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b retryCount = 0;
f1c0: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 . int nMainFi
f1d0: 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 le;.. /* Sele
f1e0: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 ct a master jour
f1f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f nal file name */
f200: 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d . nMainFile =
f210: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
f220: 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 (zMainFile);.
f230: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 zMaster = sqlit
f240: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 e3MPrintf(db, "%
f250: 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c s-mjXXXXXX9XXz",
f260: 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 zMainFile);.
f270: 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 if( zMaster==0
f280: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
f290: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a NOMEM;. do {.
f2a0: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f u32 iRando
f2b0: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 m;. if( ret
f2c0: 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 ryCount ){.
f2d0: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e if( retryCoun
f2e0: 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 t>100 ){.
f2f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 sqlite3_log(S
f300: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 QLITE_FULL, "MJ
f310: 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 delete: %s", zMa
f320: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 ster);.
f330: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 sqlite3OsDelete
f340: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 (pVfs, zMaster,
f350: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 0);. br
f360: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c eak;. }el
f370: 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e se if( retryCoun
f380: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 t==1 ){.
f390: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 sqlite3_log(SQ
f3a0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 LITE_FULL, "MJ c
f3b0: 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 ollide: %s", zMa
f3c0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d ster);. }
f3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 . }. r
f3e0: 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 etryCount++;.
f3f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f sqlite3_rando
f400: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 mness(sizeof(iRa
f410: 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 ndom), &iRandom)
f420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
f430: 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d snprintf(13, &zM
f440: 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d aster[nMainFile]
f450: 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 , "-mj%06X9%02X"
f460: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f480: 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 (iRandom>>8)&0x
f490: 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 ffffff, iRandom&
f4a0: 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 0xff);. /*
f4b0: 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d The antipenultim
f4c0: 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 ate character of
f4d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 the master jour
f4e0: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 nal name must.
f4f0: 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f ** be "9" to
f500: 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c avoid name coll
f510: 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e isions when usin
f520: 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e g 8+3 filenames.
f530: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 */. assert
f540: 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 ( zMaster[sqlite
f550: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 3Strlen30(zMaste
f560: 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 r)-3]=='9' );.
f570: 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 sqlite3FileS
f580: 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 uffix3(zMainFile
f590: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 , zMaster);.
f5a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
f5b0: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 Access(pVfs, zMa
f5c0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 ster, SQLITE_ACC
f5d0: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 ESS_EXISTS, &res
f5e0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 );. }while( r
f5f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
f600: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 res );. if( r
f610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
f620: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 /* Open th
f630: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
f640: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 . */. rc =
f650: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c sqlite3OsOpenMal
f660: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 loc(pVfs, zMaste
f670: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 r, &pMaster, .
f680: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f SQLITE_O
f690: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 PEN_READWRITE|SQ
f6a0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 LITE_OPEN_CREATE
f6b0: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 |. SQLI
f6c0: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 TE_OPEN_EXCLUSIV
f6d0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 E|SQLITE_OPEN_MA
f6e0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a STER_JOURNAL, 0.
f6f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 );. }.
f700: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
f710: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 E_OK ){. sq
f720: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
f730: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 zMaster);.
f740: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d return rc;. }
f750: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 . . /* Write
f760: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 the name of each
f770: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
f780: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f n the transactio
f790: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 n into the new.
f7a0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 ** master jou
f7b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e rnal file. If an
f7c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 error occurs at
f7d0: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 this point clos
f7e0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c e. ** and del
f7f0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a ete the master j
f800: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c ournal file. All
f810: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 the individual
f820: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 journal files.
f830: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 ** still have
f840: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 'null' as the ma
f850: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 ster journal poi
f860: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 nter, so they wi
f870: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 ll roll. ** b
f880: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c ack independentl
f890: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f y if a failure o
f8a0: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 ccurs.. */.
f8b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
f8c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nDb; i++){.
f8d0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 Btree *pBt = d
f8e0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 b->aDb[i].pBt;.
f8f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 if( sqlite3
f900: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 BtreeIsInTrans(p
f910: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 Bt) ){. c
f920: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 har const *zFile
f930: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 = sqlite3BtreeG
f940: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 etJournalname(pB
f950: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 t);. if(
f960: 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 zFile==0 ){.
f970: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 continue;
f980: 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 /* Ignore TEMP
f990: 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 and :memory: dat
f9a0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 abases */.
f9b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 }. asse
f9c0: 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 rt( zFile[0]!=0
f9d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 );. if( !
f9e0: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c needSync && !sql
f9f0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 ite3BtreeSyncDis
fa00: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 abled(pBt) ){.
fa10: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 needSync
fa20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a = 1;. }.
fa30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
fa40: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 ite3OsWrite(pMas
fa50: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 ter, zFile, sqli
fa60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c te3Strlen30(zFil
fa70: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 e)+1, offset);.
fa80: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d offset +=
fa90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
faa0: 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 (zFile)+1;.
fab0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
fac0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
fad0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 sqlite3OsClose
fae0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 Free(pMaster);.
faf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
fb00: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a OsDelete(pVfs, z
fb10: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 Master, 0);.
fb20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 sqlite3DbF
fb30: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 ree(db, zMaster)
fb40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 ;. retu
fb50: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d rn rc;. }
fb60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a . }. }..
fb70: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 /* Sync the
fb80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
fb90: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 ile. If the IOCA
fba0: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 P_SEQUENTIAL dev
fbb0: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 ice. ** flag
fbc0: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e is set this is n
fbd0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 ot required..
fbe0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 */. if( need
fbf0: 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d Sync . && 0=
fc00: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 =(sqlite3OsDevic
fc10: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 eCharacteristics
fc20: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 (pMaster)&SQLITE
fc30: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 _IOCAP_SEQUENTIA
fc40: 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 L). && SQLIT
fc50: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 E_OK!=(rc = sqli
fc60: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 te3OsSync(pMaste
fc70: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e r, SQLITE_SYNC_N
fc80: 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 ORMAL)). ){.
fc90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c sqlite3OsCl
fca0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 oseFree(pMaster)
fcb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f ;. sqlite3O
fcc0: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d sDelete(pVfs, zM
fcd0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 aster, 0);.
fce0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
fcf0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 b, zMaster);.
fd00: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
fd10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 }.. /* Sync
fd20: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 all the db file
fd30: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 s involved in th
fd40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 e transaction. T
fd50: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 he same call.
fd60: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 ** sets the mas
fd70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e ter journal poin
fd80: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 ter in each indi
fd90: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 vidual journal.
fda0: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 If. ** an err
fdb0: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 or occurs here,
fdc0: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 do not delete th
fdd0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
fde0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 file.. **.
fdf0: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f ** If the erro
fe00: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 r occurs during
fe10: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 the first call t
fe20: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 o. ** sqlite3
fe30: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
fe40: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 One(), then ther
fe50: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 e is a chance th
fe60: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 at the. ** ma
fe70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c ster journal fil
fe80: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e e will be orphan
fe90: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f ed. But we canno
fea0: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 t delete it,.
feb0: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 ** in case the
fec0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
fed0: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 ile name was wri
fee0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f tten into the jo
fef0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c urnal. ** fil
ff00: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 e before the fai
ff10: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 lure occurred..
ff20: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d */. for(i=
ff30: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0; rc==SQLITE_OK
ff40: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 && i<db->nDb; i
ff50: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 ++){ . Btre
ff60: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 e *pBt = db->aDb
ff70: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 [i].pBt;. i
ff80: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 f( pBt ){.
ff90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 rc = sqlite3Bt
ffa0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e reeCommitPhaseOn
ffb0: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b e(pBt, zMaster);
ffc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
ffd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 sqlite3OsClos
ffe0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a eFree(pMaster);.
fff0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d assert( rc!=
10000 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 SQLITE_BUSY );.
10010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
10020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 E_OK ){. sq
10030 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
10040 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 zMaster);.
10050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d return rc;. }
10060 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 .. /* Delete
10070 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
10080 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f al file. This co
10090 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 mmits the transa
100a0 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 ction. After.
100b0 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 ** doing this t
100c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 he directory is
100d0 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 synced again bef
100e0 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 ore any individu
100f0 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 al. ** transa
10100 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 ction files are
10110 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a deleted.. */.
10120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
10130 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a OsDelete(pVfs, z
10140 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 Master, needSync
10150 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 );. sqlite3Db
10160 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 Free(db, zMaster
10170 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d );. zMaster =
10180 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 0;. if( rc )
10190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 {. return r
101a0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a c;. }.. /*
101b0 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 All files and d
101c0 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 irectories have
101d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e already been syn
101e0 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c ced, so the foll
101f0 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c owing. ** cal
10200 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 ls to sqlite3Btr
10210 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f eeCommitPhaseTwo
10220 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 () are only clos
10230 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 ing files and.
10240 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 ** deleting or
10250 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 truncating jour
10260 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 nals. If somethi
10270 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 ng goes wrong wh
10280 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 ile. ** this
10290 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 is happening we
102a0 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 don't really car
102b0 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 e. The integrity
102c0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 of the. ** t
102d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c ransaction is al
102e0 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 ready guaranteed
102f0 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 , but some stray
10300 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 'cold' journals
10310 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c . ** may be l
10320 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 ying around. Ret
10330 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 urning an error
10340 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 code won't help
10350 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a matters.. */.
10360 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 disable_simu
10370 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 lated_io_errors(
10380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 );. sqlite3Be
10390 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 ginBenignMalloc(
103a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 );. for(i=0;
103b0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
103c0 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 . Btree *p
103d0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e Bt = db->aDb[i].
103e0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 pBt;. if( p
103f0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 Bt ){. sq
10400 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
10410 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 PhaseTwo(pBt, 1)
10420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
10430 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 sqlite3EndBe
10440 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 nignMalloc();.
10450 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 enable_simulat
10460 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a ed_io_errors();.
10470 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 . sqlite3Vtab
10480 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a Commit(db);. }.
10490 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e #endif.. return
104a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 rc;.}../* .** T
104b0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 his routine chec
104c0 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 ks that the sqli
104d0 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 te3.nVdbeActive
104e0 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a count variable.*
104f0 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 * matches the nu
10500 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 mber of vdbe's i
10510 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 n the list sqlit
10520 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 e3.pVdbe that ar
10530 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 e.** currently a
10540 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 ctive. An assert
10550 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 ion fails if the
10560 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e two counts do n
10570 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 ot match..** Thi
10580 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c s is an internal
10590 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 self-check only
105a0 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 - it is not an
105b0 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 essential proces
105c0 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a sing.** step..**
105d0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f .** This is a no
105e0 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 -op if NDEBUG is
105f0 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 defined..*/.#if
10600 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 ndef NDEBUG.stat
10610 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 ic void checkAct
10620 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 iveVdbeCnt(sqlit
10630 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 e3 *db){. Vdbe
10640 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 *p;. int cnt =
10650 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 0;. int nWrite
10660 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 = 0;. int nRead
10670 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e = 0;. p = db->
10680 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 pVdbe;. while(
10690 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c p ){. if( sql
106a0 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 ite3_stmt_busy((
106b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 sqlite3_stmt*)p)
106c0 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b ){. cnt++;
106d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 . if( p->re
106e0 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 adOnly==0 ) nWri
106f0 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 te++;. if(
10700 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e p->bIsReader ) n
10710 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 Read++;. }.
10720 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a p = p->pNext;.
10730 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e }. assert( cn
10740 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 t==db->nVdbeActi
10750 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ve );. assert(
10760 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 nWrite==db->nVdb
10770 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 eWrite );. asse
10780 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e rt( nRead==db->n
10790 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 VdbeRead );.}.#e
107a0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 lse.#define chec
107b0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 kActiveVdbeCnt(x
107c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 ).#endif../*.**
107d0 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 If the Vdbe pass
107e0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 ed as the first
107f0 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 argument opened
10800 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e a statement-tran
10810 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 saction,.** clos
10820 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 e it now. Argume
10830 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 nt eOp must be e
10840 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f ither SAVEPOINT_
10850 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 ROLLBACK or.** S
10860 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 AVEPOINT_RELEASE
10870 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 . If it is SAVEP
10880 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 OINT_ROLLBACK, t
10890 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e hen the statemen
108a0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e t.** transaction
108b0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e is rolled back.
108c0 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 If eOp is SAVEP
108d0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 OINT_RELEASE, th
108e0 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 en the .** state
108f0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
10900 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a is committed..*
10910 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 *.** If an IO er
10920 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 ror occurs, an S
10930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 QLITE_IOERR_XXX
10940 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 error code is re
10950 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 turned. .** Othe
10960 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e rwise SQLITE_OK.
10970 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
10980 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e dbeCloseStatemen
10990 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 t(Vdbe *p, int e
109a0 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a Op){. sqlite3 *
109b0 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 const db = p->db
109c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c ;. int rc = SQL
109d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 ITE_OK;.. /* If
109e0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 p->iStatement i
109f0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a s greater than z
10a00 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 ero, then this V
10a10 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 dbe opened a .
10a20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 ** statement tra
10a30 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 nsaction that sh
10a40 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 ould be closed h
10a50 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 ere. The only ex
10a60 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 ception. ** is
10a70 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 that an IO error
10a80 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 may have occurr
10a90 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 ed, causing an e
10aa0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 mergency rollbac
10ab0 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 k.. ** In this
10ac0 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 case (db->nState
10ad0 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 ment==0), and th
10ae0 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 ere is nothing t
10af0 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 o do.. */. if(
10b00 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 db->nStatement
10b10 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 && p->iStatement
10b20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
10b30 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 const int iSa
10b40 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 vepoint = p->iSt
10b50 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 atement-1;..
10b60 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 assert( eOp==SAV
10b70 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 EPOINT_ROLLBACK
10b80 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e || eOp==SAVEPOIN
10b90 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 T_RELEASE);.
10ba0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 assert( db->nSta
10bb0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 tement>0 );.
10bc0 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 assert( p->iStat
10bd0 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 ement==(db->nSta
10be0 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 tement+db->nSave
10bf0 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 point) );.. f
10c00 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 or(i=0; i<db->nD
10c10 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 b; i++){ .
10c20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 int rc2 = SQLITE
10c30 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 _OK;. Btree
10c40 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
10c50 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 i].pBt;. if
10c60 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 ( pBt ){.
10c70 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f if( eOp==SAVEPO
10c80 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a INT_ROLLBACK ){.
10c90 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 rc2 =
10ca0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 sqlite3BtreeSave
10cb0 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 point(pBt, SAVEP
10cc0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 OINT_ROLLBACK, i
10cd0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 Savepoint);.
10ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
10cf0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b ( rc2==SQLITE_OK
10d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 ){. rc
10d10 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 2 = sqlite3Btree
10d20 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 Savepoint(pBt, S
10d30 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 AVEPOINT_RELEASE
10d40 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 , iSavepoint);.
10d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
10d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
10d70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 OK ){.
10d80 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 rc = rc2;.
10d90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
10da0 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 }. db->nState
10db0 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 ment--;. p->i
10dc0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a Statement = 0;..
10dd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
10de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 TE_OK ){. i
10df0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e f( eOp==SAVEPOIN
10e00 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 T_ROLLBACK ){.
10e10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
10e20 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 e3VtabSavepoint(
10e30 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f db, SAVEPOINT_RO
10e40 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 LLBACK, iSavepoi
10e50 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 nt);. }.
10e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
10e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
10e80 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 rc = sqlite3Vtab
10e90 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 Savepoint(db, SA
10ea0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c VEPOINT_RELEASE,
10eb0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 iSavepoint);.
10ec0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
10ed0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 /* If the state
10ee0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
10ef0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 is being rolled
10f00 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 back, also rest
10f10 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 ore the . **
10f20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 database handles
10f30 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 deferred constr
10f40 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 aint counter to
10f50 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 the value it had
10f60 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 when . ** th
10f70 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e e statement tran
10f80 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e saction was open
10f90 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 ed. */. if(
10fa0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 eOp==SAVEPOINT_R
10fb0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 OLLBACK ){.
10fc0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f db->nDeferredCo
10fd0 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 ns = p->nStmtDef
10fe0 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e Cons;. db->
10ff0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 nDeferredImmCons
11000 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d = p->nStmtDefIm
11010 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d mCons;. }. }
11020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
11030 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 ./*.** This func
11040 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 tion is called w
11050 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f hen a transactio
11060 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 n opened by the
11070 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e database .** han
11080 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 dle associated w
11090 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 ith the VM passe
110a0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 d as an argument
110b0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 is about to be
110c0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 .** committed. I
110d0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 f there are outs
110e0 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 tanding deferred
110f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e foreign key con
11100 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 straint.** viola
11110 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 tions, return SQ
11120 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 LITE_ERROR. Othe
11130 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b rwise, SQLITE_OK
11140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 ..**.** If there
11150 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 are outstanding
11160 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 FK violations a
11170 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e nd this function
11180 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c returns .** SQL
11190 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 ITE_ERROR, set t
111a0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 he result of the
111b0 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f VM to SQLITE_CO
111c0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e NSTRAINT_FOREIGN
111d0 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 KEY.** and write
111e0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 an error messag
111f0 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 e to it. Then re
11200 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
11210 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 R..*/.#ifndef SQ
11220 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 LITE_OMIT_FOREIG
11230 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 N_KEY.int sqlite
11240 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 3VdbeCheckFk(Vdb
11250 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 e *p, int deferr
11260 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a ed){. sqlite3 *
11270 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 db = p->db;. if
11280 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 ( (deferred && (
11290 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e db->nDeferredCon
112a0 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 s+db->nDeferredI
112b0 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c mmCons)>0) . |
112c0 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 | (!deferred &&
112d0 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 p->nFkConstraint
112e0 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d >0) . ){. p-
112f0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e >rc = SQLITE_CON
11300 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b STRAINT_FOREIGNK
11310 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 EY;. p->error
11320 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 Action = OE_Abor
11330 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 t;. sqlite3Se
11340 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 tString(&p->zErr
11350 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47 Msg, db, "FOREIG
11360 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 N KEY constraint
11370 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 failed");. r
11380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
11390 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e OR;. }. return
113a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 SQLITE_OK;.}.#e
113b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 ndif../*.** This
113c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c routine is call
113d0 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 ed the when a VD
113e0 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 BE tries to halt
113f0 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a . If the VDBE.*
11400 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 * has made chang
11410 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 es and is in aut
11420 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 ocommit mode, th
11430 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a en commit those.
11440 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 ** changes. If
11450 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 a rollback is ne
11460 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 eded, then do th
11470 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a e rollback..**.*
11480 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
11490 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 s the only way t
114a0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 o move the state
114b0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a of a VM from.**
114c0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 SQLITE_MAGIC_RU
114d0 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 N to SQLITE_MAGI
114e0 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 C_HALT. It is h
114f0 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 armless to.** ca
11500 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 ll this on a VM
11510 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 that is in the S
11520 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 QLITE_MAGIC_HALT
11530 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 state..**.** Re
11540 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f turn an error co
11550 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d de. If the comm
11560 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d it could not com
11570 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 plete because of
11580 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 .** lock content
11590 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 ion, return SQLI
115a0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c TE_BUSY. If SQL
115b0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 ITE_BUSY is retu
115c0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e rned, it.** mean
115d0 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 s the close did
115e0 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e not happen and n
115f0 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 eeds to be repea
11600 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 ted..*/.int sqli
11610 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 te3VdbeHalt(Vdbe
11620 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 *p){. int rc;
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11640 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 /* Used
11650 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 to store transie
11660 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 nt return codes
11670 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 */. sqlite3 *db
11680 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 = p->db;.. /*
11690 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f This function co
116a0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 ntains the logic
116b0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 that determines
116c0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 if a statement
116d0 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 or. ** transact
116e0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d ion will be comm
116f0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 itted or rolled
11700 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 back as a result
11710 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 of the. ** exe
11720 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 cution of this v
11730 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 irtual machine.
11740 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e . **. ** If an
11750 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 y of the followi
11760 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a ng errors occur:
11770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 . **. ** S
11780 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a QLITE_NOMEM. **
11790 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 SQLITE_IOER
117a0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 R. ** SQLIT
117b0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 E_FULL. **
117c0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 SQLITE_INTERRUPT
117d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 . **. ** Then
117e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 the internal cac
117f0 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 he might have be
11800 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e en left in an in
11810 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 consistent. **
11820 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 state. We need
11830 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 to rollback the
11840 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 statement transa
11850 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 ction, if there
11860 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 is. ** one, or
11870 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 the complete tra
11880 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 nsaction if ther
11890 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e e is no statemen
118a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 t transaction..
118b0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 */.. if( p->db
118c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
118d0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 {. p->rc = SQ
118e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a LITE_NOMEM;. }.
118f0 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c if( p->aOnceFl
11900 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 ag ) memset(p->a
11910 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e OnceFlag, 0, p->
11920 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c nOnceFlag);. cl
11930 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 oseAllCursors(p)
11940 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 ;. if( p->magic
11950 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e !=VDBE_MAGIC_RUN
11960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){. return S
11970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 QLITE_OK;. }.
11980 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 checkActiveVdbeC
11990 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f nt(db);.. /* No
119a0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 commit or rollb
119b0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 ack needed if th
119c0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 e program never
119d0 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 started or if th
119e0 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 e. ** SQL state
119f0 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 ment does not re
11a00 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 ad or write a da
11a10 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f tabase file. */
11a20 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 . if( p->pc>=0
11a30 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 && p->bIsReader
11a40 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 ){. int mrc;
11a50 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 /* Primary err
11a60 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e or code from p->
11a70 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 rc */. int eS
11a80 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a tatementOp = 0;.
11a90 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 int isSpecia
11aa0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 lError;
11ab0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 /* Set to tru
11ac0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 e if a 'special'
11ad0 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f error */.. /
11ae0 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 * Lock all btree
11af0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 s used by the st
11b00 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 atement */. s
11b10 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 qlite3VdbeEnter(
11b20 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 p);.. /* Chec
11b30 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 k for one of the
11b40 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 special errors
11b50 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e */. mrc = p->
11b60 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 rc & 0xff;. i
11b70 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 sSpecialError =
11b80 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 mrc==SQLITE_NOME
11b90 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 M || mrc==SQLITE
11ba0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 _IOERR.
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d || m
11bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 rc==SQLITE_INTER
11bd0 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c RUPT || mrc==SQL
11be0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 ITE_FULL;. if
11bf0 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 ( isSpecialError
11c00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 ){. /* If
11c10 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 the query was re
11c20 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 ad-only and the
11c30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 error code is SQ
11c40 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 LITE_INTERRUPT,
11c50 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c . ** no rol
11c60 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 lback is necessa
11c70 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 ry. Otherwise, a
11c80 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f t least a savepo
11c90 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 int . ** tr
11ca0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 ansaction must b
11cb0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f e rolled back to
11cc0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 restore the dat
11cd0 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 abase to a .
11ce0 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 ** consistent
11cf0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a state.. **.
11d00 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 ** Even if
11d10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 the statement i
11d20 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 s read-only, it
11d30 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 is important to
11d40 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a perform. **
11d50 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 a statement or
11d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c transaction roll
11d70 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 back operation.
11d80 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 If the error .
11d90 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 ** occurred
11da0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f while writing to
11db0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 the journal, su
11dc0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 b-journal or dat
11dd0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 abase. ** f
11de0 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 ile as part of a
11df0 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 n effort to free
11e00 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20 up cache space
11e10 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 (see function.
11e20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 ** pagerStre
11e30 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 ss() in pager.c)
11e40 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 , the rollback i
11e50 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 s required to re
11e60 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 store . **
11e70 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 the pager to a c
11e80 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e onsistent state.
11e90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 . */.
11ea0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 if( !p->readOnly
11eb0 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f || mrc!=SQLITE_
11ec0 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 INTERRUPT ){.
11ed0 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 if( (mrc==S
11ee0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d QLITE_NOMEM || m
11ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 rc==SQLITE_FULL)
11f00 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a && p->usesStmtJ
11f10 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 ournal ){.
11f20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 eStatementOp
11f30 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c = SAVEPOINT_ROL
11f40 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d LBACK;. }
11f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 else{.
11f60 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 /* We are forced
11f70 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 to roll back th
11f80 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 e active transac
11f90 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 tion. Before doi
11fa0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 ng. **
11fb0 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 so, abort any ot
11fc0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 her statements t
11fd0 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 his handle curre
11fe0 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e ntly has active.
11ff0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 . */.
12000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 sqlite3R
12010 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 ollbackAll(db, S
12020 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c QLITE_ABORT_ROLL
12030 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 BACK);.
12040 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 sqlite3CloseSav
12050 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 epoints(db);.
12060 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 db->autoC
12070 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 ommit = 1;.
12080 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 p->nChange
12090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 = 0;. }.
120a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 }. }..
120b0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 /* Check for i
120c0 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e mmediate foreign
120d0 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e key violations.
120e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 */. if( p->r
120f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
12100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
12110 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a eCheckFk(p, 0);.
12120 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 }. . /*
12130 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d If the auto-comm
12140 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 it flag is set a
12150 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f nd this is the o
12160 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 nly active write
12170 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 r . ** VM, th
12180 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 en we do either
12190 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c a commit or roll
121a0 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 back of the curr
121b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e ent transaction.
121c0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 . **. **
121d0 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b Note: This block
121e0 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e also runs if on
121f0 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c e of the special
12200 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 errors handled
12210 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 . ** above ha
12220 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 s occurred. .
12230 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c */. if( !sql
12240 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 ite3VtabInSync(d
12250 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e b) . && db->
12260 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 autoCommit .
12270 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 && db->nVdbeWri
12280 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 te==(p->readOnly
12290 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 ==0) . ){.
122a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 if( p->rc==SQ
122b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 LITE_OK || (p->e
122c0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 rrorAction==OE_F
122d0 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 ail && !isSpecia
122e0 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 lError) ){.
122f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 rc = sqlite3V
12300 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 dbeCheckFk(p, 1)
12310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 ;. if( rc
12320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
12330 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 if( NEV
12340 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 ER(p->readOnly)
12350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 ){. s
12360 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 qlite3VdbeLeave(
12370 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 p);.
12380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
12390 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d ROR;. }
123a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
123b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e SQLITE_CONSTRAIN
123c0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 T_FOREIGNKEY;.
123d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 }else{ .
123e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 /* The a
123f0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 uto-commit flag
12400 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 is true, the vdb
12410 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 e program was su
12420 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 ccessful .
12430 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e ** or hit an
12440 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 'OR FAIL' const
12450 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 raint and there
12460 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 are no deferred
12470 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 foreign.
12480 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 ** key constra
12490 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 ints to hold up
124a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e the transaction.
124b0 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f This means a co
124c0 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 mmit .
124d0 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 ** is required.
124e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 */. rc
124f0 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c = vdbeCommit(db,
12500 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 p);. }.
12510 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 if( rc==S
12520 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d QLITE_BUSY && p-
12530 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 >readOnly ){.
12540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
12550 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 beLeave(p);.
12560 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
12570 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 ITE_BUSY;.
12580 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d }else if( rc!=
12590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
125a0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 p->rc = r
125b0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c c;. sql
125c0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 ite3RollbackAll(
125d0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a db, SQLITE_OK);.
125e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 p->nCh
125f0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 ange = 0;.
12600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
12610 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 db->nDeferred
12620 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 Cons = 0;.
12630 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 db->nDeferre
12640 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 dImmCons = 0;.
12650 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 db->flag
12660 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 s &= ~SQLITE_Def
12670 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 erFKs;.
12680 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e sqlite3CommitIn
12690 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 ternalChanges(db
126a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
126b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
126c0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 sqlite3Rollbac
126d0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f kAll(db, SQLITE_
126e0 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e OK);. p->
126f0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 nChange = 0;.
12700 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e }. db->n
12710 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 Statement = 0;.
12720 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 }else if( eSt
12730 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a atementOp==0 ){.
12740 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d if( p->rc=
12750 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d =SQLITE_OK || p-
12760 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 >errorAction==OE
12770 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 _Fail ){.
12780 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 eStatementOp =
12790 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
127a0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 E;. }else i
127b0 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f f( p->errorActio
127c0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 n==OE_Abort ){.
127d0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e eStatemen
127e0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f tOp = SAVEPOINT_
127f0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 ROLLBACK;.
12800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 }else{. s
12810 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c qlite3RollbackAl
12820 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f l(db, SQLITE_ABO
12830 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 RT_ROLLBACK);.
12840 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f sqlite3Clo
12850 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 seSavepoints(db)
12860 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 ;. db->au
12870 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 toCommit = 1;.
12880 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 p->nChange
12890 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 0;. }.
128a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 }. . /* If
128b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 eStatementOp is
128c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 non-zero, then
128d0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e a statement tran
128e0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f saction needs to
128f0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 . ** be commi
12900 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 tted or rolled b
12910 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 ack. Call sqlite
12920 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 3VdbeCloseStatem
12930 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 ent() to. **
12940 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f do so. If this o
12950 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 peration returns
12960 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 an error, and t
12970 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 he current state
12980 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f ment. ** erro
12990 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 r code is SQLITE
129a0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f _OK or SQLITE_CO
129b0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 NSTRAINT, then p
129c0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a romote the. *
129d0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d * current statem
129e0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a ent error code..
129f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 */. if( e
12a00 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 StatementOp ){.
12a10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
12a20 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 3VdbeCloseStatem
12a30 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e ent(p, eStatemen
12a40 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 tOp);. if(
12a50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 rc ){. if
12a60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
12a70 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 OK || (p->rc&0xf
12a80 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 f)==SQLITE_CONST
12a90 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 RAINT ){.
12aa0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 p->rc = rc;.
12ab0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
12ac0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 DbFree(db, p->zE
12ad0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 rrMsg);.
12ae0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 p->zErrMsg = 0
12af0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
12b00 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 sqlite3Rollb
12b10 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 ackAll(db, SQLIT
12b20 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b E_ABORT_ROLLBACK
12b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 );. sqlit
12b40 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 e3CloseSavepoint
12b50 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 s(db);. d
12b60 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 b->autoCommit =
12b70 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 1;. p->nC
12b80 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 hange = 0;.
12b90 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 }. }. .
12ba0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 /* If this was a
12bb0 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 n INSERT, UPDATE
12bc0 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e or DELETE and n
12bd0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e o statement tran
12be0 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 saction. ** h
12bf0 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 as been rolled b
12c00 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 ack, update the
12c10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
12c20 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 ion change-count
12c30 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 er. . */.
12c40 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 if( p->changeCnt
12c50 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 On ){. if(
12c60 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 eStatementOp!=SA
12c70 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b VEPOINT_ROLLBACK
12c80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
12c90 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 te3VdbeSetChange
12ca0 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 s(db, p->nChange
12cb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a );. }else{.
12cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
12cd0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 dbeSetChanges(db
12ce0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 , 0);. }.
12cf0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d p->nChange =
12d00 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
12d10 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f * Release the lo
12d20 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 cks */. sqlit
12d30 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a e3VdbeLeave(p);.
12d40 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 }.. /* We hav
12d50 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 e successfully h
12d60 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 alted and closed
12d70 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 the VM. Record
12d80 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 this fact. */.
12d90 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b if( p->pc>=0 ){
12da0 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 . db->nVdbeAc
12db0 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 tive--;. if(
12dc0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 !p->readOnly ) d
12dd0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b b->nVdbeWrite--;
12de0 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 . if( p->bIsR
12df0 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 eader ) db->nVdb
12e00 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 eRead--;. ass
12e10 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 ert( db->nVdbeAc
12e20 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 tive>=db->nVdbeR
12e30 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 ead );. asser
12e40 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 t( db->nVdbeRead
12e50 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 >=db->nVdbeWrite
12e60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
12e70 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d db->nVdbeWrite>=
12e80 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 0 );. }. p->ma
12e90 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
12ea0 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 _HALT;. checkAc
12eb0 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b tiveVdbeCnt(db);
12ec0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 . if( p->db->ma
12ed0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 llocFailed ){.
12ee0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 p->rc = SQLITE
12ef0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f _NOMEM;. }.. /
12f00 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f * If the auto-co
12f10 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 mmit flag is set
12f20 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 to true, then a
12f30 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 ny locks that we
12f40 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 re held. ** by
12f50 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 connection db ha
12f60 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 ve now been rele
12f70 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 ased. Call sqlit
12f80 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f e3ConnectionUnlo
12f90 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 cked() . ** to
12fa0 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 invoke any requi
12fb0 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 red unlock-notif
12fc0 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a y callbacks.. *
12fd0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f /. if( db->auto
12fe0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 Commit ){. sq
12ff0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 lite3ConnectionU
13000 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d nlocked(db);. }
13010 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e .. assert( db->
13020 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c nVdbeActive>0 ||
13030 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d db->autoCommit=
13040 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 =0 || db->nState
13050 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 ment==0 );. ret
13060 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 urn (p->rc==SQLI
13070 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 TE_BUSY ? SQLITE
13080 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f _BUSY : SQLITE_O
13090 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 K);.}.../*.** Ea
130a0 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 ch VDBE holds th
130b0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 e result of the
130c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 most recent sqli
130d0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a te3_step() call.
130e0 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 ** in p->rc. Th
130f0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 is routine sets
13100 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b that result back
13110 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a to SQLITE_OK..*
13120 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
13130 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c beResetStepResul
13140 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d t(Vdbe *p){. p-
13150 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b >rc = SQLITE_OK;
13160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 .}../*.** Copy t
13170 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e he error code an
13180 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 d error message
13190 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 belonging to the
131a0 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 VDBE passed.**
131b0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 as the first arg
131c0 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 ument to its dat
131d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f abase handle (so
131e0 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 that they will
131f0 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 be .** returned
13200 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 by calls to sqli
13210 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e te3_errcode() an
13220 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 d sqlite3_errmsg
13230 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ())..**.** This
13240 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f function does no
13250 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 t clear the VDBE
13260 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d error code or m
13270 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 essage, just.**
13280 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 copies them to t
13290 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 he database hand
132a0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 le..*/.int sqlit
132b0 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 e3VdbeTransferEr
132c0 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ror(Vdbe *p){.
132d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d sqlite3 *db = p-
132e0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 >db;. int rc =
132f0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e p->rc;. if( p->
13300 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 zErrMsg ){. u
13310 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 8 mallocFailed =
13320 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
13330 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 d;. sqlite3Be
13340 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 ginBenignMalloc(
13350 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 );. if( db->p
13360 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 Err==0 ) db->pEr
13370 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 r = sqlite3Value
13380 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c New(db);. sql
13390 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 ite3ValueSetStr(
133a0 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d db->pErr, -1, p-
133b0 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 >zErrMsg, SQLITE
133c0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 _UTF8, SQLITE_TR
133d0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 ANSIENT);. sq
133e0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 lite3EndBenignMa
133f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e lloc();. db->
13400 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d mallocFailed = m
13410 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 allocFailed;.
13420 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 db->errCode = r
13430 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 c;. }else{.
13440 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c sqlite3Error(db,
13450 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 rc);. }. retu
13460 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 rn rc;.}..#ifdef
13470 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 SQLITE_ENABLE_S
13480 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 QLLOG./*.** If a
13490 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f n SQLITE_CONFIG_
134a0 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 SQLLOG hook is r
134b0 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 egistered and th
134c0 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 e VM has been ru
134d0 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 n, .** invoke it
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
134f0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f vdbeInvokeSqllo
13500 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 g(Vdbe *v){. if
13510 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 ( sqlite3GlobalC
13520 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 onfig.xSqllog &&
13530 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f v->rc==SQLITE_O
13540 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 K && v->zSql &&
13550 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 v->pc>=0 ){.
13560 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 char *zExpanded
13570 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 = sqlite3VdbeExp
13580 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 andSql(v, v->zSq
13590 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 l);. assert(
135a0 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 v->db->init.busy
135b0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a ==0 );. if( z
135c0 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 Expanded ){.
135d0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 sqlite3GlobalC
135e0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 onfig.xSqllog(.
135f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
13600 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 GlobalConfig.pSq
13610 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 llogArg, v->db,
13620 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 zExpanded, 1.
13630 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 );. sqli
13640 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c te3DbFree(v->db,
13650 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 zExpanded);.
13660 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 }. }.}.#else.#
13670 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f define vdbeInvo
13680 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 keSqllog(x).#end
13690 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 if../*.** Clean
136a0 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 up a VDBE after
136b0 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f execution but do
136c0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 not delete the
136d0 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a VDBE just yet..*
136e0 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f * Write any erro
136f0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 r messages into
13700 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 *pzErrMsg. Retu
13710 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f rn the result co
13720 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 de..**.** After
13730 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
13740 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 run, the VDBE sh
13750 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f ould be ready to
13760 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 be executed.**
13770 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 again..**.** To
13780 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 look at it anoth
13790 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 er way, this rou
137a0 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 tine resets the
137b0 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 state of the.**
137c0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 virtual machine
137d0 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f from VDBE_MAGIC_
137e0 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 RUN or VDBE_MAGI
137f0 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a C_HALT back to.*
13800 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 * VDBE_MAGIC_INI
13810 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 T..*/.int sqlite
13820 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 3VdbeReset(Vdbe
13830 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a *p){. sqlite3 *
13840 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 db;. db = p->db
13850 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 ;.. /* If the V
13860 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f M did not run to
13870 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 completion or i
13880 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 f it encountered
13890 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 an. ** error,
138a0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f then it might no
138b0 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 t have been halt
138c0 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f ed properly. So
138d0 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f halt. ** it no
138e0 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 w.. */. sqlite
138f0 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 3VdbeHalt(p);..
13900 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 /* If the VDBE
13910 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 has be run even
13920 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 partially, then
13930 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 transfer the err
13940 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 or code. ** and
13950 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 error message f
13960 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 rom the VDBE int
13970 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 o the main datab
13980 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 ase structure.
13990 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 But. ** if the
139a0 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 VDBE has just be
139b0 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 en set to run bu
139c0 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c t has not actual
139d0 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a ly executed any.
139e0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e ** instruction
139f0 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 s yet, leave the
13a00 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 main database e
13a10 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e rror information
13a20 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f unchanged.. */
13a30 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 . if( p->pc>=0
13a40 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b ){. vdbeInvok
13a50 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 eSqllog(p);.
13a60 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 sqlite3VdbeTrans
13a70 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 ferError(p);.
13a80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
13a90 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a b, p->zErrMsg);.
13aa0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d p->zErrMsg =
13ab0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 0;. if( p->r
13ac0 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e unOnlyOnce ) p->
13ad0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d expired = 1;. }
13ae0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 else if( p->rc &
13af0 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a & p->expired ){.
13b00 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 /* The expir
13b10 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 ed flag was set
13b20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f on the VDBE befo
13b30 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c re the first cal
13b40 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 l. ** to sqli
13b50 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 te3_step(). For
13b60 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e consistency (sin
13b70 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 ce sqlite3_step(
13b80 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c ) was. ** cal
13b90 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 led), set the da
13ba0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 tabase error in
13bb0 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c this case as wel
13bc0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 l.. */. sq
13bd0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 lite3ErrorWithMs
13be0 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e g(db, p->rc, p->
13bf0 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a zErrMsg ? "%s" :
13c00 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0, p->zErrMsg);
13c10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 . sqlite3DbFr
13c20 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 ee(db, p->zErrMs
13c30 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d g);. p->zErrM
13c40 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f sg = 0;. }.. /
13c50 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 * Reclaim all me
13c60 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 mory used by the
13c70 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 VDBE. */. Cle
13c80 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 anup(p);.. /* S
13c90 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e ave profiling in
13ca0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 formation from t
13cb0 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 his VDBE run..
13cc0 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 */.#ifdef VDBE_P
13cd0 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 ROFILE. {. F
13ce0 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e ILE *out = fopen
13cf0 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f ("vdbe_profile.o
13d00 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 ut", "a");. i
13d10 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 f( out ){.
13d20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 int i;. fpr
13d30 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 intf(out, "----
13d40 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d ");. for(i=
13d50 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 0; i<p->nOp; i++
13d60 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e ){. fprin
13d70 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 tf(out, "%02x",
13d80 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 p->aOp[i].opcode
13d90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
13da0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c fprintf(out, "\
13db0 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 n");. if( p
13dc0 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 ->zSql ){.
13dd0 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 char c, pc = 0
13de0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 ;. fprint
13df0 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 f(out, "-- ");.
13e00 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 for(i=0;
13e10 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 (c = p->zSql[i])
13e20 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 !=0; i++){.
13e30 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e if( pc=='\n
13e40 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c ' ) fprintf(out,
13e50 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 "-- ");.
13e60 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b putc(c, out);
13e70 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 . pc =
13e80 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 c;. }.
13e90 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e if( pc!='\n
13ea0 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c ' ) fprintf(out,
13eb0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a "\n");. }.
13ec0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 for(i=0; i
13ed0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 <p->nOp; i++){.
13ee0 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 char zHdr
13ef0 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 [100];. s
13f00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
13f10 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 sizeof(zHdr), zH
13f20 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 dr, "%6u %12llu
13f30 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 %8llu ",.
13f40 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e p->aOp[i].cn
13f50 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d t,. p-
13f60 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a >aOp[i].cycles,.
13f70 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f p->aO
13f80 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e p[i].cnt>0 ? p->
13f90 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d aOp[i].cycles/p-
13fa0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a >aOp[i].cnt : 0.
13fb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 );.
13fc0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 fprintf(out,
13fd0 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 "%s", zHdr);.
13fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 sqlite3Vdbe
13ff0 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 PrintOp(out, i,
14000 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 &p->aOp[i]);.
14010 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 }. fclos
14020 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 e(out);. }.
14030 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 }.#endif. p->iC
14040 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a urrentTime = 0;.
14050 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 p->magic = VDB
14060 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 E_MAGIC_INIT;.
14070 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 return p->rc & d
14080 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a b->errMask;.}. .
14090 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 /*.** Clean up a
140a0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 nd delete a VDBE
140b0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e after execution
140c0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 . Return an int
140d0 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a eger which is.**
140e0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 the result code
140f0 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 . Write any err
14100 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 or message text
14110 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a into *pzErrMsg..
14120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
14130 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 beFinalize(Vdbe
14140 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 *p){. int rc =
14150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 SQLITE_OK;. if(
14160 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
14170 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e MAGIC_RUN || p->
14180 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
14190 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 C_HALT ){. rc
141a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 = sqlite3VdbeRe
141b0 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 set(p);. asse
141c0 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d rt( (rc & p->db-
141d0 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b >errMask)==rc );
141e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 . }. sqlite3Vd
141f0 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 beDelete(p);. r
14200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
14210 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 ** If parameter
14220 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e iOp is less than
14230 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f zero, then invo
14240 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f ke the destructo
14250 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 r for.** all aux
14260 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e iliary data poin
14270 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 ters currently c
14280 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 ached by the VM
14290 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 passed as.** the
142a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e first argument.
142b0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f .**.** Or, if iO
142c0 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 p is greater tha
142d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 n or equal to ze
142e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 ro, then the des
142f0 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e tructor is.** on
14300 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 ly invoked for t
14310 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 hose auxiliary d
14320 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 ata pointers cre
14330 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 ated by the user
14340 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e .** function in
14350 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f voked by the OP_
14360 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 Function opcode
14370 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 at instruction i
14380 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 Op of .** VM pVd
14390 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 be, and only the
143a0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a n if:.**.** *
143b0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 the associated
143c0 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 function paramet
143d0 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f er is the 32nd o
143e0 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e r later (countin
143f0 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c g.** from l
14400 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f eft to right), o
14410 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 r.**.** * the
14420 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 corresponding b
14430 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d it in argument m
14440 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 ask is clear (wh
14450 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a ere the first.**
14460 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 function p
14470 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 arameter corresp
14480 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 onds to bit 0 et
14490 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c c.)..*/.void sql
144a0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 ite3VdbeDeleteAu
144b0 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 xData(Vdbe *pVdb
144c0 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 e, int iOp, int
144d0 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 mask){. AuxData
144e0 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e **pp = &pVdbe->
144f0 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c pAuxData;. whil
14500 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 e( *pp ){. Au
14510 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 xData *pAux = *p
14520 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c p;. if( (iOp<
14530 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 0). || (pAux
14540 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 ->iOp==iOp && (p
14550 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 Aux->iArg>31 ||
14560 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 !(mask & MASKBIT
14570 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 32(pAux->iArg)))
14580 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 ). ){. t
14590 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 estcase( pAux->i
145a0 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 Arg==31 );.
145b0 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 if( pAux->xDele
145c0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 te ){. pA
145d0 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 ux->xDelete(pAux
145e0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d ->pAux);. }
145f0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 . *pp = pAu
14600 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 x->pNext;.
14610 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 sqlite3DbFree(pV
14620 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a dbe->db, pAux);.
14630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
14640 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 pp= &pAux->pNex
14650 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a t;. }. }.}..
14660 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d /*.** Free all m
14670 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 emory associated
14680 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 with the Vdbe p
14690 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 assed as the sec
146a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a ond argument,.**
146b0 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 except for obje
146c0 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 ct itself, which
146d0 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a is preserved..*
146e0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 *.** The differe
146f0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 nce between this
14700 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 function and sq
14710 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 lite3VdbeDelete(
14720 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 ) is that.** Vdb
14730 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 eDelete() also u
14740 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 nlinks the Vdbe
14750 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 from the list of
14760 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 VMs associated
14770 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 with.** the data
14780 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
14790 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 and frees the ob
147a0 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a ject itself..*/.
147b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
147c0 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 ClearObject(sqli
147d0 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 te3 *db, Vdbe *p
147e0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 ){. SubProgram
147f0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 *pSub, *pNext;.
14800 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 int i;. assert
14810 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d ( p->db==0 || p-
14820 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c >db==db );. rel
14830 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e easeMemArray(p->
14840 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a aVar, p->nVar);.
14850 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 releaseMemArra
14860 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 y(p->aColName, p
14870 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c ->nResColumn*COL
14880 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 NAME_N);. for(p
14890 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b Sub=p->pProgram;
148a0 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 pSub; pSub=pNex
148b0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 t){. pNext =
148c0 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 pSub->pNext;.
148d0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 vdbeFreeOpArray
148e0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 (db, pSub->aOp,
148f0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 pSub->nOp);.
14900 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
14910 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 , pSub);. }. f
14920 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b or(i=p->nzVar-1;
14930 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 i>=0; i--) sqli
14940 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
14950 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 >azVar[i]);. vd
14960 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 beFreeOpArray(db
14970 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 , p->aOp, p->nOp
14980 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 );. sqlite3DbFr
14990 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 ee(db, p->aColNa
149a0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 me);. sqlite3Db
149b0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c Free(db, p->zSql
149c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 );. sqlite3DbFr
149d0 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 ee(db, p->pFree)
149e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
149f0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e ENABLE_STMT_SCAN
14a00 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 STATUS. for(i=0
14a10 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b ; i<p->nScan; i+
14a20 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 +){. sqlite3D
14a30 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 bFree(db, p->aSc
14a40 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 an[i].zName);.
14a50 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 }. sqlite3DbFre
14a60 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b e(db, p->aScan);
14a70 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a .#endif.}../*.**
14a80 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 Delete an entir
14a90 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 e VDBE..*/.void
14aa0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 sqlite3VdbeDelet
14ab0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 e(Vdbe *p){. sq
14ac0 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 lite3 *db;.. if
14ad0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 ( NEVER(p==0) )
14ae0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 return;. db = p
14af0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 ->db;. assert(
14b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 sqlite3_mutex_he
14b10 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b ld(db->mutex) );
14b20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c . sqlite3VdbeCl
14b30 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 earObject(db, p)
14b40 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 ;. if( p->pPrev
14b50 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 ){. p->pPrev
14b60 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 ->pNext = p->pNe
14b70 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 xt;. }else{.
14b80 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 assert( db->pVd
14b90 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d be==p );. db-
14ba0 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 >pVdbe = p->pNex
14bb0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e t;. }. if( p->
14bc0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e pNext ){. p->
14bd0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 pNext->pPrev = p
14be0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 ->pPrev;. }. p
14bf0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d ->magic = VDBE_M
14c00 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e AGIC_DEAD;. p->
14c10 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 db = 0;. sqlite
14c20 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 3DbFree(db, p);.
14c30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 }../*.** The cur
14c40 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 sor "p" has a pe
14c50 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 nding seek opera
14c60 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f tion that has no
14c70 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 t yet been.** ca
14c80 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b rried out. Seek
14c90 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e the cursor now.
14ca0 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 If an error oc
14cb0 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 curs, return.**
14cc0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 the appropriate
14cd0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 error code..*/.s
14ce0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 tatic int SQLITE
14cf0 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 _NOINLINE handle
14d00 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 DeferredMoveto(V
14d10 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 dbeCursor *p){.
14d20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 int res, rc;.#i
14d30 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 fdef SQLITE_TEST
14d40 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 . extern int sq
14d50 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 lite3_search_cou
14d60 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 nt;.#endif. ass
14d70 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 ert( p->deferred
14d80 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 Moveto );. asse
14d90 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 rt( p->isTable )
14da0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 ;. rc = sqlite3
14db0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 BtreeMovetoUnpac
14dc0 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 ked(p->pCursor,
14dd0 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 0, p->movetoTarg
14de0 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 et, 0, &res);.
14df0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 if( rc ) return
14e00 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 rc;. if( res!=0
14e10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ) return SQLITE
14e20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 _CORRUPT_BKPT;.#
14e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 ifdef SQLITE_TES
14e40 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 T. sqlite3_sear
14e50 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 ch_count++;.#end
14e60 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 if. p->deferred
14e70 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d Moveto = 0;. p-
14e80 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 >cacheStatus = C
14e90 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 ACHE_STALE;. re
14ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
14eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 }../*.** Somethi
14ec0 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 ng has moved cur
14ed0 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 sor "p" out of p
14ee0 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 lace. Maybe the
14ef0 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 row it was.** p
14f00 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 ointed to was de
14f10 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 leted out from u
14f20 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 nder it. Or may
14f30 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 be the btree was
14f40 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 .** rebalanced.
14f50 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 Whatever the ca
14f60 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 use, try to rest
14f70 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 ore "p" to the p
14f80 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 lace it.** is su
14f90 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 pposed to be poi
14fa0 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 nting. If the r
14fb0 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f ow was deleted o
14fc0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 ut from under th
14fd0 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 e.** cursor, set
14fe0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 the cursor to p
14ff0 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 oint to a NULL r
15000 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ow..*/.static in
15010 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e t SQLITE_NOINLIN
15020 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 E handleMovedCur
15030 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a sor(VdbeCursor *
15040 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 p){. int isDiff
15050 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 erentRow, rc;.
15060 61 73 73 65 72 74 28 20 70 2d 3e 70 43 75 72 73 assert( p->pCurs
15070 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 or!=0 );. asser
15080 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 t( sqlite3BtreeC
15090 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d ursorHasMoved(p-
150a0 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 >pCursor) );. r
150b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 c = sqlite3Btree
150c0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d CursorRestore(p-
150d0 3e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 >pCursor, &isDif
150e0 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d ferentRow);. p-
150f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 >cacheStatus = C
15100 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 ACHE_STALE;. if
15110 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 ( isDifferentRow
15120 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 ) p->nullRow =
15130 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 1;. return rc;.
15140 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 }../*.** Check t
15150 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 o ensure that th
15160 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 e cursor is vali
15170 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 d. Restore the
15180 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 cursor.** if nee
15190 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e d be. Return an
151a0 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d y I/O error from
151b0 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 the restore ope
151c0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 ration..*/.int s
151d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 qlite3VdbeCursor
151e0 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 Restore(VdbeCurs
151f0 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 73 71 or *p){. if( sq
15200 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 lite3BtreeCursor
15210 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 HasMoved(p->pCur
15220 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 sor) ){. retu
15230 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 rn handleMovedCu
15240 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 rsor(p);. }. r
15250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
15260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 .}../*.** Make s
15270 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 ure the cursor p
15280 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 is ready to rea
15290 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 d or write the r
152a0 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a ow to which it.*
152b0 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 * was last posit
152c0 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 ioned. Return a
152d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 n error code if
152e0 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 an OOM fault or
152f0 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 I/O error.** pre
15300 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f vents us from po
15310 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 sitioning the cu
15320 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 rsor to its corr
15330 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a ect position..**
15340 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 .** If a MoveTo
15350 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e operation is pen
15360 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 ding on the give
15370 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 n cursor, then d
15380 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f o that.** MoveTo
15390 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 now. If no mov
153a0 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 e is pending, ch
153b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 eck to see if th
153c0 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a e row has been.*
153d0 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 * deleted out fr
153e0 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 om under the cur
153f0 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 sor and if it ha
15400 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 s, mark the row
15410 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 as.** a NULL row
15420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 ..**.** If the c
15430 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 ursor is already
15440 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 pointing to the
15450 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 correct row and
15460 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a that row has.**
15470 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 not been delete
15480 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 d out from under
15490 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 the cursor, the
154a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 n this routine i
154b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e s a no-op..*/.in
154c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 t sqlite3VdbeCur
154d0 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 sorMoveto(VdbeCu
154e0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 rsor *p){. if(
154f0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 p->deferredMovet
15500 6f 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 o ){. return
15510 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f handleDeferredMo
15520 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 veto(p);. }. i
15530 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 26 26 f( p->pCursor &&
15540 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 sqlite3BtreeCur
15550 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 sorHasMoved(p->p
15560 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 Cursor) ){. r
15570 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 eturn handleMove
15580 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a dCursor(p);. }.
15590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
155a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 OK;.}../*.** The
155b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 following funct
155c0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 ions:.**.** sqli
155d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 te3VdbeSerialTyp
155e0 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 e().** sqlite3Vd
155f0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
15600 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 ).** sqlite3Vdbe
15610 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 SerialLen().** s
15620 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
15630 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 Put().** sqlite3
15640 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a VdbeSerialGet().
15650 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 **.** encapsulat
15660 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 e the code that
15670 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 serializes value
15680 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e s for storage in
15690 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 SQLite.** data
156a0 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 and index record
156b0 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a s. Each serializ
156c0 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 ed value consist
156d0 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 s of a.** 'seria
156e0 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c l-type' and a bl
156f0 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 ob of data. The
15700 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 serial type is a
15710 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 n 8-byte unsigne
15720 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 d.** integer, st
15730 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 ored as a varint
15740 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 ..**.** In an SQ
15750 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 Lite index recor
15760 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 d, the serial ty
15770 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 pe is stored dir
15780 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 ectly before.**
15790 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 the blob of data
157a0 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 that it corresp
157b0 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 onds to. In a ta
157c0 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 ble record, all
157d0 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 serial.** types
157e0 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 are stored at th
157f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 e start of the r
15800 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 ecord, and the b
15810 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a lobs of data at.
15820 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 ** the end. Henc
15830 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e e these function
15840 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c s allow the call
15850 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 er to handle the
15860 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 .** serial-type
15870 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 and data blob se
15880 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 parately..**.**
15890 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 The following ta
158a0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 ble describes th
158b0 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 e various storag
158c0 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 e classes for da
158d0 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 ta:.**.** seri
158e0 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 al type b
158f0 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 ytes of data
15900 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d type.** ----
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d ---------- -
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 --------------
15930 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
15940 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 -.** 0
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15960 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 0 NUL
15970 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 L.** 1
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15990 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 1 sig
159a0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 ned integer.**
159b0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 2
159c0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 2
159d0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e signed in
159e0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 teger.** 3
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15a00 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 3
15a10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a signed integer.
15a20 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 ** 4
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 4
15a40 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 signe
15a50 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 d integer.**
15a60 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 5
15a70 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 6
15a80 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 signed inte
15a90 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 ger.** 6
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15ab0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 8 s
15ac0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a igned integer.**
15ad0 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 7
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 8
15af0 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c IEEE fl
15b00 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 oat.** 8
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15b20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 0 I
15b30 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 nteger constant
15b40 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 0.** 9
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15b60 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 0 Int
15b70 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a eger constant 1.
15b80 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 ** 10,11
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15ba0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 reser
15bb0 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f ved for expansio
15bc0 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e n.** N>=12 an
15bd0 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d d even (N-
15be0 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 12)/2 BLO
15bf0 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e B.** N>=13 an
15c00 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d d odd (N-
15c10 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 13)/2 tex
15c20 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e t.**.** The 8 an
15c30 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 d 9 types were a
15c40 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 dded in 3.3.0, f
15c50 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 ile format 4. P
15c60 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a rior versions.**
15c70 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 of SQLite will
15c80 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 not understand t
15c90 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 hose serial type
15ca0 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 s..*/../*.** Ret
15cb0 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 urn the serial-t
15cc0 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 ype for the valu
15cd0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d e stored in pMem
15ce0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 ..*/.u32 sqlite3
15cf0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d VdbeSerialType(M
15d00 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 em *pMem, int fi
15d10 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e le_format){. in
15d20 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e t flags = pMem->
15d30 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a flags;. u32 n;.
15d40 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d . if( flags&MEM
15d50 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 _Null ){. ret
15d60 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 urn 0;. }. if(
15d70 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 flags&MEM_Int )
15d80 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 {. /* Figure
15d90 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 out whether to u
15da0 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 se 1, 2, 4, 6 or
15db0 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 8 bytes. */.#
15dc0 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 define MAX_6BYT
15dd0 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 E ((((i64)0x0000
15de0 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 8000)<<32)-1).
15df0 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e i64 i = pMem->
15e00 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a u.i;. u64 u;.
15e10 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 if( i<0 ){.
15e20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 u = ~i;.
15e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 }else{. u
15e40 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 = i;. }. i
15e50 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 f( u<=127 ){.
15e60 20 20 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 return ((i&1)
15e70 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d ==i && file_form
15e80 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 at>=4) ? 8+(u32)
15e90 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 u : 1;. }.
15ea0 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 if( u<=32767 )
15eb0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 return 2;. if
15ec0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 ( u<=8388607 ) r
15ed0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 eturn 3;. if(
15ee0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 u<=2147483647 )
15ef0 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 return 4;. i
15f00 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 f( u<=MAX_6BYTE
15f10 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 ) return 5;.
15f20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 return 6;. }.
15f30 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 if( flags&MEM_Re
15f40 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e al ){. return
15f50 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 7;. }. assert
15f60 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c ( pMem->db->mall
15f70 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 ocFailed || flag
15f80 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 s&(MEM_Str|MEM_B
15f90 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 lob) );. assert
15fa0 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a ( pMem->n>=0 );.
15fb0 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d n = (u32)pMem-
15fc0 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 >n;. if( flags
15fd0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 & MEM_Zero ){.
15fe0 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e n += pMem->u.n
15ff0 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 Zero;. }. retu
16000 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b rn ((n*2) + 12 +
16010 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 ((flags&MEM_Str
16020 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a )!=0));.}../*.**
16030 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 Return the leng
16040 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 th of the data c
16050 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 orresponding to
16060 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 the supplied ser
16070 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 ial-type..*/.u32
16080 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
16090 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 alTypeLen(u32 se
160a0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 rial_type){. if
160b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 ( serial_type>=1
160c0 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2 ){. return
160d0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 (serial_type-12)
160e0 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 /2;. }else{.
160f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 static const u8
16100 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 aSize[] = { 0,
16110 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 1, 2, 3, 4, 6, 8
16120 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 , 8, 0, 0, 0, 0
16130 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 };. return aS
16140 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d ize[serial_type]
16150 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 ;. }.}../*.** I
16160 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 f we are on an a
16170 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 rchitecture with
16180 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c mixed-endian fl
16190 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 oating .** point
161a0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 s (ex: ARM7) the
161b0 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 n swap the lower
161c0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 4 bytes with th
161d0 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 e .** upper 4 by
161e0 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 tes. Return the
161f0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 result..**.** F
16200 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 or most architec
16210 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 tures, this is a
16220 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c no-op..**.** (l
16230 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 ater): It is re
16240 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 ported to me tha
16250 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 t the mixed-endi
16260 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e an problem.** on
16270 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 ARM7 is an issu
16280 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 e with GCC, not
16290 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 with the ARM7 ch
162a0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a ip. It seems.**
162b0 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 that early vers
162c0 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 ions of GCC stor
162d0 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 ed the two words
162e0 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 of a 64-bit.**
162f0 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f float in the wro
16300 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 ng order. And t
16310 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 hat error has be
16320 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a en propagated.**
16330 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 ever since. Th
16340 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e e blame is not n
16350 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 ecessarily with
16360 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 GCC, though..**
16370 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a GCC might have j
16380 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 ust copying the
16390 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 problem from a p
163a0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a rior compiler..*
163b0 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 * I am also told
163c0 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 that newer vers
163d0 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 ions of GCC that
163e0 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 follow a differ
163f0 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 ent.** ABI get t
16400 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 he byte order ri
16410 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c ght..**.** Devel
16420 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 opers using SQLi
16430 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 te on an ARM7 sh
16440 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 ould compile and
16450 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 run their.** ap
16460 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 plication using
16470 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 -DSQLITE_DEBUG=1
16480 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 at least once.
16490 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 With DEBUG.** e
164a0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 nabled, some ass
164b0 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 erts below will
164c0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 ensure that the
164d0 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a byte order of.**
164e0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 floating point
164f0 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 values is correc
16500 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 t..**.** (2007-0
16510 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 8-30) Frank van
16520 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 Vugt has studie
16530 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 d this problem c
16540 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 losely.** and ha
16550 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 s send his findi
16560 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 ngs to the SQLit
16570 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 e developers. F
16580 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 rank.** writes t
16590 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b hat some Linux k
165a0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f ernels offer flo
165b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 ating point hard
165c0 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f ware.** emulatio
165d0 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 n that uses only
165e0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 32-bit mantissa
165f0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 s instead of a f
16600 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 ull .** 48-bits
16610 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 as required by t
16620 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 he IEEE standard
16630 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a . (This is the.
16640 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 ** CONFIG_FPE_FA
16650 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 STFPE option.)
16660 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c On such systems,
16670 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a floating point.
16680 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 ** byte swapping
16690 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f becomes very co
166a0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 mplicated. To a
166b0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a void problems,.*
166c0 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 * the necessary
166d0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 byte swapping is
166e0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 carried out usi
166f0 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 ng a 64-bit inte
16700 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 ger.** rather th
16710 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 an a 64-bit floa
16720 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 t. Frank assure
16730 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f s us that the co
16740 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 de here.** works
16750 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 for him. We, t
16760 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 he developers, h
16770 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e ave no way to in
16780 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 dependently.** v
16790 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 erify this, but
167a0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b Frank seems to k
167b0 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 now what he is t
167c0 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 alking about.**
167d0 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e so we trust him.
167e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 .*/.#ifdef SQLIT
167f0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 E_MIXED_ENDIAN_6
16800 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 4BIT_FLOAT.stati
16810 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 c u64 floatSwap(
16820 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e u64 in){. union
16830 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 {. u64 r;.
16840 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 u32 i[2];. }
16850 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 u;. u32 t;.. u
16860 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 .r = in;. t = u
16870 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 .i[0];. u.i[0]
16880 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b = u.i[1];. u.i[
16890 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 1] = t;. return
168a0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 u.r;.}.# define
168b0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e swapMixedEndian
168c0 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c Float(X) X = fl
168d0 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 oatSwap(X).#else
168e0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 .# define swapMi
168f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 xedEndianFloat(X
16900 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 ).#endif../*.**
16910 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c Write the serial
16920 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 ized data blob f
16930 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f or the value sto
16940 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f red in pMem into
16950 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 .** buf. It is
16960 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 assumed that the
16970 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f caller has allo
16980 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 cated sufficient
16990 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 space..** Retur
169a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
169b0 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a bytes written..*
169c0 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 *.** nBuf is the
169d0 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 amount of space
169e0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 left in buf[].
169f0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 The caller is r
16a00 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f esponsible.** fo
16a10 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f r allocating eno
16a20 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 ugh space to buf
16a30 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 [] to hold the e
16a40 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 ntire field, exc
16a50 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 lusive.** of the
16a60 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 pMem->u.nZero b
16a70 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a ytes for a MEM_Z
16a80 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a ero value..**.**
16a90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 Return the numb
16aa0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 er of bytes actu
16ab0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 ally written int
16ac0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 o buf[]. The nu
16ad0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 mber.** of bytes
16ae0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c in the zero-fil
16af0 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c led tail is incl
16b00 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 uded in the retu
16b10 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a rn value only.**
16b20 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 if those bytes
16b30 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 were zeroed in b
16b40 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 uf[]..*/ .u32 sq
16b50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 lite3VdbeSerialP
16b60 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 ut(u8 *buf, Mem
16b70 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 *pMem, u32 seria
16b80 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c l_type){. u32 l
16b90 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 en;.. /* Intege
16ba0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 r and Real */.
16bb0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c if( serial_type<
16bc0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 =7 && serial_typ
16bd0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 e>0 ){. u64 v
16be0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 ;. u32 i;.
16bf0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 if( serial_type
16c00 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 ==7 ){. ass
16c10 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d ert( sizeof(v)==
16c20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 sizeof(pMem->u.r
16c30 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 ) );. memcp
16c40 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 y(&v, &pMem->u.r
16c50 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 , sizeof(v));.
16c60 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 swapMixedEnd
16c70 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 ianFloat(v);.
16c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 }else{. v
16c90 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 = pMem->u.i;.
16ca0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d }. len = i =
16cb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
16cc0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c alTypeLen(serial
16cd0 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 _type);. asse
16ce0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 rt( i>0 );. d
16cf0 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 o{. buf[--i
16d00 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 ] = (u8)(v&0xFF)
16d10 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b ;. v >>= 8;
16d20 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 . }while( i )
16d30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e ;. return len
16d40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 ;. }.. /* Stri
16d50 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 ng or blob */.
16d60 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e if( serial_type>
16d70 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 =12 ){. asser
16d80 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 t( pMem->n + ((p
16d90 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
16da0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e _Zero)?pMem->u.n
16db0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 Zero:0).
16dc0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c == (int)sql
16dd0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 ite3VdbeSerialTy
16de0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 peLen(serial_typ
16df0 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 e) );. len =
16e00 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d pMem->n;. mem
16e10 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a cpy(buf, pMem->z
16e20 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 , len);. retu
16e30 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f rn len;. }.. /
16e40 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 * NULL or consta
16e50 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 nts 0 or 1 */.
16e60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 return 0;.}../*
16e70 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 Input "x" is a s
16e80 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 equence of unsig
16e90 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 ned characters t
16ea0 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a hat represent a.
16eb0 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e ** big-endian in
16ec0 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 teger. Return t
16ed0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 he equivalent na
16ee0 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a tive integer.*/.
16ef0 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 #define ONE_BYTE
16f00 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 _INT(x) ((i8)
16f10 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 (x)[0]).#define
16f20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 TWO_BYTE_INT(x)
16f30 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 (256*(i8)((x)
16f40 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 [0])|(x)[1]).#de
16f50 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f fine THREE_BYTE_
16f60 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 INT(x) (65536*(
16f70 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 i8)((x)[0])|((x)
16f80 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a [1]<<8)|(x)[2]).
16f90 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 #define FOUR_BYT
16fa0 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 E_UINT(x) (((u3
16fb0 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 2)(x)[0]<<24)|((
16fc0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b x)[1]<<16)|((x)[
16fd0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 2]<<8)|(x)[3]).#
16fe0 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 define FOUR_BYTE
16ff0 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 _INT(x) (1677721
17000 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 6*(i8)((x)[0])|(
17010 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 (x)[1]<<16)|((x)
17020 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a [2]<<8)|(x)[3]).
17030 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 ./*.** Deseriali
17040 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 ze the data blob
17050 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 pointed to by b
17060 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 uf as serial typ
17070 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a e serial_type.**
17080 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 and store the r
17090 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 esult in pMem.
170a0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 Return the numbe
170b0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e r of bytes read.
170c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 .**.** This func
170d0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e tion is implemen
170e0 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 ted as two separ
170f0 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 ate routines for
17100 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a performance..**
17110 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 The few cases t
17120 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 hat require loca
17130 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 l variables are
17140 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 broken out into
17150 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f a separate.** ro
17160 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e utine so that in
17170 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 most cases the
17180 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 overhead of movi
17190 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 ng the stack poi
171a0 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 nter.** is avoid
171b0 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 ed..*/ .static u
171c0 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 32 SQLITE_NOINLI
171d0 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 NE serialGet(.
171e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
171f0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a har *buf, /*
17200 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 Buffer to deser
17210 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 ialize from */.
17220 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 u32 serial_type
17230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
17240 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f * Serial type to
17250 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a deserialize */.
17260 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 Mem *pMem
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17280 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 /* Memory cell t
17290 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e o write value in
172a0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 to */.){. u64 x
172b0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e = FOUR_BYTE_UIN
172c0 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 T(buf);. u32 y
172d0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 = FOUR_BYTE_UINT
172e0 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 (buf+4);. x = (
172f0 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 x<<32) + y;. if
17300 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 ( serial_type==6
17310 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 ){. /* EVIDE
17320 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d NCE-OF: R-29851-
17330 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 52272 Value is a
17340 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 big-endian 64-b
17350 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 it. ** twos-c
17360 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 omplement intege
17370 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e r. */. pMem->
17380 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b u.i = *(i64*)&x;
17390 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 . pMem->flags
173a0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
173b0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e testcase( pMem->
173c0 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 u.i<0 );. }else
173d0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 {. /* EVIDENC
173e0 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 E-OF: R-57343-49
173f0 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 114 Value is a b
17400 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 ig-endian IEEE 7
17410 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 54-2008 64-bit.
17420 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 ** floating p
17430 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a oint number. */.
17440 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 #if !defined(NDE
17450 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 BUG) && !defined
17460 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f (SQLITE_OMIT_FLO
17470 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 ATING_POINT).
17480 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 /* Verify that
17490 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f integers and flo
174a0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 ating point valu
174b0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a es use the same.
174c0 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 ** byte orde
174d0 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 r. Or, that if
174e0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 SQLITE_MIXED_END
174f0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 IAN_64BIT_FLOAT
17500 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 is. ** define
17510 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c d that 64-bit fl
17520 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c oating point val
17530 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d ues really are m
17540 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 ixed. ** endi
17550 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 an.. */. s
17560 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 tatic const u64
17570 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 t1 = ((u64)0x3ff
17580 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 00000)<<32;.
17590 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 static const dou
175a0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 ble r1 = 1.0;.
175b0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 u64 t2 = t1;.
175c0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 swapMixedEndi
175d0 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 anFloat(t2);.
175e0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 assert( sizeof(
175f0 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 r1)==sizeof(t2)
17600 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 && memcmp(&r1, &
17610 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d t2, sizeof(r1))=
17620 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 =0 );.#endif.
17630 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 assert( sizeof(
17640 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 x)==8 && sizeof(
17650 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b pMem->u.r)==8 );
17660 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e . swapMixedEn
17670 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 dianFloat(x);.
17680 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e memcpy(&pMem->
17690 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 u.r, &x, sizeof(
176a0 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 x));. pMem->f
176b0 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 lags = sqlite3Is
176c0 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f NaN(pMem->u.r) ?
176d0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f MEM_Null : MEM_
176e0 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 Real;. }. retu
176f0 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 rn 8;.}.u32 sqli
17700 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 te3VdbeSerialGet
17710 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e (. const unsign
17720 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 ed char *buf,
17730 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 /* Buffer to d
17740 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 eserialize from
17750 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f */. u32 serial_
17760 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 type,
17770 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 /* Serial typ
17780 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 e to deserialize
17790 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 */. Mem *pMem
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
177b0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 /* Memory ce
177c0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 ll to write valu
177d0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 e into */.){. s
177e0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 witch( serial_ty
177f0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 pe ){. case 1
17800 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 0: /* Reserved
17810 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 for future use
17820 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 */. case 11:
17830 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f /* Reserved fo
17840 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a r future use */.
17850 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f case 0: { /
17860 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 * Null */.
17870 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 /* EVIDENCE-OF:
17880 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 R-24078-09375 Va
17890 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a lue is a NULL. *
178a0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c /. pMem->fl
178b0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a ags = MEM_Null;.
178c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
178d0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b }. case 1: {
178e0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e . /* EVIDEN
178f0 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 CE-OF: R-44885-2
17900 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 5196 Value is an
17910 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 8-bit twos-comp
17920 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 lement. **
17930 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 integer. */.
17940 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e pMem->u.i = ON
17950 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b E_BYTE_INT(buf);
17960 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
17970 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
17980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d testcase( pM
17990 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 em->u.i<0 );.
179a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 return 1;.
179b0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b }. case 2: {
179c0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 /* 2-byte signe
179d0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 d integer */.
179e0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f /* EVIDENCE-O
179f0 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 F: R-49794-35026
17a00 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d Value is a big-
17a10 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 endian 16-bit.
17a20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 ** twos-comp
17a30 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 lement integer.
17a40 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 */. pMem->u
17a50 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e .i = TWO_BYTE_IN
17a60 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d T(buf);. pM
17a70 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
17a80 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 Int;. testc
17a90 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 ase( pMem->u.i<0
17aa0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e );. return
17ab0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 2;. }. ca
17ac0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 se 3: { /* 3-byt
17ad0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 e signed integer
17ae0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 */. /* EVI
17af0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 DENCE-OF: R-3783
17b00 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 9-54301 Value is
17b10 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 a big-endian 24
17b20 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 -bit. ** tw
17b30 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e os-complement in
17b40 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 teger. */.
17b50 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 pMem->u.i = THRE
17b60 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b E_BYTE_INT(buf);
17b70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
17b80 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
17b90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d testcase( pM
17ba0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 em->u.i<0 );.
17bb0 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 return 3;.
17bc0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b }. case 4: {
17bd0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 /* 4-byte signe
17be0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 d integer */.
17bf0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f /* EVIDENCE-O
17c00 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 F: R-01849-26079
17c10 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d Value is a big-
17c20 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 endian 32-bit.
17c30 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 ** twos-comp
17c40 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 lement integer.
17c50 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 */. pMem->u
17c60 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 .i = FOUR_BYTE_I
17c70 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 NT(buf);. p
17c80 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
17c90 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 _Int;. test
17ca0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c case( pMem->u.i<
17cb0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 0 );. retur
17cc0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 n 4;. }. c
17cd0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 ase 5: { /* 6-by
17ce0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 te signed intege
17cf0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 r */. /* EV
17d00 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 IDENCE-OF: R-503
17d10 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 85-09674 Value i
17d20 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 s a big-endian 4
17d30 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 8-bit. ** t
17d40 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 wos-complement i
17d50 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 nteger. */.
17d60 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 pMem->u.i = FOU
17d70 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b R_BYTE_UINT(buf+
17d80 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 2) + (((i64)1)<<
17d90 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 32)*TWO_BYTE_INT
17da0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 (buf);. pMe
17db0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 m->flags = MEM_I
17dc0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 nt;. testca
17dd0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 se( pMem->u.i<0
17de0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
17df0 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 6;. }. cas
17e00 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 e 6: /* 8-byte
17e10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 signed integer
17e20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b */. case 7: {
17e30 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e /* IEEE floatin
17e40 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 g point */.
17e50 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f /* These use lo
17e60 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 cal variables, s
17e70 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 o do them in a s
17e80 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a eparate routine.
17e90 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 ** to avoi
17ea0 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 d having to move
17eb0 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 the frame point
17ec0 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e er in the common
17ed0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 case */. r
17ee0 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 eturn serialGet(
17ef0 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c buf,serial_type,
17f00 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 pMem);. }.
17f10 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 case 8: /* I
17f20 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 nteger 0 */.
17f30 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e case 9: { /* In
17f40 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 teger 1 */.
17f50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a /* EVIDENCE-OF:
17f60 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 R-12976-22893 V
17f70 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 alue is the inte
17f80 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 ger 0. */.
17f90 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 /* EVIDENCE-OF:
17fa0 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 R-18143-12121 Va
17fb0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 lue is the integ
17fc0 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 er 1. */. p
17fd0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 Mem->u.i = seria
17fe0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 l_type-8;.
17ff0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
18000 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 M_Int;. ret
18010 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 0;. }.
18020 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 default: {.
18030 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 /* EVIDENCE-OF
18040 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 : R-14606-31564
18050 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 Value is a BLOB
18060 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 that is (N-12)/2
18070 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 bytes in.
18080 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 ** length..
18090 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a ** EVIDENCE-OF:
180a0 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 R-28401-00140 V
180b0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 alue is a string
180c0 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 in the text enc
180d0 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 oding and.
180e0 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 ** (N-13)/2 byte
180f0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a s in length. */.
18100 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e static con
18110 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d st u16 aFlag[] =
18120 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f { MEM_Blob|MEM_
18130 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d Ephem, MEM_Str|M
18140 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 EM_Ephem };.
18150 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 pMem->z = (cha
18160 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 r *)buf;. p
18170 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c Mem->n = (serial
18180 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 _type-12)/2;.
18190 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
181a0 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 aFlag[serial_ty
181b0 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 pe&1];. ret
181c0 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 urn pMem->n;.
181d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 }. }. return
181e0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 0;.}./*.** This
181f0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 routine is used
18200 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 to allocate suff
18210 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 icient space for
18220 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f an UnpackedReco
18230 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 rd.** structure
18240 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 large enough to
18250 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c be used with sql
18260 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e ite3VdbeRecordUn
18270 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 pack() if.** the
18280 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 first argument
18290 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 is a pointer to
182a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 KeyInfo structur
182b0 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a e pKeyInfo..**.*
182c0 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 * The space is e
182d0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 ither allocated
182e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d using sqlite3DbM
182f0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 allocRaw() or fr
18300 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 om within.** the
18310 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 unaligned buffe
18320 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 r passed via the
18330 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 second and thir
18340 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 d arguments (pre
18350 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b sumably.** stack
18360 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 space). If the
18370 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 former, then *pp
18380 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 Free is set to a
18390 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 pointer that sh
183a0 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 ould.** be event
183b0 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 ually freed by t
183c0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 he caller using
183d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e sqlite3DbFree().
183e0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 Or, if the .**
183f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 allocation comes
18400 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 from the pSpace
18410 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c /szSpace buffer,
18420 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 *ppFree is set
18430 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 to NULL.** befor
18440 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a e returning..**.
18450 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 ** If an OOM err
18460 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 or occurs, NULL
18470 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a is returned..*/.
18480 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a UnpackedRecord *
18490 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 sqlite3VdbeAlloc
184a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a UnpackedRecord(.
184b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 KeyInfo *pKeyI
184c0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 nfo,
184d0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e /* Description
184e0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a of the record *
184f0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 /. char *pSpace
18500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
18510 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 /* Unaligned
18520 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 space available
18530 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 */. int szSpac
18540 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
18550 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
18560 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 pSpace[] in byt
18570 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 es */. char **p
18580 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 pFree
18590 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 /* OUT:
185a0 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 Caller should fr
185b0 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 ee this pointer
185c0 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 */.){. Unpacked
185d0 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 Record *p;
185e0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 /* Unpac
185f0 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 ked record to re
18600 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f turn */. int nO
18610 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ff;
18620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 /* Inc
18630 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 rement pSpace by
18640 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 nOff to align i
18650 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 t */. int nByte
18660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
18670 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
18680 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 of bytes requir
18690 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 ed for *p */..
186a0 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 /* We want to sh
186b0 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 ift the pointer
186c0 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 pSpace up such t
186d0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 hat it is 8-byte
186e0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 aligned.. ** T
186f0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 hus, we need to
18700 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 calculate a valu
18710 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e e, nOff, between
18720 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 0 and 7, to shi
18730 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 ft . ** it by.
18740 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c If pSpace is al
18750 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 ready 8-byte ali
18760 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c gned, nOff shoul
18770 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a d be zero.. */.
18780 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 nOff = (8 - (S
18790 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 QLITE_PTR_TO_INT
187a0 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 (pSpace) & 7)) &
187b0 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 7;. nByte = RO
187c0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 UND8(sizeof(Unpa
187d0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 ckedRecord)) + s
187e0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 izeof(Mem)*(pKey
187f0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b Info->nField+1);
18800 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 . if( nByte>szS
18810 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 pace+nOff ){.
18820 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 p = (UnpackedRe
18830 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 cord *)sqlite3Db
18840 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e MallocRaw(pKeyIn
18850 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a fo->db, nByte);.
18860 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 *ppFree = (c
18870 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 har *)p;. if(
18880 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a !p ) return 0;.
18890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d }else{. p =
188a0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 (UnpackedRecord
188b0 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b *)&pSpace[nOff];
188c0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 . *ppFree = 0
188d0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d ;. }.. p->aMem
188e0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 = (Mem*)&((char
188f0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 *)p)[ROUND8(size
18900 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 of(UnpackedRecor
18910 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 d))];. assert(
18920 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f pKeyInfo->aSortO
18930 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e rder!=0 );. p->
18940 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 pKeyInfo = pKeyI
18950 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 nfo;. p->nField
18960 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 = pKeyInfo->nFi
18970 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 eld + 1;. retur
18980 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 n p;.}../*.** Gi
18990 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 ven the nKey-byt
189a0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 e encoding of a
189b0 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d record in pKey[]
189c0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a , populate the .
189d0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 ** UnpackedRecor
189e0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 d structure indi
189f0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 cated by the fou
18a00 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 rth argument wit
18a10 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 h the.** content
18a20 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 s of the decoded
18a30 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 record..*/ .voi
18a40 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 d sqlite3VdbeRec
18a50 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 ordUnpack(. Key
18a60 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 Info *pKeyInfo,
18a70 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 /* Informati
18a80 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 on about the rec
18a90 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 ord format */.
18aa0 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 int nKey,
18ab0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
18ac0 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 f the binary rec
18ad0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 ord */. const v
18ae0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 oid *pKey,
18af0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 /* The binary re
18b00 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b cord */. Unpack
18b10 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 edRecord *p
18b20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 /* Populate thi
18b30 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f s structure befo
18b40 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f re returning. */
18b50 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 .){. const unsi
18b60 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 gned char *aKey
18b70 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 = (const unsigne
18b80 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 d char *)pKey;.
18b90 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 int d; . u32 i
18ba0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dx;
18bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 /* Of
18bc0 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 fset in aKey[] t
18bd0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 o read from */.
18be0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 u16 u;
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18c00 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f /* Unsigned loo
18c10 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 p counter */. u
18c20 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 32 szHdr;. Mem
18c30 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b *pMem = p->aMem;
18c40 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 .. p->default_r
18c50 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 c = 0;. assert(
18c60 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 EIGHT_BYTE_ALIG
18c70 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 NMENT(pMem) );.
18c80 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 idx = getVarint
18c90 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 32(aKey, szHdr);
18ca0 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 . d = szHdr;.
18cb0 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 u = 0;. while(
18cc0 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d idx<szHdr && d<=
18cd0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 nKey ){. u32
18ce0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 serial_type;..
18cf0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 idx += getVari
18d00 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c nt32(&aKey[idx],
18d10 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 serial_type);.
18d20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 pMem->enc = p
18d30 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 KeyInfo->enc;.
18d40 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 pMem->db = pKe
18d50 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f yInfo->db;. /
18d60 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 * pMem->flags =
18d70 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 0; // sqlite3Vdb
18d80 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c eSerialGet() wil
18d90 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 l set this for u
18da0 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 s */. pMem->s
18db0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 zMalloc = 0;.
18dc0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 d += sqlite3Vdb
18dd0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 eSerialGet(&aKey
18de0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 [d], serial_type
18df0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 , pMem);. pMe
18e00 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b m++;. if( (++
18e10 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 u)>=p->nField )
18e20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 break;. }. ass
18e30 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f ert( u<=pKeyInfo
18e40 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a ->nField + 1 );.
18e50 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b p->nField = u;
18e60 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 .}..#if SQLITE_D
18e70 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 EBUG./*.** This
18e80 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 function compare
18e90 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 s two index or t
18ea0 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 able record keys
18eb0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 in the same way
18ec0 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 .** as the sqlit
18ed0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e3VdbeRecordComp
18ee0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 are() routine. U
18ef0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 nlike VdbeRecord
18f00 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 Compare(),.** th
18f10 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 is function dese
18f20 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d rializes and com
18f30 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 pares values usi
18f40 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 ng the.** sqlite
18f50 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 3VdbeSerialGet()
18f60 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 and sqlite3MemC
18f70 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f ompare() functio
18f80 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a ns. It is used.*
18f90 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 * in assert() st
18fa0 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 atements to ensu
18fb0 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 re that the opti
18fc0 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a mized code in.**
18fd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
18fe0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 rdCompare() retu
18ff0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 rns results with
19000 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 these two primi
19010 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 tives..**.** Ret
19020 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 urn true if the
19030 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 result of compar
19040 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 ison is equivale
19050 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 nt to desiredRes
19060 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 ult..** Return f
19070 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 alse if there is
19080 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e a disagreement.
19090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 .*/.static int v
190a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
190b0 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 Debug(. int nKe
190c0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a y1, const void *
190d0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b pKey1, /* Left k
190e0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e ey */. const Un
190f0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 packedRecord *pP
19100 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b Key2, /* Right k
19110 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 ey */. int desi
19120 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 redResult
19130 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 /* Correct
19140 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 answer */.){.
19150 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 u32 d1;
19160 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 /* Offset int
19170 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 o aKey[] of next
19180 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f data element */
19190 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 . u32 idx1;
191a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 /* Offset
191b0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e into aKey[] of n
191c0 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 ext header eleme
191d0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 nt */. u32 szHd
191e0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 r1; /* Nu
191f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
19200 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 header */. int
19210 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 i = 0;. int rc
19220 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e = 0;. const un
19230 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 signed char *aKe
19240 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 y1 = (const unsi
19250 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 gned char *)pKey
19260 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 1;. KeyInfo *pK
19270 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 eyInfo;. Mem me
19280 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 m1;.. pKeyInfo
19290 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e = pPKey2->pKeyIn
192a0 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e fo;. if( pKeyIn
192b0 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 fo->db==0 ) retu
192c0 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 rn 1;. mem1.enc
192d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 = pKeyInfo->enc
192e0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b ;. mem1.db = pK
192f0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a eyInfo->db;. /*
19300 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b mem1.flags = 0;
19310 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 // Will be ini
19320 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 tialized by sqli
19330 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 te3VdbeSerialGet
19340 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 () */. VVA_ONLY
19350 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 ( mem1.szMalloc
19360 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e = 0; ) /* Only n
19370 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 eeded by assert(
19380 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a ) statements */.
19390 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 . /* Compilers
193a0 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 may complain tha
193b0 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f t mem1.u.i is po
193c0 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 tentially uninit
193d0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 ialized.. ** We
193e0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a could initializ
193f0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 e it, as shown h
19400 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 ere, to silence
19410 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 those complaints
19420 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 .. ** But in fa
19430 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c ct, mem1.u.i wil
19440 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 l never actually
19450 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 be used uniniti
19460 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e alized, and doin
19470 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 g . ** the unne
19480 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 cessary initiali
19490 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 zation has a mea
194a0 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 surable negative
194b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a performance. *
194c0 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 * impact, since
194d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
194e0 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e a very high runn
194f0 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 er. And so, we
19500 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 choose. ** to i
19510 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c gnore the compil
19520 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 er warnings and
19530 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 leave this varia
19540 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 ble uninitialize
19550 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 d.. */. /* me
19560 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 m1.u.i = 0; //
19570 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 not needed, here
19580 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 to silence comp
19590 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a iler warning */.
195a0 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 . idx1 = getV
195b0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 arint32(aKey1, s
195c0 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 zHdr1);. d1 = s
195d0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 zHdr1;. assert(
195e0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c pKeyInfo->nFiel
195f0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 d+pKeyInfo->nXFi
19600 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 eld>=pPKey2->nFi
19610 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 eld || CORRUPT_D
19620 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 B );. assert( p
19630 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 KeyInfo->aSortOr
19640 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 der!=0 );. asse
19650 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 rt( pKeyInfo->nF
19660 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 ield>0 );. asse
19670 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 rt( idx1<=szHdr1
19680 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 || CORRUPT_DB )
19690 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 ;. do{. u32
196a0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 serial_type1;..
196b0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 /* Read the s
196c0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 erial types for
196d0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 the next element
196e0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f in each key. */
196f0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 . idx1 += get
19700 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b Varint32( aKey1+
19710 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 idx1, serial_typ
19720 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 e1 );.. /* Ve
19730 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 rify that there
19740 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 is enough key sp
19750 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f ace remaining to
19760 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 avoid. ** a
19770 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e buffer overread.
19780 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c The "d1+serial
19790 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 _type1+2" subexp
197a0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 ression will.
197b0 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 ** always be gr
197c0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 eater than or eq
197d0 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e ual to the amoun
197e0 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 t of required ke
197f0 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 y space.. **
19800 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 Use that approxi
19810 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 mation to avoid
19820 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 the more expensi
19830 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a ve call to. *
19840 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 * sqlite3VdbeSer
19850 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 ialTypeLen() in
19860 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e the common case.
19870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
19880 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b d1+serial_type1+
19890 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 2>(u32)nKey1.
198a0 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 && d1+sqlite3V
198b0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e dbeSerialTypeLen
198c0 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 (serial_type1)>(
198d0 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 u32)nKey1 . )
198e0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 {. break;.
198f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 }.. /* Ext
19900 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 ract the values
19910 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a to be compared..
19920 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d */. d1 +=
19930 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
19940 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d alGet(&aKey1[d1]
19950 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 , serial_type1,
19960 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 &mem1);.. /*
19970 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f Do the compariso
19980 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 n. */. rc
19990 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 = sqlite3MemComp
199a0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 are(&mem1, &pPKe
199b0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 y2->aMem[i], pKe
199c0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 yInfo->aColl[i])
199d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 ;. if( rc!=0
199e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ){. assert(
199f0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d mem1.szMalloc==
19a00 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 0 ); /* See com
19a10 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 ment below */.
19a20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f if( pKeyInfo
19a30 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 ->aSortOrder[i]
19a40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
19a50 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 -rc; /* Invert
19a60 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 the result for D
19a70 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 ESC sort order.
19a80 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 */. }.
19a90 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 goto debugCompa
19aa0 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 reEnd;. }.
19ab0 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 i++;. }while(
19ac0 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 idx1<szHdr1 && i
19ad0 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 <pPKey2->nField
19ae0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f );.. /* No memo
19af0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 ry allocation is
19b00 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 ever used on me
19b10 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 m1. Prove this
19b20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 using. ** the f
19b30 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 ollowing assert(
19b40 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 ). If the asser
19b50 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e t() fails, it in
19b60 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d dicates a. ** m
19b70 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 emory leak and a
19b80 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 need to call sq
19b90 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
19ba0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f ase(&mem1).. */
19bb0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e . assert( mem1.
19bc0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a szMalloc==0 );..
19bd0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 /* rc==0 here
19be0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f means that one o
19bf0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f f the keys ran o
19c00 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 ut of fields and
19c10 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 . ** all the fi
19c20 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 elds up to that
19c30 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c point were equal
19c40 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 . Return the def
19c50 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c ault_rc. ** val
19c60 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 ue. */. rc = p
19c70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 PKey2->default_r
19c80 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 c;..debugCompare
19c90 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 End:. if( desir
19ca0 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 edResult==0 && r
19cb0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b c==0 ) return 1;
19cc0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 . if( desiredRe
19cd0 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 sult<0 && rc<0 )
19ce0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 return 1;. if(
19cf0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 desiredResult>0
19d00 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 && rc>0 ) retur
19d10 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 n 1;. if( CORRU
19d20 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 PT_DB ) return 1
19d30 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f ;. if( pKeyInfo
19d40 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ->db->mallocFail
19d50 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 ed ) return 1;.
19d60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e return 0;.}.#en
19d70 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f dif..#if SQLITE_
19d80 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e DEBUG./*.** Coun
19d90 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 t the number of
19da0 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 fields (a.k.a. c
19db0 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 olumns) in the r
19dc0 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a ecord given by.*
19dd0 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 * pKey,nKey. Th
19de0 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 e verify that th
19df0 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 is count is less
19e00 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 than or equal t
19e10 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 o the.** limit g
19e20 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f iven by pKeyInfo
19e30 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 ->nField + pKeyI
19e40 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a nfo->nXField..**
19e50 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 .** If this cons
19e60 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 traint is not sa
19e70 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e tisfied, it mean
19e80 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d s that the high-
19e90 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 speed.** vdbeRec
19ea0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 ordCompareInt()
19eb0 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f and vdbeRecordCo
19ec0 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f mpareString() ro
19ed0 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e utines will.** n
19ee0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c ot work correctl
19ef0 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 y. If this asse
19f00 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c rt() ever fires,
19f10 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 it probably mea
19f20 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b ns.** that the K
19f30 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 eyInfo.nField or
19f40 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 KeyInfo.nXField
19f50 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d values were com
19f60 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 puted.** incorre
19f70 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ctly..*/.static
19f80 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 void vdbeAssertF
19f90 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c ieldCountWithinL
19fa0 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 imits(. int nKe
19fb0 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 y, const void *p
19fc0 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 Key, /* The re
19fd0 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a cord to verify *
19fe0 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e / . const KeyIn
19ff0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 fo *pKeyInfo
1a000 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 /* Compare si
1a010 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 ze with this Key
1a020 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 Info */.){. int
1a030 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 nField = 0;. u
1a040 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 32 szHdr;. u32
1a050 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 idx;. u32 notUs
1a060 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 ed;. const unsi
1a070 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 gned char *aKey
1a080 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 = (const unsigne
1a090 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 d char*)pKey;..
1a0a0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 if( CORRUPT_DB
1a0b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 ) return;. idx
1a0c0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b = getVarint32(aK
1a0d0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 ey, szHdr);. as
1a0e0 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b sert( nKey>=0 );
1a0f0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 . assert( szHdr
1a100 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 <=(u32)nKey );.
1a110 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 while( idx<szHd
1a120 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 r ){. idx +=
1a130 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 getVarint32(aKey
1a140 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a +idx, notUsed);.
1a150 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 nField++;.
1a160 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 }. assert( nFie
1a170 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e ld <= pKeyInfo->
1a180 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d nField+pKeyInfo-
1a190 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 >nXField );.}.#e
1a1a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 lse.# define vdb
1a1b0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e eAssertFieldCoun
1a1c0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c tWithinLimits(A,
1a1d0 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a B,C).#endif../*.
1a1e0 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 ** Both *pMem1 a
1a1f0 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 nd *pMem2 contai
1a200 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e n string values.
1a210 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f Compare the two
1a220 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 values.** using
1a230 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 the collation s
1a240 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 equence pColl. A
1a250 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 s usual, return
1a260 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 a negative , zer
1a270 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 o.** or positive
1a280 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 value if *pMem1
1a290 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
1a2a0 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 qual to or great
1a2b0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 er than .** *pMe
1a2c0 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 m2, respectively
1a2d0 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 . Similar in spi
1a2e0 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 rit to "rc = (*p
1a2f0 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 Mem1) - (*pMem2)
1a300 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ;"..*/.static in
1a310 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d t vdbeCompareMem
1a320 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 String(. const
1a330 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f Mem *pMem1,. co
1a340 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a nst Mem *pMem2,.
1a350 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 const CollSeq
1a360 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 *pColl,. u8 *pr
1a370 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 cErr
1a380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 /* If
1a390 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 an OOM occurs, s
1a3a0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d et to SQLITE_NOM
1a3b0 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 EM */.){. if( p
1a3c0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c Mem1->enc==pColl
1a3d0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 ->enc ){. /*
1a3e0 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 The strings are
1a3f0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 already in the c
1a400 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e orrect encoding.
1a410 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 Call the.
1a420 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 ** comparison fu
1a430 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 nction directly
1a440 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 */. return pC
1a450 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d oll->xCmp(pColl-
1a460 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c >pUser,pMem1->n,
1a470 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e pMem1->z,pMem2->
1a480 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d n,pMem2->z);. }
1a490 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 else{. int rc
1a4a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 ;. const void
1a4b0 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 *v1, *v2;. i
1a4c0 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d nt n1, n2;. M
1a4d0 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 em c1;. Mem c
1a4e0 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 2;. sqlite3Vd
1a4f0 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 beMemInit(&c1, p
1a500 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 Mem1->db, MEM_Nu
1a510 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 ll);. sqlite3
1a520 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c VdbeMemInit(&c2,
1a530 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f pMem1->db, MEM_
1a540 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 Null);. sqlit
1a550 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 e3VdbeMemShallow
1a560 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c Copy(&c1, pMem1,
1a570 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 MEM_Ephem);.
1a580 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
1a590 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 hallowCopy(&c2,
1a5a0 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d pMem2, MEM_Ephem
1a5b0 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 );. v1 = sqli
1a5c0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 te3ValueText((sq
1a5d0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 lite3_value*)&c1
1a5e0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 , pColl->enc);.
1a5f0 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 n1 = v1==0 ?
1a600 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 0 : c1.n;. v2
1a610 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 = sqlite3ValueT
1a620 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c ext((sqlite3_val
1a630 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e ue*)&c2, pColl->
1a640 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 enc);. n2 = v
1a650 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 2==0 ? 0 : c2.n;
1a660 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d . rc = pColl-
1a670 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 >xCmp(pColl->pUs
1a680 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 er, n1, v1, n2,
1a690 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 v2);. sqlite3
1a6a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 VdbeMemRelease(&
1a6b0 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 c1);. sqlite3
1a6c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 VdbeMemRelease(&
1a6d0 63 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 c2);. if( (v1
1a6e0 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 ==0 || v2==0) &&
1a6f0 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 prcErr ) *prcEr
1a700 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d r = SQLITE_NOMEM
1a710 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b ;. return rc;
1a720 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f . }.}../*.** Co
1a730 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e mpare two blobs.
1a740 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 Return negativ
1a750 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 e, zero, or posi
1a760 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 tive if the firs
1a770 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 t.** is less tha
1a780 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 n, equal to, or
1a790 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 greater than the
1a7a0 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 second, respect
1a7b0 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 ively..** If one
1a7c0 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 blob is a prefi
1a7d0 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 x of the other,
1a7e0 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 then the shorter
1a7f0 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a is the lessor..
1a800 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 */.static SQLITE
1a810 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 _NOINLINE int sq
1a820 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 lite3BlobCompare
1a830 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c (const Mem *pB1,
1a840 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 const Mem *pB2)
1a850 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 {. int c = memc
1a860 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e mp(pB1->z, pB2->
1a870 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e z, pB1->n>pB2->n
1a880 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d ? pB2->n : pB1-
1a890 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 >n);. if( c ) r
1a8a0 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 eturn c;. retur
1a8b0 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e n pB1->n - pB2->
1a8c0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d n;.}.../*.** Com
1a8d0 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 pare the values
1a8e0 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 contained by the
1a8f0 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c two memory cell
1a900 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 s, returning.**
1a910 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f negative, zero o
1a920 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d r positive if pM
1a930 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e em1 is less than
1a940 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 , equal to, or g
1a950 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 reater.** than p
1a960 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 Mem2. Sorting or
1a970 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 der is NULL's fi
1a980 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 rst, followed by
1a990 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 numbers (intege
1a9a0 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 rs.** and reals)
1a9b0 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 sorted numerica
1a9c0 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 lly, followed by
1a9d0 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 text ordered by
1a9e0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a the collating.*
1a9f0 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c * sequence pColl
1aa00 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f and finally blo
1aa10 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d b's ordered by m
1aa20 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 emcmp()..**.** T
1aa30 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 wo NULL values a
1aa40 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 re considered eq
1aa50 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 ual by this func
1aa60 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c tion..*/.int sql
1aa70 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 ite3MemCompare(c
1aa80 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c onst Mem *pMem1,
1aa90 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d const Mem *pMem
1aaa0 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 2, const CollSeq
1aab0 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 *pColl){. int
1aac0 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f f1, f2;. int co
1aad0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 mbined_flags;..
1aae0 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 f1 = pMem1->fla
1aaf0 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 gs;. f2 = pMem2
1ab00 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 ->flags;. combi
1ab10 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 ned_flags = f1|f
1ab20 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 2;. assert( (co
1ab30 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d mbined_flags & M
1ab40 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b EM_RowSet)==0 );
1ab50 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 . . /* If one v
1ab60 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 alue is NULL, it
1ab70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 is less than th
1ab80 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 e other. If both
1ab90 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 values. ** are
1aba0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e NULL, return 0.
1abb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 . */. if( comb
1abc0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e ined_flags&MEM_N
1abd0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ull ){. retur
1abe0 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 n (f2&MEM_Null)
1abf0 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b - (f1&MEM_Null);
1ac00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e . }.. /* If on
1ac10 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d e value is a num
1ac20 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 ber and the othe
1ac30 72 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 r is not, the nu
1ac40 6d 62 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 mber is less..
1ac50 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e ** If both are n
1ac60 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 umbers, compare
1ac70 61 73 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 as reals if one
1ac80 69 73 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 is a real, or as
1ac90 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 integers. ** i
1aca0 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 f both values ar
1acb0 65 20 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f e integers.. */
1acc0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f . if( combined_
1acd0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d flags&(MEM_Int|M
1ace0 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 EM_Real) ){.
1acf0 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 double r1, r2;.
1ad00 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 if( (f1 & f2
1ad10 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b & MEM_Int)!=0 ){
1ad20 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 . if( pMem1
1ad30 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 ->u.i < pMem2->u
1ad40 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a .i ) return -1;.
1ad50 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d if( pMem1-
1ad60 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e >u.i > pMem2->u.
1ad70 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 i ) return 1;.
1ad80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
1ad90 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 }. if( (f1&
1ada0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a MEM_Real)!=0 ){.
1adb0 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 r1 = pMem1
1adc0 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 ->u.r;. }else
1add0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 if( (f1&MEM_Int
1ade0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 )!=0 ){. r1
1adf0 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31 = (double)pMem1
1ae00 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 ->u.i;. }else
1ae10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 {. return 1
1ae20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
1ae30 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 (f2&MEM_Real)!=0
1ae40 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70 ){. r2 = p
1ae50 4d 65 6d 32 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d Mem2->u.r;. }
1ae60 65 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d else if( (f2&MEM
1ae70 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 _Int)!=0 ){.
1ae80 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 r2 = (double)p
1ae90 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d Mem2->u.i;. }
1aea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 else{. retu
1aeb0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 rn -1;. }.
1aec0 20 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 if( r1<r2 ) ret
1aed0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 urn -1;. if(
1aee0 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 r1>r2 ) return 1
1aef0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
1af00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 }.. /* If one
1af10 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 value is a stri
1af20 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 ng and the other
1af30 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 is a blob, the
1af40 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a string is less..
1af50 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 ** If both are
1af60 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 strings, compar
1af70 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c e using the coll
1af80 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e ating functions.
1af90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 . */. if( comb
1afa0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 ined_flags&MEM_S
1afb0 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 tr ){. if( (f
1afc0 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 1 & MEM_Str)==0
1afd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ){. return
1afe0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 1;. }. if(
1aff0 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d (f2 & MEM_Str)=
1b000 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 =0 ){. retu
1b010 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 rn -1;. }..
1b020 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d assert( pMem1-
1b030 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 >enc==pMem2->enc
1b040 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
1b050 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 pMem1->enc==SQLI
1b060 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 TE_UTF8 || .
1b070 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 pMem1->e
1b080 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 nc==SQLITE_UTF16
1b090 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 LE || pMem1->enc
1b0a0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 ==SQLITE_UTF16BE
1b0b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 );.. /* The
1b0c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e collation sequen
1b0d0 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e ce must be defin
1b0e0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 ed at this point
1b0f0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a , even if. **
1b100 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 the user delete
1b110 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 s the collation
1b120 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 sequence after t
1b130 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 he vdbe program
1b140 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c is. ** compil
1b150 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 ed (this was not
1b160 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 always the case
1b170 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 ).. */. as
1b180 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 sert( !pColl ||
1b190 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a pColl->xCmp );..
1b1a0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b if( pColl ){
1b1b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 . return vd
1b1c0 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 beCompareMemStri
1b1d0 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c ng(pMem1, pMem2,
1b1e0 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 pColl, 0);.
1b1f0 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 }. /* If a NU
1b200 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 LL pointer was p
1b210 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c assed as the col
1b220 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 late function, f
1b230 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 all through.
1b240 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 ** to the blob c
1b250 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 ase and use memc
1b260 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a mp(). */. }. .
1b270 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 /* Both values
1b280 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 must be blobs.
1b290 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d Compare using m
1b2a0 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 emcmp(). */. r
1b2b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f eturn sqlite3Blo
1b2c0 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 bCompare(pMem1,
1b2d0 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a pMem2);.}.../*.*
1b2e0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 * The first argu
1b2f0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 ment passed to t
1b300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
1b310 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 a serial-type th
1b320 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 at.** correspond
1b330 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 s to an integer
1b340 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 - all values bet
1b350 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 ween 1 and 9 inc
1b360 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 lusive .** excep
1b370 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 t 7. The second
1b380 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 points to a buff
1b390 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e er containing an
1b3a0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a integer value.*
1b3b0 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 * serialized acc
1b3c0 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c ording to serial
1b3d0 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 _type. This func
1b3e0 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 tion deserialize
1b3f0 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 s.** and returns
1b400 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 the value..*/.s
1b410 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 tatic i64 vdbeRe
1b420 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 cordDecodeInt(u3
1b430 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 2 serial_type, c
1b440 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a onst u8 *aKey){.
1b450 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 u32 y;. asser
1b460 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c t( CORRUPT_DB ||
1b470 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 (serial_type>=1
1b480 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c && serial_type<
1b490 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 =9 && serial_typ
1b4a0 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 e!=7) );. switc
1b4b0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 h( serial_type )
1b4c0 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 {. case 0:.
1b4d0 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 case 1:.
1b4e0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 testcase( aKey[0
1b4f0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 ]&0x80 );.
1b500 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f return ONE_BYTE_
1b510 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 INT(aKey);. c
1b520 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 ase 2:. tes
1b530 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 tcase( aKey[0]&0
1b540 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 x80 );. ret
1b550 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 urn TWO_BYTE_INT
1b560 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 (aKey);. case
1b570 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 3:. testca
1b580 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 se( aKey[0]&0x80
1b590 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e );. return
1b5a0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 THREE_BYTE_INT(
1b5b0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 aKey);. case
1b5c0 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 4: {. testc
1b5d0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 ase( aKey[0]&0x8
1b5e0 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 0 );. y = F
1b5f0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b OUR_BYTE_UINT(aK
1b600 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 ey);. retur
1b610 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 n (i64)*(int*)&y
1b620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
1b630 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 5: {. test
1b640 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 case( aKey[0]&0x
1b650 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 80 );. retu
1b660 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e rn FOUR_BYTE_UIN
1b670 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 T(aKey+2) + (((i
1b680 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 64)1)<<32)*TWO_B
1b690 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 YTE_INT(aKey);.
1b6a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a }. case 6:
1b6b0 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d {. u64 x =
1b6c0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 FOUR_BYTE_UINT(
1b6d0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 aKey);. tes
1b6e0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 tcase( aKey[0]&0
1b6f0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d x80 );. x =
1b700 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f (x<<32) | FOUR_
1b710 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 BYTE_UINT(aKey+4
1b720 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
1b730 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a (i64)*(i64*)&x;.
1b740 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
1b750 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 urn (serial_type
1b760 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 - 8);.}../*.**
1b770 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f This function co
1b780 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 mpares the two t
1b790 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 able rows or ind
1b7a0 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 ex records.** sp
1b7b0 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 ecified by {nKey
1b7c0 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 1, pKey1} and pP
1b7d0 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e Key2. It return
1b7e0 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 s a negative, ze
1b7f0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 ro.** or positiv
1b800 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 e integer if key
1b810 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 1 is less than,
1b820 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 equal to or .**
1b830 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 greater than key
1b840 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 2. The {nKey1,
1b850 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 pKey1} key must
1b860 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 be a blob.** cre
1b870 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d ated by the OP_M
1b880 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 akeRecord opcode
1b890 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 of the VDBE. T
1b8a0 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 he pPKey2.** key
1b8b0 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 must be a parse
1b8c0 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 d key such as ob
1b8d0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 tained from.** s
1b8e0 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 qlite3VdbeParseR
1b8f0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ecord..**.** If
1b900 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 argument bSkip i
1b910 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 s non-zero, it i
1b920 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 s assumed that t
1b930 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c he caller has al
1b940 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 ready.** determi
1b950 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 ned that the fir
1b960 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 st fields of the
1b970 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e keys are equal.
1b980 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 .**.** Key1 and
1b990 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 Key2 do not have
1b9a0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 to contain the
1b9b0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 same number of f
1b9c0 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a ields. If all .*
1b9d0 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 * fields that ap
1b9e0 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 pear in both key
1b9f0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 s are equal, the
1ba00 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c n pPKey2->defaul
1ba10 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 t_rc is .** retu
1ba20 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 rned..**.** If d
1ba30 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 atabase corrupti
1ba40 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 on is discovered
1ba50 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 , set pPKey2->er
1ba60 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c rCode to .** SQL
1ba70 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 ITE_CORRUPT and
1ba80 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 return 0. If an
1ba90 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 OOM error is enc
1baa0 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 ountered, .** pP
1bab0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 Key2->errCode is
1bac0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e set to SQLITE_N
1bad0 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 OMEM and, if it
1bae0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 is not NULL, the
1baf0 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 .** malloc-faile
1bb00 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 d flag set on da
1bb10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 tabase handle (p
1bb20 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1bb30 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c >db)..*/.int sql
1bb40 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
1bb50 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 mpareWithSkip(.
1bb60 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 int nKey1, cons
1bb70 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 t void *pKey1,
1bb80 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a /* Left key */.
1bb90 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 UnpackedRecord
1bba0 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 *pPKey2,
1bbb0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a /* Right key *
1bbc0 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 /. int bSkip
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bbe0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 /* If true,
1bbf0 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 skip the first f
1bc00 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 ield */.){. u32
1bc10 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 d1;
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1bc30 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 Offset into aKey
1bc40 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 [] of next data
1bc50 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 element */. int
1bc60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1bc80 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 Index of next fi
1bc90 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a eld to compare *
1bca0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 /. u32 szHdr1;
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bcc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 /* Size of r
1bcd0 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 ecord header in
1bce0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 bytes */. u32 i
1bcf0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 dx1;
1bd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 /* Of
1bd10 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 fset of first ty
1bd20 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a pe in header */.
1bd30 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 int rc = 0;
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bd50 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 /* Return valu
1bd60 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 e */. Mem *pRhs
1bd70 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b = pPKey2->aMem;
1bd80 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 /* Next f
1bd90 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 ield of pPKey2 t
1bda0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b o compare */. K
1bdb0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
1bdc0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 = pPKey2->pKeyI
1bdd0 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 nfo;. const uns
1bde0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 igned char *aKey
1bdf0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 1 = (const unsig
1be00 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 ned char *)pKey1
1be10 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 ;. Mem mem1;..
1be20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 /* If bSkip is
1be30 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 true, then the c
1be40 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 aller has alread
1be50 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 y determined tha
1be60 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a t the first. **
1be70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e two elements in
1be80 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 the keys are eq
1be90 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 ual. Fix the var
1bea0 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 ious stack varia
1beb0 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 bles so. ** tha
1bec0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 t this routine b
1bed0 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 egins comparing
1bee0 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 at the second fi
1bef0 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 eld. */. if( bS
1bf00 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 kip ){. u32 s
1bf10 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 1;. idx1 = 1
1bf20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 + getVarint32(&a
1bf30 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 Key1[1], s1);.
1bf40 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 szHdr1 = aKey1
1bf50 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a [0];. d1 = sz
1bf60 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 Hdr1 + sqlite3Vd
1bf70 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
1bf80 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a s1);. i = 1;.
1bf90 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 pRhs++;. }e
1bfa0 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 lse{. idx1 =
1bfb0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 getVarint32(aKey
1bfc0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 1, szHdr1);.
1bfd0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 d1 = szHdr1;.
1bfe0 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 if( d1>(unsigne
1bff0 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 d)nKey1 ){ .
1c000 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 pPKey2->errCod
1c010 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 e = (u8)SQLITE_C
1c020 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 ORRUPT_BKPT;.
1c030 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a return 0; /*
1c040 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 Corruption */.
1c050 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a }. i = 0;.
1c060 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 }.. VVA_ONLY(
1c070 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d mem1.szMalloc =
1c080 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 0; ) /* Only ne
1c090 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 eded by assert()
1c0a0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 statements */.
1c0b0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d assert( pPKey2-
1c0c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c >pKeyInfo->nFiel
1c0d0 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e d+pPKey2->pKeyIn
1c0e0 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b fo->nXField>=pPK
1c0f0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 ey2->nField .
1c100 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 || CORRUPT_D
1c110 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 B );. assert( p
1c120 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1c130 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 >aSortOrder!=0 )
1c140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 ;. assert( pPKe
1c150 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 y2->pKeyInfo->nF
1c160 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 ield>0 );. asse
1c170 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 rt( idx1<=szHdr1
1c180 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 || CORRUPT_DB )
1c190 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 ;. do{. u32
1c1a0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 serial_type;..
1c1b0 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 /* RHS is an i
1c1c0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 nteger */. if
1c1d0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 ( pRhs->flags &
1c1e0 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 MEM_Int ){.
1c1f0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 serial_type = a
1c200 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 Key1[idx1];.
1c210 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 testcase( seri
1c220 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 al_type==12 );.
1c230 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f if( serial_
1c240 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 type>=12 ){.
1c250 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 rc = +1;.
1c260 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 }else if( ser
1c270 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 ial_type==0 ){.
1c280 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a rc = -1;.
1c290 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
1c2a0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 serial_type==7 )
1c2b0 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 {. double
1c2c0 20 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70 rhs = (double)p
1c2d0 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 Rhs->u.i;.
1c2e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 sqlite3VdbeSer
1c2f0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 ialGet(&aKey1[d1
1c300 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 ], serial_type,
1c310 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 &mem1);.
1c320 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 72 68 73 if( mem1.u.r<rhs
1c330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 ){. rc
1c340 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d = -1;. }
1c350 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e else if( mem1.u.
1c360 72 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 r>rhs ){.
1c370 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 rc = +1;.
1c380 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 }. }els
1c390 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c e{. i64 l
1c3a0 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 hs = vdbeRecordD
1c3b0 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f ecodeInt(serial_
1c3c0 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d type, &aKey1[d1]
1c3d0 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 );. i64 r
1c3e0 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a hs = pRhs->u.i;.
1c3f0 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c if( lhs<
1c400 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 rhs ){.
1c410 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 rc = -1;.
1c420 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e }else if( lhs>
1c430 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 rhs ){.
1c440 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 rc = +1;.
1c450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
1c460 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 }.. /* RHS is
1c470 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 real */. els
1c480 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 e if( pRhs->flag
1c490 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a s & MEM_Real ){.
1c4a0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 serial_typ
1c4b0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b e = aKey1[idx1];
1c4c0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 . if( seria
1c4d0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 l_type>=12 ){.
1c4e0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 rc = +1;.
1c4f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 }else if( s
1c500 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b erial_type==0 ){
1c510 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 . rc = -1
1c520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
1c530 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 double rh
1c540 73 20 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 s = pRhs->u.r;.
1c550 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 double lh
1c560 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 s;. sqlit
1c570 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 e3VdbeSerialGet(
1c580 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 &aKey1[d1], seri
1c590 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b al_type, &mem1);
1c5a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 . if( ser
1c5b0 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 ial_type==7 ){.
1c5c0 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d lhs = m
1c5d0 65 6d 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20 em1.u.r;.
1c5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
1c5f0 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 lhs = (double)
1c600 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 mem1.u.i;.
1c610 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }. if(
1c620 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 lhs<rhs ){.
1c630 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 rc = -1;.
1c640 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
1c650 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 lhs>rhs ){.
1c660 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 rc = +1;.
1c670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
1c680 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 }.. /* RH
1c690 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f S is a string */
1c6a0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 . else if( pR
1c6b0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f hs->flags & MEM_
1c6c0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 Str ){. get
1c6d0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b Varint32(&aKey1[
1c6e0 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 idx1], serial_ty
1c6f0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 pe);. testc
1c700 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 ase( serial_type
1c710 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 ==12 );. if
1c720 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 ( serial_type<12
1c730 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){. rc =
1c740 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 -1;. }else
1c750 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 if( !(serial_ty
1c760 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 pe & 0x01) ){.
1c770 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 rc = +1;.
1c780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
1c790 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 mem1.n = (se
1c7a0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 rial_type - 12)
1c7b0 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 / 2;. tes
1c7c0 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e tcase( (d1+mem1.
1c7d0 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b n)==(unsigned)nK
1c7e0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 ey1 );. t
1c7f0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d estcase( (d1+mem
1c800 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 1.n+1)==(unsigne
1c810 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 d)nKey1 );.
1c820 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e if( (d1+mem1.
1c830 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e n) > (unsigned)n
1c840 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 Key1 ){.
1c850 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 pPKey2->errCod
1c860 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 e = (u8)SQLITE_C
1c870 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 ORRUPT_BKPT;.
1c880 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b return 0;
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c8a0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f /* Corruption */
1c8b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 . }else i
1c8c0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f f( pKeyInfo->aCo
1c8d0 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 ll[i] ){.
1c8e0 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b mem1.enc = pK
1c8f0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 eyInfo->enc;.
1c900 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d mem1.db =
1c910 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 pKeyInfo->db;.
1c920 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c mem1.fl
1c930 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 ags = MEM_Str;.
1c940 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 mem1.z
1c950 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b = (char*)&aKey1[
1c960 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 d1];. r
1c970 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d c = vdbeCompareM
1c980 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 emString(.
1c990 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 &mem1, p
1c9a0 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 Rhs, pKeyInfo->a
1c9b0 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 Coll[i], &pPKey2
1c9c0 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 ->errCode.
1c9d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d );. }
1c9e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 else{.
1c9f0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d int nCmp = MIN(m
1ca00 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b em1.n, pRhs->n);
1ca10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
1ca20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 memcmp(&aKey1[d1
1ca30 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 ], pRhs->z, nCmp
1ca40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 );. if(
1ca50 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 rc==0 ) rc = me
1ca60 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 m1.n - pRhs->n;
1ca70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
1ca80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a }. }.. /*
1ca90 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a RHS is a blob *
1caa0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 /. else if( p
1cab0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Rhs->flags & MEM
1cac0 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 _Blob ){. g
1cad0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 etVarint32(&aKey
1cae0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 1[idx1], serial_
1caf0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 type);. tes
1cb00 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 tcase( serial_ty
1cb10 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 pe==12 );.
1cb20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c if( serial_type<
1cb30 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 12 || (serial_ty
1cb40 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 pe & 0x01) ){.
1cb50 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 rc = -1;.
1cb60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
1cb70 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 int nStr = (
1cb80 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 serial_type - 12
1cb90 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 ) / 2;. t
1cba0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 estcase( (d1+nSt
1cbb0 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b r)==(unsigned)nK
1cbc0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 ey1 );. t
1cbd0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 estcase( (d1+nSt
1cbe0 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 r+1)==(unsigned)
1cbf0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 nKey1 );.
1cc00 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e if( (d1+nStr) >
1cc10 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 (unsigned)nKey1
1cc20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 ){. pP
1cc30 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 Key2->errCode =
1cc40 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 (u8)SQLITE_CORRU
1cc50 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 PT_BKPT;.
1cc60 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 return 0;
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
1cc80 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 orruption */.
1cc90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
1cca0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d int nCmp =
1ccb0 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d MIN(nStr, pRhs-
1ccc0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 >n);. r
1ccd0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 c = memcmp(&aKey
1cce0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 1[d1], pRhs->z,
1ccf0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 nCmp);.
1cd00 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 if( rc==0 ) rc
1cd10 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e = nStr - pRhs->n
1cd20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
1cd30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
1cd40 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f * RHS is null */
1cd50 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 . else{.
1cd60 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 serial_type = a
1cd70 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 Key1[idx1];.
1cd80 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 rc = (serial_t
1cd90 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a ype!=0);. }..
1cda0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b if( rc!=0 ){
1cdb0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 . if( pKeyI
1cdc0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b nfo->aSortOrder[
1cdd0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 i] ){. rc
1cde0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a = -rc;. }.
1cdf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64 assert( vd
1ce00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 beRecordCompareD
1ce10 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 ebug(nKey1, pKey
1ce20 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 1, pPKey2, rc) )
1ce30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
1ce40 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 mem1.szMalloc==0
1ce50 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d ); /* See comm
1ce60 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 ent below */.
1ce70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
1ce80 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 }.. i++;.
1ce90 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 pRhs++;. d1
1cea0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 += sqlite3VdbeS
1ceb0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
1cec0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 ial_type);. i
1ced0 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 dx1 += sqlite3Va
1cee0 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 rintLen(serial_t
1cef0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 ype);. }while(
1cf00 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 idx1<(unsigned)s
1cf10 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 zHdr1 && i<pPKey
1cf20 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 2->nField && d1<
1cf30 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 =(unsigned)nKey1
1cf40 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d );.. /* No mem
1cf50 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 ory allocation i
1cf60 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d s ever used on m
1cf70 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 em1. Prove this
1cf80 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 using. ** the
1cf90 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 following assert
1cfa0 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 (). If the asse
1cfb0 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 rt() fails, it i
1cfc0 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 ndicates a. **
1cfd0 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 memory leak and
1cfe0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 a need to call s
1cff0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
1d000 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f ease(&mem1). */
1d010 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e . assert( mem1.
1d020 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a szMalloc==0 );..
1d030 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 /* rc==0 here
1d040 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f means that one o
1d050 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 r both of the ke
1d060 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 ys ran out of fi
1d070 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c elds and. ** al
1d080 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 l the fields up
1d090 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 to that point we
1d0a0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e re equal. Return
1d0b0 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a the default_rc.
1d0c0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a ** value. */.
1d0d0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 assert( CORRUP
1d0e0 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 T_DB . ||
1d0f0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 vdbeRecordCompar
1d100 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b eDebug(nKey1, pK
1d110 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b ey1, pPKey2, pPK
1d120 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 ey2->default_rc)
1d130 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 . || pKey
1d140 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 Info->db->malloc
1d150 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 Failed. );. re
1d160 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 turn pPKey2->def
1d170 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 ault_rc;.}.int s
1d180 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 qlite3VdbeRecord
1d190 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e Compare(. int n
1d1a0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 Key1, const void
1d1b0 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 *pKey1, /* Le
1d1c0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 ft key */. Unpa
1d1d0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 ckedRecord *pPKe
1d1e0 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 y2 /* R
1d1f0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 ight key */.){.
1d200 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
1d210 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1d220 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 WithSkip(nKey1,
1d230 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 pKey1, pPKey2, 0
1d240 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 );.}.../*.** Thi
1d250 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e s function is an
1d260 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 optimized versi
1d270 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 on of sqlite3Vdb
1d280 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 eRecordCompare()
1d290 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 .** that (a) th
1d2a0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 e first field of
1d2b0 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e pPKey2 is an in
1d2c0 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 teger, and (b) t
1d2d0 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 he .** size-of-h
1d2e0 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 eader varint at
1d2f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b the start of (pK
1d300 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 ey1/nKey1) fits
1d310 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 in a single.** b
1d320 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 yte (i.e. is les
1d330 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a s than 128)..**.
1d340 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 ** To avoid conc
1d350 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 erns about buffe
1d360 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 r overreads, thi
1d370 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c s routine is onl
1d380 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 y used.** on sch
1d390 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d emas where the m
1d3a0 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 aximum valid hea
1d3b0 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 der size is 63 b
1d3c0 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f ytes or less..*/
1d3d0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 .static int vdbe
1d3e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 RecordCompareInt
1d3f0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 (. int nKey1, c
1d400 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 onst void *pKey1
1d410 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f , /* Left key */
1d420 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 . UnpackedRecor
1d430 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 d *pPKey2
1d440 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f /* Right key */
1d450 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a .){. const u8 *
1d460 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 aKey = &((const
1d470 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e u8*)pKey1)[*(con
1d480 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 st u8*)pKey1 & 0
1d490 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 x3F];. int seri
1d4a0 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 al_type = ((cons
1d4b0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b t u8*)pKey1)[1];
1d4c0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 . int res;. u3
1d4d0 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 2 y;. u64 x;.
1d4e0 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e i64 v = pPKey2->
1d4f0 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 aMem[0].u.i;. i
1d500 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 64 lhs;.. vdbeA
1d510 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 ssertFieldCountW
1d520 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 ithinLimits(nKey
1d530 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 1, pKey1, pPKey2
1d540 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 ->pKeyInfo);. a
1d550 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b ssert( (*(u8*)pK
1d560 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f ey1)<=0x3F || CO
1d570 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 RRUPT_DB );. sw
1d580 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 itch( serial_typ
1d590 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a e ){. case 1:
1d5a0 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 { /* 1-byte sig
1d5b0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 ned integer */.
1d5c0 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 lhs = ONE_B
1d5d0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 YTE_INT(aKey);.
1d5e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c testcase( l
1d5f0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 hs<0 );. br
1d600 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
1d610 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 ase 2: { /* 2-by
1d620 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 te signed intege
1d630 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d r */. lhs =
1d640 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b TWO_BYTE_INT(aK
1d650 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 ey);. testc
1d660 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 ase( lhs<0 );.
1d670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
1d680 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f . case 3: { /
1d690 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 * 3-byte signed
1d6a0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 integer */.
1d6b0 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 lhs = THREE_BYT
1d6c0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 E_INT(aKey);.
1d6d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 testcase( lhs
1d6e0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 <0 );. brea
1d6f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
1d700 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 e 4: { /* 4-byte
1d710 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 signed integer
1d720 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 */. y = FOU
1d730 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 R_BYTE_UINT(aKey
1d740 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 );. lhs = (
1d750 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 i64)*(int*)&y;.
1d760 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c testcase( l
1d770 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 hs<0 );. br
1d780 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
1d790 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 ase 5: { /* 6-by
1d7a0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 te signed intege
1d7b0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d r */. lhs =
1d7c0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 FOUR_BYTE_UINT(
1d7d0 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 aKey+2) + (((i64
1d7e0 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 )1)<<32)*TWO_BYT
1d7f0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 E_INT(aKey);.
1d800 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 testcase( lhs
1d810 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 <0 );. brea
1d820 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
1d830 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 e 6: { /* 8-byte
1d840 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 signed integer
1d850 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 */. x = FOU
1d860 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 R_BYTE_UINT(aKey
1d870 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c );. x = (x<
1d880 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 <32) | FOUR_BYTE
1d890 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 _UINT(aKey+4);.
1d8a0 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 lhs = *(i64
1d8b0 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 *)&x;. test
1d8c0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 case( lhs<0 );.
1d8d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
1d8e0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 }. case 8: .
1d8f0 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 lhs = 0;.
1d900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 break;. c
1d910 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 ase 9:. lhs
1d920 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 = 1;. brea
1d930 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 k;.. /* This
1d940 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 case could be re
1d950 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 moved without ch
1d960 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c anging the resul
1d970 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 ts of running.
1d980 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 ** this code.
1d990 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 Including it cau
1d9a0 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 ses gcc to gener
1d9b0 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 ate a faster swi
1d9c0 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 tch . ** stat
1d9d0 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 ement (since the
1d9e0 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 range of switch
1d9f0 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 targets now sta
1da00 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a rts at zero and.
1da10 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 ** is contig
1da20 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e uous) but does n
1da30 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 ot cause any dup
1da40 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 licate code to b
1da50 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 e generated.
1da60 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c ** (as gcc is cl
1da70 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 ever enough to c
1da80 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c ombine the two l
1da90 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 ike cases). Othe
1daa0 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c r . ** compil
1dab0 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d ers might be sim
1dac0 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 ilar. */ . c
1dad0 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 ase 0: case 7:.
1dae0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 return sqli
1daf0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d te3VdbeRecordCom
1db00 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 pare(nKey1, pKey
1db10 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 1, pPKey2);..
1db20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 default:.
1db30 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 return sqlite3Vd
1db40 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
1db50 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
1db60 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 Key2);. }.. if
1db70 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 ( v>lhs ){. r
1db80 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b es = pPKey2->r1;
1db90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c . }else if( v<l
1dba0 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 hs ){. res =
1dbb0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 pPKey2->r2;. }e
1dbc0 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e lse if( pPKey2->
1dbd0 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 nField>1 ){.
1dbe0 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 /* The first fie
1dbf0 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b lds of the two k
1dc00 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 eys are equal. C
1dc10 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c ompare the trail
1dc20 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c ing . ** fiel
1dc30 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 ds. */. res
1dc40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 = sqlite3VdbeRec
1dc50 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b ordCompareWithSk
1dc60 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c ip(nKey1, pKey1,
1dc70 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d pPKey2, 1);. }
1dc80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 else{. /* The
1dc90 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 first fields of
1dca0 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 the two keys ar
1dcb0 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 e equal and ther
1dcc0 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e e are no trailin
1dcd0 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e g. ** fields.
1dce0 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e Return pPKey2->
1dcf0 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 default_rc in th
1dd00 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 is case. */.
1dd10 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 res = pPKey2->de
1dd20 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 fault_rc;. }..
1dd30 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 assert( vdbeRec
1dd40 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 ordCompareDebug(
1dd50 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
1dd60 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 Key2, res) );.
1dd70 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f return res;.}../
1dd80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
1dd90 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a on is an optimiz
1dda0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 ed version of sq
1ddb0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 lite3VdbeRecordC
1ddc0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 ompare() .** tha
1ddd0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 t (a) the first
1dde0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 field of pPKey2
1ddf0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 is a string, tha
1de00 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 t (b) the first
1de10 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 field.** uses th
1de20 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 e collation sequ
1de30 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 ence BINARY and
1de40 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a (c) that the siz
1de50 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 e-of-header vari
1de60 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 nt .** at the st
1de70 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b art of (pKey1/nK
1de80 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 ey1) fits in a s
1de90 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 ingle byte..*/.s
1dea0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 tatic int vdbeRe
1deb0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e cordCompareStrin
1dec0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 g(. int nKey1,
1ded0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
1dee0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 1, /* Left key *
1def0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f /. UnpackedReco
1df00 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 rd *pPKey2
1df10 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a /* Right key *
1df20 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 /.){. const u8
1df30 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 *aKey1 = (const
1df40 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 u8*)pKey1;. int
1df50 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 serial_type;.
1df60 69 6e 74 20 72 65 73 3b 0a 0a 20 20 76 64 62 65 int res;.. vdbe
1df70 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 AssertFieldCount
1df80 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 WithinLimits(nKe
1df90 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 y1, pKey1, pPKey
1dfa0 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 2->pKeyInfo);.
1dfb0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 getVarint32(&aKe
1dfc0 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 y1[1], serial_ty
1dfd0 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 pe);. if( seria
1dfe0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 l_type<12 ){.
1dff0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 res = pPKey2->r
1e000 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 1; /* (pKey
1e010 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 1/nKey1) is a nu
1e020 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a mber or a null *
1e030 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 /. }else if( !(
1e040 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 serial_type & 0x
1e050 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 01) ){ . res
1e060 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 = pPKey2->r2;
1e070 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 /* (pKey1/nKe
1e080 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f y1) is a blob */
1e090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e . }else{. in
1e0a0 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 t nCmp;. int
1e0b0 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a nStr;. int sz
1e0c0 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a Hdr = aKey1[0];.
1e0d0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 . nStr = (ser
1e0e0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 ial_type-12) / 2
1e0f0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 ;. if( (szHdr
1e100 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 + nStr) > nKey1
1e110 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 ){. pPKey2
1e120 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 ->errCode = (u8)
1e130 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
1e140 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 KPT;. retur
1e150 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 n 0; /* Corru
1e160 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 ption */. }.
1e170 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 nCmp = MIN( p
1e180 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e PKey2->aMem[0].n
1e190 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 , nStr );. re
1e1a0 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 s = memcmp(&aKey
1e1b0 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 1[szHdr], pPKey2
1e1c0 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d ->aMem[0].z, nCm
1e1d0 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 p);.. if( res
1e1e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 ==0 ){. res
1e1f0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 = nStr - pPKey2
1e200 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 ->aMem[0].n;.
1e210 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b if( res==0 ){
1e220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b . if( pPK
1e230 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b ey2->nField>1 ){
1e240 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d . res =
1e250 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
1e260 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 rdCompareWithSki
1e270 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 p(nKey1, pKey1,
1e280 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 pPKey2, 1);.
1e290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1e2a0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 res = pPKey
1e2b0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 2->default_rc;.
1e2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
1e2d0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 else if( res>0 )
1e2e0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 {. res =
1e2f0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 pPKey2->r2;.
1e300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
1e310 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 res = pPKey2->r
1e320 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 1;. }. }
1e330 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 else if( res>0 )
1e340 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 {. res = pP
1e350 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 Key2->r2;. }e
1e360 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d lse{. res =
1e370 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 pPKey2->r1;.
1e380 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 }. }.. assert
1e390 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 ( vdbeRecordComp
1e3a0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 areDebug(nKey1,
1e3b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 pKey1, pPKey2, r
1e3c0 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f es). || CO
1e3d0 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 RRUPT_DB.
1e3e0 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 || pPKey2->pKeyI
1e3f0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 nfo->db->mallocF
1e400 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 ailed. );. ret
1e410 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a urn res;.}../*.*
1e420 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 * Return a point
1e430 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 er to an sqlite3
1e440 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
1e450 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 e() compatible f
1e460 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 unction.** suita
1e470 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e ble for comparin
1e480 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 g serialized rec
1e490 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 ords to the unpa
1e4a0 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 cked record pass
1e4b0 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c ed.** as the onl
1e4c0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 y argument..*/.R
1e4d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c ecordCompare sql
1e4e0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 ite3VdbeFindComp
1e4f0 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f are(UnpackedReco
1e500 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 rd *p){. /* var
1e510 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 intRecordCompare
1e520 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 Int() and varint
1e530 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 RecordCompareStr
1e540 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d ing() both assum
1e550 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 e. ** that the
1e560 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 size-of-header v
1e570 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 arint that occur
1e580 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f s at the start o
1e590 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 f each record.
1e5a0 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e ** fits in a sin
1e5b0 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 gle byte (i.e. i
1e5c0 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 s 127 or less).
1e5d0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 varintRecordComp
1e5e0 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c areInt(). ** al
1e5f0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 so assumes that
1e600 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 it is safe to ov
1e610 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 erread a buffer
1e620 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 by at least the
1e630 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f . ** maximum po
1e640 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 ssible legal hea
1e650 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 der size plus 8
1e660 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 bytes. Because t
1e670 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 here is. ** gua
1e680 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 ranteed to be at
1e690 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e least 74 (but n
1e6a0 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 ot 136) bytes of
1e6b0 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 padding followi
1e6c0 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 ng each. ** buf
1e6d0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 fer passed to va
1e6e0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 rintRecordCompar
1e6f0 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 eInt() this make
1e700 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 s it convenient
1e710 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 to. ** limit th
1e720 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 e size of the he
1e730 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 ader to 64 bytes
1e740 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 in cases where
1e750 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a the first field.
1e760 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 ** is an integ
1e770 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 er.. **. ** Th
1e780 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f e easiest way to
1e790 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 enforce this li
1e7a0 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 mit is to consid
1e7b0 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 er only records
1e7c0 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 with. ** 13 fie
1e7d0 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 lds or less. If
1e7e0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 the first field
1e7f0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 is an integer, t
1e800 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c he maximum legal
1e810 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a . ** header siz
1e820 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b e is (12*5 + 1 +
1e830 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 1) bytes. */.
1e840 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 if( (p->pKeyInf
1e850 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 o->nField + p->p
1e860 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 KeyInfo->nXField
1e870 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 )<=13 ){. int
1e880 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d flags = p->aMem
1e890 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 [0].flags;. i
1e8a0 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e f( p->pKeyInfo->
1e8b0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b aSortOrder[0] ){
1e8c0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 . p->r1 = 1
1e8d0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 ;. p->r2 =
1e8e0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 -1;. }else{.
1e8f0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b p->r1 = -1;
1e900 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 . p->r2 = 1
1e910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
1e920 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 (flags & MEM_Int
1e930 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 ) ){. retur
1e940 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 n vdbeRecordComp
1e950 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 areInt;. }.
1e960 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 testcase( flag
1e970 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a s & MEM_Real );.
1e980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c testcase( fl
1e990 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 ags & MEM_Null )
1e9a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 ;. testcase(
1e9b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 flags & MEM_Blob
1e9c0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 );. if( (fla
1e9d0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d gs & (MEM_Real|M
1e9e0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 EM_Null|MEM_Blob
1e9f0 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 ))==0 && p->pKey
1ea00 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d Info->aColl[0]==
1ea10 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 0 ){. asser
1ea20 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 t( flags & MEM_S
1ea30 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 tr );. retu
1ea40 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d rn vdbeRecordCom
1ea50 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 pareString;.
1ea60 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 }. }.. return
1ea70 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 sqlite3VdbeRecor
1ea80 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a dCompare;.}../*.
1ea90 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 ** pCur points a
1eaa0 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 t an index entry
1eab0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 created using t
1eac0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 he OP_MakeRecord
1ead0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 opcode..** Read
1eae0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 the rowid (the
1eaf0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 last field in th
1eb00 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 e record) and st
1eb10 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 ore it in *rowid
1eb20 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 ..** Return SQLI
1eb30 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 TE_OK if everyth
1eb40 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e ing works, or an
1eb50 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 error code othe
1eb60 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 rwise..**.** pCu
1eb70 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 r might be point
1eb80 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 ing to text obta
1eb90 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 ined from a corr
1eba0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c upt database fil
1ebb0 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e e..** So the con
1ebc0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 tent cannot be t
1ebd0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 rusted. Do appr
1ebe0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f opriate checks o
1ebf0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a n the content..*
1ec00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
1ec10 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 eIdxRowid(sqlite
1ec20 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 3 *db, BtCursor
1ec30 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 *pCur, i64 *rowi
1ec40 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b d){. i64 nCellK
1ec50 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 ey = 0;. int rc
1ec60 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 ;. u32 szHdr;
1ec70 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
1ec80 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 the header */.
1ec90 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 u32 typeRowid;
1eca0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 /* Serial typ
1ecb0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a e of the rowid *
1ecc0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 /. u32 lenRowid
1ecd0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 ; /* Size of
1ece0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 the rowid */.
1ecf0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 Mem m, v;.. /*
1ed00 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 Get the size of
1ed10 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e the index entry.
1ed20 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 Only indices e
1ed30 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 ntries of less.
1ed40 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 ** than 2GiB ar
1ed50 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 e support - anyt
1ed60 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 hing large must
1ed70 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 be database corr
1ed80 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 uption.. ** Any
1ed90 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 corruption is d
1eda0 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 etected in sqlit
1edb0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c e3BtreeParseCell
1edc0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 Ptr(), though, s
1edd0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 o. ** this code
1ede0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 can safely assu
1edf0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 me that nCellKey
1ee00 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 is 32-bits .
1ee10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c */. assert( sql
1ee20 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 ite3BtreeCursorI
1ee30 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a sValid(pCur) );.
1ee40 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 VVA_ONLY(rc =)
1ee50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 sqlite3BtreeKey
1ee60 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c Size(pCur, &nCel
1ee70 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 lKey);. assert(
1ee80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
1ee90 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 ; /* pCur is
1eea0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f always valid so
1eeb0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 KeySize cannot
1eec0 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 fail */. assert
1eed0 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 ( (nCellKey & SQ
1eee0 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 LITE_MAX_U32)==(
1eef0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a u64)nCellKey );.
1ef00 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 . /* Read in th
1ef10 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 e complete conte
1ef20 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 nt of the index
1ef30 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 entry */. sqlit
1ef40 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d e3VdbeMemInit(&m
1ef50 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d , db, 0);. rc =
1ef60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 sqlite3VdbeMemF
1ef70 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 romBtree(pCur, 0
1ef80 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c , (u32)nCellKey,
1ef90 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 1, &m);. if( r
1efa0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 c ){. return
1efb0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 rc;. }.. /* Th
1efc0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 e index entry mu
1efd0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 st begin with a
1efe0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 header size */.
1eff0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 (void)getVarint
1f000 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 32((u8*)m.z, szH
1f010 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 dr);. testcase(
1f020 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 szHdr==3 );. t
1f030 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d estcase( szHdr==
1f040 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c m.n );. if( unl
1f050 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c ikely(szHdr<3 ||
1f060 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 (int)szHdr>m.n)
1f070 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 ){. goto idx
1f080 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f _rowid_corruptio
1f090 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 n;. }.. /* The
1f0a0 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 last field of t
1f0b0 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 he index should
1f0c0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 be an integer -
1f0d0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 the ROWID.. **
1f0e0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 Verify that the
1f0f0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c last entry reall
1f100 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e y is an integer.
1f110 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 */. (void)getV
1f120 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e arint32((u8*)&m.
1f130 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 z[szHdr-1], type
1f140 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 Rowid);. testca
1f150 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 se( typeRowid==1
1f160 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
1f170 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a typeRowid==2 );.
1f180 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
1f190 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 Rowid==3 );. te
1f1a0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
1f1b0 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 d==4 );. testca
1f1c0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 se( typeRowid==5
1f1d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
1f1e0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a typeRowid==6 );.
1f1f0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
1f200 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 Rowid==8 );. te
1f210 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
1f220 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e d==9 );. if( un
1f230 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 likely(typeRowid
1f240 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e <1 || typeRowid>
1f250 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 9 || typeRowid==
1f260 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 7) ){. goto i
1f270 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 dx_rowid_corrupt
1f280 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f ion;. }. lenRo
1f290 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 wid = sqlite3Vdb
1f2a0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 eSerialTypeLen(t
1f2b0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 ypeRowid);. tes
1f2c0 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d tcase( (u32)m.n=
1f2d0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 =szHdr+lenRowid
1f2e0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c );. if( unlikel
1f2f0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 y((u32)m.n<szHdr
1f300 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 +lenRowid) ){.
1f310 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 goto idx_rowid
1f320 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d _corruption;. }
1f330 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 .. /* Fetch the
1f340 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 integer off the
1f350 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 end of the inde
1f360 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 x record */. sq
1f370 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 lite3VdbeSerialG
1f380 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e et((u8*)&m.z[m.n
1f390 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 -lenRowid], type
1f3a0 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 Rowid, &v);. *r
1f3b0 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 owid = v.u.i;.
1f3c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 sqlite3VdbeMemRe
1f3d0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 lease(&m);. ret
1f3e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a urn SQLITE_OK;..
1f3f0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 /* Jump here i
1f400 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 f database corru
1f410 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 ption is detecte
1f420 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 d after m has be
1f430 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 en. ** allocate
1f440 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f d. Free the m o
1f450 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e bject and return
1f460 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e SQLITE_CORRUPT.
1f470 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f */.idx_rowid_co
1f480 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 rruption:. test
1f490 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 case( m.szMalloc
1f4a0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 !=0 );. sqlite3
1f4b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 VdbeMemRelease(&
1f4c0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c m);. return SQL
1f4d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
1f4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 ;.}../*.** Compa
1f4f0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 re the key of th
1f500 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 e index entry th
1f510 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 at cursor pC is
1f520 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 pointing to agai
1f530 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 nst.** the key s
1f540 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b tring in pUnpack
1f550 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 ed. Write into
1f560 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a *pRes a number.*
1f570 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 * that is negati
1f580 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 ve, zero, or pos
1f590 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c itive if pC is l
1f5a0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 ess than, equal
1f5b0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 to,.** or greate
1f5c0 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 r than pUnpacked
1f5d0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 . Return SQLITE
1f5e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a _OK on success..
1f5f0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 **.** pUnpacked
1f600 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 is either create
1f610 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 d without a rowi
1f620 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 d or is truncate
1f630 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 d so that it.**
1f640 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 omits the rowid
1f650 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 at the end. The
1f660 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e rowid at the en
1f670 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 d of the index e
1f680 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 ntry.** is ignor
1f690 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e ed as well. Hen
1f6a0 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 ce, this routine
1f6b0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 only compares t
1f6c0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 he prefixes .**
1f6d0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f of the keys prio
1f6e0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 r to the final r
1f6f0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e owid, not the en
1f700 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 tire key..*/.int
1f710 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b sqlite3VdbeIdxK
1f720 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c eyCompare(. sql
1f730 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 ite3 *db,
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1f750 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 Database connec
1f760 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 tion */. VdbeCu
1f770 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 rsor *pC,
1f780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
1f790 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 e cursor to comp
1f7a0 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 are against */.
1f7b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
1f7c0 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 *pUnpacked,
1f7d0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 /* Unpacked ve
1f7e0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a rsion of key */.
1f7f0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 int *res
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f810 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 /* Write the
1f820 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c comparison resul
1f830 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 t here */.){. i
1f840 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 64 nCellKey = 0;
1f850 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 . int rc;. BtC
1f860 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 ursor *pCur = pC
1f870 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d ->pCursor;. Mem
1f880 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 m;.. assert( s
1f890 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f qlite3BtreeCurso
1f8a0 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 rIsValid(pCur) )
1f8b0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 ;. VVA_ONLY(rc
1f8c0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b =) sqlite3BtreeK
1f8d0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 eySize(pCur, &nC
1f8e0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 ellKey);. asser
1f8f0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b t( rc==SQLITE_OK
1f900 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 ); /* pCur i
1f910 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 s always valid s
1f920 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 o KeySize cannot
1f930 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 fail */. /* nC
1f940 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 ellKey will alwa
1f950 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 ys be between 0
1f960 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 and 0xffffffff b
1f970 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 ecause of the wa
1f980 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 y. ** that btre
1f990 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 eParseCellPtr()
1f9a0 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 and sqlite3GetVa
1f9b0 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 rint32() are imp
1f9c0 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 lemented */. if
1f9d0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c ( nCellKey<=0 ||
1f9e0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 nCellKey>0x7fff
1f9f0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 ffff ){. *res
1fa00 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e = 0;. return
1fa10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
1fa20 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 BKPT;. }. sqli
1fa30 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 te3VdbeMemInit(&
1fa40 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 m, db, 0);. rc
1fa50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d = sqlite3VdbeMem
1fa60 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 FromBtree(pC->pC
1fa70 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e ursor, 0, (u32)n
1fa80 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b CellKey, 1, &m);
1fa90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 . if( rc ){.
1faa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a return rc;. }.
1fab0 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 *res = sqlite3
1fac0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
1fad0 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 e(m.n, m.z, pUnp
1fae0 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 acked);. sqlite
1faf0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
1fb00 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 &m);. return SQ
1fb10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
1fb20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 * This routine s
1fb30 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f ets the value to
1fb40 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 be returned by
1fb50 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 subsequent calls
1fb60 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 to.** sqlite3_c
1fb70 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 hanges() on the
1fb80 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 database handle
1fb90 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 'db'. .*/.void s
1fba0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 qlite3VdbeSetCha
1fbb0 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 nges(sqlite3 *db
1fbc0 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a , int nChange){.
1fbd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
1fbe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3_mutex_held(db-
1fbf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d >mutex) );. db-
1fc00 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e >nChange = nChan
1fc10 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c ge;. db->nTotal
1fc20 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 Change += nChang
1fc30 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 e;.}../*.** Set
1fc40 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 a flag in the vd
1fc50 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 be to update the
1fc60 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 change counter
1fc70 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c when it is final
1fc80 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 ised.** or reset
1fc90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
1fca0 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 3VdbeCountChange
1fcb0 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d s(Vdbe *v){. v-
1fcc0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 >changeCntOn = 1
1fcd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 ;.}../*.** Mark
1fce0 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 every prepared s
1fcf0 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 tatement associa
1fd00 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 ted with a datab
1fd10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a ase connection.*
1fd20 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a * as expired..**
1fd30 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 .** An expired s
1fd40 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 tatement means t
1fd50 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f hat recompilatio
1fd60 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 n of the stateme
1fd70 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 nt is.** recomme
1fd80 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 nd. Statements
1fd90 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e expire when thin
1fda0 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d gs happen that m
1fdb0 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f ake their.** pro
1fdc0 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 grams obsolete.
1fdd0 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 Removing user-d
1fde0 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 efined functions
1fdf0 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a or collating.**
1fe00 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 sequences, or c
1fe10 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f hanging an autho
1fe20 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f rization functio
1fe30 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 n are the types
1fe40 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 of.** things tha
1fe50 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 t make prepared
1fe60 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c statements obsol
1fe70 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ete..*/.void sql
1fe80 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 ite3ExpirePrepar
1fe90 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c edStatements(sql
1fea0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 ite3 *db){. Vdb
1feb0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 e *p;. for(p =
1fec0 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d db->pVdbe; p; p=
1fed0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 p->pNext){. p
1fee0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 ->expired = 1;.
1fef0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 }.}../*.** Retu
1ff00 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 rn the database
1ff10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
1ff20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c the Vdbe..*/.sql
1ff30 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 ite3 *sqlite3Vdb
1ff40 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 eDb(Vdbe *v){.
1ff50 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a return v->db;.}.
1ff60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 ./*.** Return a
1ff70 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 pointer to an sq
1ff80 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 lite3_value stru
1ff90 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 cture containing
1ffa0 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 the value bound
1ffb0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 .** parameter iV
1ffc0 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 ar of VM v. Exce
1ffd0 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 pt, if the value
1ffe0 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c is an SQL NULL,
1fff0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e return .** 0 in
20000 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 stead. Unless it
20010 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 is NULL, apply
20020 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e affinity aff (on
20030 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f e of the SQLITE_
20040 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e AFF_*.** constan
20050 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 ts) to the value
20060 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e before returnin
20070 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 g it..**.** The
20080 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d returned value m
20090 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 ust be freed by
200a0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 the caller using
200b0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 sqlite3ValueFre
200c0 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f e()..*/.sqlite3_
200d0 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 value *sqlite3Vd
200e0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 beGetBoundValue(
200f0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 Vdbe *v, int iVa
20100 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 r, u8 aff){. as
20110 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a sert( iVar>0 );.
20120 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d if( v ){. M
20130 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 em *pMem = &v->a
20140 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 Var[iVar-1];.
20150 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 if( 0==(pMem->f
20160 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 lags & MEM_Null)
20170 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
20180 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 3_value *pRet =
20190 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 sqlite3ValueNew(
201a0 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 v->db);. if
201b0 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 ( pRet ){.
201c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d sqlite3VdbeMem
201d0 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 Copy((Mem *)pRet
201e0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 , pMem);.
201f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 sqlite3ValueApp
20200 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c lyAffinity(pRet,
20210 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 aff, SQLITE_UTF
20220 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 8);. }.
20230 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 return pRet;.
20240 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 }. }. retur
20250 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f n 0;.}../*.** Co
20260 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 nfigure SQL vari
20270 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 able iVar so tha
20280 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 t binding a new
20290 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e value to it sign
202a0 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 als.** to sqlite
202b0 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 3_reoptimize() t
202c0 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 hat re-preparing
202d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d the statement m
202e0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 ay result.** in
202f0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 a better query p
20300 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c lan..*/.void sql
20310 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 ite3VdbeSetVarma
20320 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 sk(Vdbe *v, int
20330 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 iVar){. assert(
20340 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 iVar>0 );. if(
20350 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 iVar>32 ){.
20360 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 v->expmask = 0xf
20370 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 fffffff;. }else
20380 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b {. v->expmask
20390 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 |= ((u32)1 << (
203a0 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a iVar-1));. }.}.
203b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
203c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c OMIT_VIRTUALTABL
203d0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 E./*.** Transfer
203e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 error message t
203f0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 ext from an sqli
20400 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 te3_vtab.zErrMsg
20410 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a (text stored.**
20420 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 in memory obtai
20430 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 ned from sqlite3
20440 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 _malloc) into a
20450 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 Vdbe.zErrMsg (te
20460 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 xt stored.** in
20470 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 memory obtained
20480 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 from sqlite3DbMa
20490 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 lloc)..*/.void s
204a0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 qlite3VtabImport
204b0 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 Errmsg(Vdbe *p,
204c0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 sqlite3_vtab *pV
204d0 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 tab){. sqlite3
204e0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 *db = p->db;. s
204f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
20500 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 p->zErrMsg);.
20510 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c p->zErrMsg = sql
20520 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c ite3DbStrDup(db,
20530 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 pVtab->zErrMsg)
20540 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 ;. sqlite3_free
20550 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 (pVtab->zErrMsg)
20560 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d ;. pVtab->zErrM
20570 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 sg = 0;.}.#endif
20580 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f /* SQLITE_OMIT_
20590 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a VIRTUALTABLE */.