0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65 /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a . In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d sing:.**.** M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 nd not evil..**
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 give others..**
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a you 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 2a 0a 2a 2a 20 43 6f 64 65 20 66 ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 62 or testing the b
0190: 74 72 65 65 2e 63 20 6d 6f 64 75 6c 65 20 69 6e tree.c module in
01a0: 20 53 51 4c 69 74 65 2e 20 20 54 68 69 73 20 63 SQLite. This c
01b0: 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e ode.** is not in
01c0: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 53 51 cluded in the SQ
01d0: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20 49 Lite library. I
01e0: 74 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 75 t is used for au
01f0: 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73 74 69 tomated.** testi
0200: 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 ng of the SQLite
0210: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e library..*/.#in
0220: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 clude "sqliteInt
0230: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 .h".#include "bt
0240: 72 65 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 reeInt.h".#inclu
0250: 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c de "tcl.h".#incl
0260: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 ude <stdlib.h>.#
0270: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e include <string.
0280: 68 3e 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 h>..extern const
0290: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 char *sqlite3Er
02a0: 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 0a 2f 2a 0a rName(int);../*.
02b0: 2a 2a 20 41 20 62 6f 67 75 73 20 73 71 6c 69 74 ** A bogus sqlit
02c0: 65 33 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 e3 connection st
02d0: 72 75 63 74 75 72 65 20 66 6f 72 20 75 73 65 20 ructure for use
02e0: 69 6e 20 74 68 65 20 62 74 72 65 65 0a 2a 2a 20 in the btree.**
02f0: 74 65 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 tests..*/.static
0300: 20 73 71 6c 69 74 65 33 20 73 44 62 3b 0a 73 74 sqlite3 sDb;.st
0310: 61 74 69 63 20 69 6e 74 20 6e 52 65 66 53 71 6c atic int nRefSql
0320: 69 74 65 33 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a ite3 = 0;../*.**
0330: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f Usage: btree_
0340: 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45 20 4e 43 open FILENAME NC
0350: 41 43 48 45 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 ACHE.**.** Open
0360: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 0a 2a a new database.*
0370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 /.static int btr
0380: 65 65 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 ee_open(. void
0390: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f *NotUsed,. Tcl_
03a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
03b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e /* The TCL in
03c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 terpreter that i
03d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d nvoked this comm
03e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 and */. int arg
03f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c,
0400: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 /* Number of arg
0410: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 uments */. cons
0420: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 t char **argv
0430: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 /* Text of ea
0440: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 ch argument */.)
0450: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a {. Btree *pBt;.
0460: 20 20 69 6e 74 20 72 63 2c 20 6e 43 61 63 68 65 int rc, nCache
0470: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 ;. char zBuf[10
0480: 30 5d 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 0];. int n;. c
0490: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a har *zFilename;.
04a0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b if( argc!=3 ){
04b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
04c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 esult(interp, "w
04d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f rong # args: sho
04e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 uld be \"", argv
04f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 [0],. " FI
0500: 4c 45 4e 41 4d 45 20 4e 43 41 43 48 45 20 46 4c LENAME NCACHE FL
0510: 41 47 53 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 AGS\"", 0);.
0520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
0530: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f ;. }. if( Tcl_
0540: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 GetInt(interp, a
0550: 72 67 76 5b 32 5d 2c 20 26 6e 43 61 63 68 65 29 rgv[2], &nCache)
0560: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ) return TCL_ER
0570: 52 4f 52 3b 0a 20 20 6e 52 65 66 53 71 6c 69 74 ROR;. nRefSqlit
0580: 65 33 2b 2b 3b 0a 20 20 69 66 28 20 6e 52 65 66 e3++;. if( nRef
0590: 53 71 6c 69 74 65 33 3d 3d 31 20 29 7b 0a 20 20 Sqlite3==1 ){.
05a0: 20 20 73 44 62 2e 70 56 66 73 20 3d 20 73 71 6c sDb.pVfs = sql
05b0: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 ite3_vfs_find(0)
05c0: 3b 0a 20 20 20 20 73 44 62 2e 6d 75 74 65 78 20 ;. sDb.mutex
05d0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c = sqlite3MutexAl
05e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 loc(SQLITE_MUTEX
05f0: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 _RECURSIVE);.
0600: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
0610: 6e 74 65 72 28 73 44 62 2e 6d 75 74 65 78 29 3b nter(sDb.mutex);
0620: 0a 20 20 7d 0a 20 20 6e 20 3d 20 28 69 6e 74 29 . }. n = (int)
0630: 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 3b strlen(argv[1]);
0640: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 . zFilename = s
0650: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e qlite3_malloc( n
0660: 2b 32 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c +2 );. if( zFil
0670: 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 ename==0 ) retur
0680: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 6d n TCL_ERROR;. m
0690: 65 6d 63 70 79 28 7a 46 69 6c 65 6e 61 6d 65 2c emcpy(zFilename,
06a0: 20 61 72 67 76 5b 31 5d 2c 20 6e 2b 31 29 3b 0a argv[1], n+1);.
06b0: 20 20 7a 46 69 6c 65 6e 61 6d 65 5b 6e 2b 31 5d zFilename[n+1]
06c0: 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c = 0;. rc = sql
06d0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 73 44 ite3BtreeOpen(sD
06e0: 62 2e 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d b.pVfs, zFilenam
06f0: 65 2c 20 26 73 44 62 2c 20 26 70 42 74 2c 20 30 e, &sDb, &pBt, 0
0700: 2c 20 0a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f , . SQLITE_O
0710: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 PEN_READWRITE |
0720: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 SQLITE_OPEN_CREA
0730: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e TE | SQLITE_OPEN
0740: 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 73 71 6c _MAIN_DB);. sql
0750: 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e ite3_free(zFilen
0760: 61 6d 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d ame);. if( rc!=
0770: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
0780: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
0790: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 t(interp, sqlite
07a0: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3ErrName(rc), 0)
07b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
07c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 _ERROR;. }. sq
07d0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 lite3BtreeSetCac
07e0: 68 65 53 69 7a 65 28 70 42 74 2c 20 6e 43 61 63 heSize(pBt, nCac
07f0: 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 he);. sqlite3_s
0800: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a nprintf(sizeof(z
0810: 42 75 66 29 2c 20 7a 42 75 66 2c 22 25 70 22 2c Buf), zBuf,"%p",
0820: 20 70 42 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 pBt);. Tcl_App
0830: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
0840: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 , zBuf, 0);. re
0850: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a turn TCL_OK;.}..
0860: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 /*.** Usage: b
0870: 74 72 65 65 5f 63 6c 6f 73 65 20 49 44 0a 2a 2a tree_close ID.**
0880: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 67 69 .** Close the gi
0890: 76 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f ven database..*/
08a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 .static int btre
08b0: 65 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 e_close(. void
08c0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f *NotUsed,. Tcl_
08d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
08e0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e /* The TCL in
08f0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 terpreter that i
0900: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d nvoked this comm
0910: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 and */. int arg
0920: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c,
0930: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 /* Number of arg
0940: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 uments */. cons
0950: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 t char **argv
0960: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 /* Text of ea
0970: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 ch argument */.)
0980: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a {. Btree *pBt;.
0990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 int rc;. if(
09a0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 argc!=2 ){. T
09b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
09c0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 interp, "wrong #
09d0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 args: should be
09e0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 \"", argv[0],.
09f0: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 " ID\"", 0
0a00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
0a10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 L_ERROR;. }. p
0a20: 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 Bt = sqlite3Test
0a30: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 TextToPtr(argv[1
0a40: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 ]);. rc = sqlit
0a50: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 42 74 e3BtreeClose(pBt
0a60: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c );. if( rc!=SQL
0a70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 ITE_OK ){. Tc
0a80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
0a90: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 nterp, sqlite3Er
0aa0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 rName(rc), 0);.
0ab0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
0ac0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e 52 65 66 53 ROR;. }. nRefS
0ad0: 71 6c 69 74 65 33 2d 2d 3b 0a 20 20 69 66 28 20 qlite3--;. if(
0ae0: 6e 52 65 66 53 71 6c 69 74 65 33 3d 3d 30 20 29 nRefSqlite3==0 )
0af0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 {. sqlite3_mu
0b00: 74 65 78 5f 6c 65 61 76 65 28 73 44 62 2e 6d 75 tex_leave(sDb.mu
0b10: 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 tex);. sqlite
0b20: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 44 62 3_mutex_free(sDb
0b30: 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 44 62 .mutex);. sDb
0b40: 2e 6d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 .mutex = 0;.
0b50: 73 44 62 2e 70 56 66 73 20 3d 20 30 3b 0a 20 20 sDb.pVfs = 0;.
0b60: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f }. return TCL_O
0b70: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 K;.}.../*.** Usa
0b80: 67 65 3a 20 20 20 62 74 72 65 65 5f 62 65 67 69 ge: btree_begi
0b90: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 49 44 n_transaction ID
0ba0: 0a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 6e .**.** Start a n
0bb0: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a ew transaction.*
0bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 /.static int btr
0bd0: 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 ee_begin_transac
0be0: 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f tion(. void *No
0bf0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 tUsed,. Tcl_Int
0c00: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 erp *interp,
0c10: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 /* The TCL inter
0c20: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f preter that invo
0c30: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 ked this command
0c40: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 */. int argc,
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
0c60: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 Number of argume
0c70: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 nts */. const c
0c80: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 har **argv
0c90: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 /* Text of each
0ca0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 argument */.){.
0cb0: 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 Btree *pBt;. i
0cc0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 nt rc;. if( arg
0cd0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f c!=2 ){. Tcl_
0ce0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
0cf0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 erp, "wrong # ar
0d00: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 gs: should be \"
0d10: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 ", argv[0],.
0d20: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a " ID\"", 0);.
0d30: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
0d40: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 RROR;. }. pBt
0d50: 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 = sqlite3TestTex
0d60: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b tToPtr(argv[1]);
0d70: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 . sqlite3BtreeE
0d80: 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 nter(pBt);. rc
0d90: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 = sqlite3BtreeBe
0da0: 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 31 29 ginTrans(pBt, 1)
0db0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 ;. sqlite3Btree
0dc0: 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 69 66 Leave(pBt);. if
0dd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
0de0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ){. Tcl_Appen
0df0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
0e00: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 sqlite3ErrName(r
0e10: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 c), 0);. retu
0e20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
0e30: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f }. return TCL_O
0e40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 K;.}../*.** Usag
0e50: 65 3a 20 20 20 62 74 72 65 65 5f 70 61 67 65 72 e: btree_pager
0e60: 5f 73 74 61 74 73 20 49 44 0a 2a 2a 0a 2a 2a 20 _stats ID.**.**
0e70: 52 65 74 75 72 6e 73 20 70 61 67 65 72 20 73 74 Returns pager st
0e80: 61 74 69 73 74 69 63 73 0a 2a 2f 0a 73 74 61 74 atistics.*/.stat
0e90: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 70 61 67 ic int btree_pag
0ea0: 65 72 5f 73 74 61 74 73 28 0a 20 20 76 6f 69 64 er_stats(. void
0eb0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c *NotUsed,. Tcl
0ec0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0ed0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 /* The TCL i
0ee0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 nterpreter that
0ef0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d invoked this com
0f00: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 mand */. int ar
0f10: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 gc,
0f20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 /* Number of ar
0f30: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e guments */. con
0f40: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 st char **argv
0f50: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 /* Text of e
0f60: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a ach argument */.
0f70: 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b ){. Btree *pBt;
0f80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 . int i;. int
0f90: 2a 61 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 *a;.. if( argc!
0fa0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 =2 ){. Tcl_Ap
0fb0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
0fc0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 p, "wrong # args
0fd0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c : should be \"",
0fe0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 argv[0],.
0ff0: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 " ID\"", 0);.
1000: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
1010: 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 OR;. }. pBt =
1020: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 sqlite3TestTextT
1030: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 oPtr(argv[1]);.
1040: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 69 . /* Normally i
1050: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 77 69 74 n this file, wit
1060: 68 20 61 20 62 2d 74 72 65 65 20 68 61 6e 64 6c h a b-tree handl
1070: 65 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 e opened using t
1080: 68 65 20 0a 20 20 2a 2a 20 5b 62 74 72 65 65 5f he . ** [btree_
1090: 6f 70 65 6e 5d 20 63 6f 6d 6d 61 6e 64 20 69 74 open] command it
10a0: 20 69 73 20 73 61 66 65 20 74 6f 20 63 61 6c 6c is safe to call
10b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
10c0: 65 72 28 29 20 64 69 72 65 63 74 6c 79 2e 0a 20 er() directly..
10d0: 20 2a 2a 20 42 75 74 20 74 68 69 73 20 66 75 6e ** But this fun
10e0: 63 74 69 6f 6e 20 69 73 20 73 6f 6d 65 74 69 6d ction is sometim
10f0: 65 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 es called with a
1100: 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 6f 62 btree handle ob
1110: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 66 72 6f 6d tained. ** from
1120: 20 61 6e 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 an open SQLite
1130: 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 75 73 69 6e connection (usin
1140: 67 20 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 g [btree_from_db
1150: 5d 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 ]). In this case
1160: 0a 20 20 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f . ** we need to
1170: 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 obtain the mute
1180: 78 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 72 6f x for the contro
1190: 6c 6c 69 6e 67 20 53 51 4c 69 74 65 20 68 61 6e lling SQLite han
11a0: 64 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 dle before. **
11b0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 61 it is safe to ca
11c0: 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 ll sqlite3BtreeE
11d0: 6e 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 nter().. */. s
11e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 qlite3_mutex_ent
11f0: 65 72 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 er(pBt->db->mute
1200: 78 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 x);.. sqlite3Bt
1210: 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 reeEnter(pBt);.
1220: 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 a = sqlite3Page
1230: 72 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74 rStats(sqlite3Bt
1240: 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a reePager(pBt));.
1250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 31 3b for(i=0; i<11;
1260: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 i++){. stati
1270: 63 20 63 68 61 72 20 2a 7a 4e 61 6d 65 5b 5d 20 c char *zName[]
1280: 3d 20 7b 0a 20 20 20 20 20 20 22 72 65 66 22 2c = {. "ref",
1290: 20 22 70 61 67 65 22 2c 20 22 6d 61 78 22 2c 20 "page", "max",
12a0: 22 73 69 7a 65 22 2c 20 22 73 74 61 74 65 22 2c "size", "state",
12b0: 20 22 65 72 72 22 2c 0a 20 20 20 20 20 20 22 68 "err",. "h
12c0: 69 74 22 2c 20 22 6d 69 73 73 22 2c 20 22 6f 76 it", "miss", "ov
12d0: 66 6c 22 2c 20 22 72 65 61 64 22 2c 20 22 77 72 fl", "read", "wr
12e0: 69 74 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 ite". };.
12f0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a char zBuf[100];.
1300: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c Tcl_AppendEl
1310: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 4e ement(interp, zN
1320: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c ame[i]);. sql
1330: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 ite3_snprintf(si
1340: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 zeof(zBuf), zBuf
1350: 2c 22 25 64 22 2c 61 5b 69 5d 29 3b 0a 20 20 20 ,"%d",a[i]);.
1360: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 Tcl_AppendEleme
1370: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 nt(interp, zBuf)
1380: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 ;. }. sqlite3B
1390: 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a treeLeave(pBt);.
13a0: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 . /* Release th
13b0: 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 53 e mutex on the S
13c0: 51 4c 69 74 65 20 68 61 6e 64 6c 65 20 74 68 61 QLite handle tha
13d0: 74 20 63 6f 6e 74 72 6f 6c 73 20 74 68 69 73 20 t controls this
13e0: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c 69 b-tree */. sqli
13f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 te3_mutex_leave(
1400: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b pBt->db->mutex);
1410: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b . return TCL_OK
1420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 ;.}../*.** Usage
1430: 3a 20 20 20 62 74 72 65 65 5f 63 75 72 73 6f 72 : btree_cursor
1440: 20 49 44 20 54 41 42 4c 45 4e 55 4d 20 57 52 49 ID TABLENUM WRI
1450: 54 45 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 72 65 TEABLE.**.** Cre
1460: 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 ate a new cursor
1470: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 49 44 . Return the ID
1480: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2e for the cursor.
1490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 .*/.static int b
14a0: 74 72 65 65 5f 63 75 72 73 6f 72 28 0a 20 20 76 tree_cursor(. v
14b0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 oid *NotUsed,.
14c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
14d0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 rp, /* The TC
14e0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 L interpreter th
14f0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 at invoked this
1500: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 command */. int
1510: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 argc,
1520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
1530: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 arguments */.
1540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 const char **arg
1550: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f v /* Text o
1560: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 f each argument
1570: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 */.){. Btree *p
1580: 42 74 3b 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 Bt;. int iTable
1590: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 ;. BtCursor *pC
15a0: 75 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 ur;. int rc = S
15b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 QLITE_OK;. int
15c0: 77 72 46 6c 61 67 3b 0a 20 20 63 68 61 72 20 7a wrFlag;. char z
15d0: 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 Buf[30];.. if(
15e0: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 argc!=4 ){. T
15f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
1600: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 interp, "wrong #
1610: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 args: should be
1620: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 \"", argv[0],.
1630: 20 20 20 20 20 20 22 20 49 44 20 54 41 42 4c 45 " ID TABLE
1640: 4e 55 4d 20 57 52 49 54 45 41 42 4c 45 5c 22 22 NUM WRITEABLE\""
1650: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e , 0);. return
1660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a TCL_ERROR;. }.
1670: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54 pBt = sqlite3T
1680: 65 73 74 54 65 78 74 54 6f 50 74 72 28 61 72 67 estTextToPtr(arg
1690: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c v[1]);. if( Tcl
16a0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 _GetInt(interp,
16b0: 61 72 67 76 5b 32 5d 2c 20 26 69 54 61 62 6c 65 argv[2], &iTable
16c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 ) ) return TCL_E
16d0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f RROR;. if( Tcl_
16e0: 47 65 74 42 6f 6f 6c 65 61 6e 28 69 6e 74 65 72 GetBoolean(inter
16f0: 70 2c 20 61 72 67 76 5b 33 5d 2c 20 26 77 72 46 p, argv[3], &wrF
1700: 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 lag) ) return TC
1710: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 77 L_ERROR;. if( w
1720: 72 46 6c 61 67 20 29 20 77 72 46 6c 61 67 20 3d rFlag ) wrFlag =
1730: 20 42 54 52 45 45 5f 57 52 43 53 52 3b 0a 20 20 BTREE_WRCSR;.
1740: 70 43 75 72 20 3d 20 28 42 74 43 75 72 73 6f 72 pCur = (BtCursor
1750: 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 71 6c 69 74 *)ckalloc(sqlit
1760: 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a e3BtreeCursorSiz
1770: 65 28 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 e());. memset(p
1780: 43 75 72 2c 20 30 2c 20 73 71 6c 69 74 65 33 42 Cur, 0, sqlite3B
1790: 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 treeCursorSize()
17a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 );. sqlite3_mut
17b0: 65 78 5f 65 6e 74 65 72 28 70 42 74 2d 3e 64 62 ex_enter(pBt->db
17c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 ->mutex);. sqli
17d0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 te3BtreeEnter(pB
17e0: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 t);.#ifndef SQLI
17f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 TE_OMIT_SHARED_C
1800: 41 43 48 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 ACHE. rc = sqli
1810: 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c te3BtreeLockTabl
1820: 65 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 21 e(pBt, iTable, !
1830: 21 77 72 46 6c 61 67 29 3b 0a 23 65 6e 64 69 66 !wrFlag);.#endif
1840: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 . if( rc==SQLIT
1850: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d E_OK ){. rc =
1860: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 sqlite3BtreeCur
1870: 73 6f 72 28 70 42 74 2c 20 69 54 61 62 6c 65 2c sor(pBt, iTable,
1880: 20 77 72 46 6c 61 67 2c 20 30 2c 20 70 43 75 72 wrFlag, 0, pCur
1890: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 );. }. sqlite3
18a0: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b BtreeLeave(pBt);
18b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 . sqlite3_mutex
18c0: 5f 6c 65 61 76 65 28 70 42 74 2d 3e 64 62 2d 3e _leave(pBt->db->
18d0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63 mutex);. if( rc
18e0: 20 29 7b 0a 20 20 20 20 63 6b 66 72 65 65 28 28 ){. ckfree((
18f0: 63 68 61 72 20 2a 29 70 43 75 72 29 3b 0a 20 20 char *)pCur);.
1900: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
1910: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 lt(interp, sqlit
1920: 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 e3ErrName(rc), 0
1930: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
1940: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 L_ERROR;. }. s
1950: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
1960: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 sizeof(zBuf), zB
1970: 75 66 2c 22 25 70 22 2c 20 70 43 75 72 29 3b 0a uf,"%p", pCur);.
1980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
1990: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c lt(interp, zBuf,
19a0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 0);. return SQ
19b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
19c0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 * Usage: btree
19d0: 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72 20 49 44 _close_cursor ID
19e0: 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 .**.** Close a c
19f0: 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 ursor opened usi
1a00: 6e 67 20 62 74 72 65 65 5f 63 75 72 73 6f 72 2e ng btree_cursor.
1a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 .*/.static int b
1a20: 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f tree_close_curso
1a30: 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 r(. void *NotUs
1a40: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 ed,. Tcl_Interp
1a50: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 *interp, /*
1a60: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 The TCL interpre
1a70: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 ter that invoked
1a80: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f this command */
1a90: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 . int argc,
1aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
1ab0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
1ac0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
1ad0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 **argv /*
1ae0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 Text of each arg
1af0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 ument */.){. Bt
1b00: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 Cursor *pCur;.
1b10: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e Btree *pBt;. in
1b20: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 t rc;.. if( arg
1b30: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f c!=2 ){. Tcl_
1b40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
1b50: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 erp, "wrong # ar
1b60: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 gs: should be \"
1b70: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 ", argv[0],.
1b80: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a " ID\"", 0);.
1b90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
1ba0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 RROR;. }. pCur
1bb0: 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 = sqlite3TestTe
1bc0: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 xtToPtr(argv[1])
1bd0: 3b 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e ;. pBt = pCur->
1be0: 70 42 74 72 65 65 3b 0a 20 20 73 71 6c 69 74 65 pBtree;. sqlite
1bf0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 42 3_mutex_enter(pB
1c00: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 t->db->mutex);.
1c10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
1c20: 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20 er(pBt);. rc =
1c30: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 sqlite3BtreeClos
1c40: 65 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 eCursor(pCur);.
1c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 sqlite3BtreeLea
1c60: 76 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 ve(pBt);. sqlit
1c70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 e3_mutex_leave(p
1c80: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a Bt->db->mutex);.
1c90: 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a ckfree((char *
1ca0: 29 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 )pCur);. if( rc
1cb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 ){. Tcl_Appe
1cc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1cd0: 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 sqlite3ErrName(
1ce0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 rc), 0);. ret
1cf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
1d00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 }. return SQLI
1d10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
1d20: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 6e Usage: btree_n
1d30: 65 78 74 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 ext ID.**.** Mov
1d40: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 e the cursor to
1d50: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 the next entry i
1d60: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 n the table. Re
1d70: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 turn 0 on succes
1d80: 73 0a 2a 2a 20 6f 72 20 31 20 69 66 20 74 68 65 s.** or 1 if the
1d90: 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 72 65 cursor was alre
1da0: 61 64 79 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 ady on the last
1db0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 entry in the tab
1dc0: 6c 65 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 le or if.** the
1dd0: 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a table is empty..
1de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 */.static int bt
1df0: 72 65 65 5f 6e 65 78 74 28 0a 20 20 76 6f 69 64 ree_next(. void
1e00: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c *NotUsed,. Tcl
1e10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
1e20: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 /* The TCL i
1e30: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 nterpreter that
1e40: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d invoked this com
1e50: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 mand */. int ar
1e60: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 gc,
1e70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 /* Number of ar
1e80: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e guments */. con
1e90: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 st char **argv
1ea0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 /* Text of e
1eb0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a ach argument */.
1ec0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 ){. BtCursor *p
1ed0: 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 Cur;. int rc;.
1ee0: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 int res = 0;.
1ef0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a char zBuf[100];.
1f00: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 . if( argc!=2 )
1f10: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 {. Tcl_Append
1f20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
1f30: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 wrong # args: sh
1f40: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 ould be \"", arg
1f50: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 v[0],. " I
1f60: 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 D\"", 0);. re
1f70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
1f80: 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c }. pCur = sql
1f90: 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 ite3TestTextToPt
1fa0: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 r(argv[1]);. sq
1fb0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 lite3BtreeEnter(
1fc0: 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 pCur->pBtree);.
1fd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc = sqlite3Btr
1fe0: 65 65 4e 65 78 74 28 70 43 75 72 2c 20 26 72 65 eeNext(pCur, &re
1ff0: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 s);. sqlite3Btr
2000: 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 eeLeave(pCur->pB
2010: 74 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 20 tree);. if( rc
2020: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ){. Tcl_Appen
2030: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
2040: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 sqlite3ErrName(r
2050: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 c), 0);. retu
2060: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
2070: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 }. sqlite3_snpr
2080: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 intf(sizeof(zBuf
2090: 29 2c 7a 42 75 66 2c 22 25 64 22 2c 72 65 73 29 ),zBuf,"%d",res)
20a0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 ;. Tcl_AppendRe
20b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 sult(interp, zBu
20c0: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 f, 0);. return
20d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a SQLITE_OK;.}../*
20e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 .** Usage: btr
20f0: 65 65 5f 66 69 72 73 74 20 49 44 0a 2a 2a 0a 2a ee_first ID.**.*
2100: 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f * Move the curso
2110: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 r to the first e
2120: 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c ntry in the tabl
2130: 65 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 e. Return 0 if
2140: 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77 61 the.** cursor wa
2150: 73 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 s left point to
2160: 73 6f 6d 65 74 68 69 6e 67 20 61 6e 64 20 31 20 something and 1
2170: 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 if the table is
2180: 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 empty..*/.static
2190: 20 69 6e 74 20 62 74 72 65 65 5f 66 69 72 73 74 int btree_first
21a0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 (. void *NotUse
21b0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 d,. Tcl_Interp
21c0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 *interp, /* T
21d0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 he TCL interpret
21e0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 er that invoked
21f0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a this command */.
2200: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 int argc,
2210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
2220: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 er of arguments
2230: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
2240: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 **argv /* T
2250: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 ext of each argu
2260: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 ment */.){. BtC
2270: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 ursor *pCur;. i
2280: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65 73 nt rc;. int res
2290: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 = 0;. char zBu
22a0: 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 61 f[100];.. if( a
22b0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 rgc!=2 ){. Tc
22c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
22d0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 nterp, "wrong #
22e0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 args: should be
22f0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 \"", argv[0],.
2300: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 " ID\"", 0)
2310: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
2320: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 _ERROR;. }. pC
2330: 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 ur = sqlite3Test
2340: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 TextToPtr(argv[1
2350: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 ]);. sqlite3Btr
2360: 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 eeEnter(pCur->pB
2370: 74 72 65 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 tree);. rc = sq
2380: 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 lite3BtreeFirst(
2390: 70 43 75 72 2c 20 26 72 65 73 29 3b 0a 20 20 73 pCur, &res);. s
23a0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
23b0: 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a (pCur->pBtree);.
23c0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
23d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
23e0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 (interp, sqlite3
23f0: 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b ErrName(rc), 0);
2400: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
2410: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c ERROR;. }. sql
2420: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 ite3_snprintf(si
2430: 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c zeof(zBuf),zBuf,
2440: 22 25 64 22 2c 72 65 73 29 3b 0a 20 20 54 63 6c "%d",res);. Tcl
2450: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
2460: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a terp, zBuf, 0);.
2470: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
2480: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 OK;.}../*.** Usa
2490: 67 65 3a 20 20 20 62 74 72 65 65 5f 65 6f 66 20 ge: btree_eof
24a0: 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 ID.**.** Return
24b0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 TRUE if the give
24c0: 6e 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 n cursor is not
24d0: 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 pointing at a va
24e0: 6c 69 64 20 65 6e 74 72 79 2e 0a 2a 2a 20 52 65 lid entry..** Re
24f0: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 turn FALSE if th
2500: 65 20 63 75 72 73 6f 72 20 64 6f 65 73 20 70 6f e cursor does po
2510: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 int to a valid e
2520: 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ntry..*/.static
2530: 69 6e 74 20 62 74 72 65 65 5f 65 6f 66 28 0a 20 int btree_eof(.
2540: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a void *NotUsed,.
2550: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
2560: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 terp, /* The
2570: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 TCL interpreter
2580: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 that invoked thi
2590: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 s command */. i
25a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 nt argc,
25b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
25c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a of arguments */.
25d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 const char **a
25e0: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 rgv /* Text
25f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e of each argumen
2600: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 t */.){. BtCurs
2610: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 or *pCur;. int
2620: 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b rc;. char zBuf[
2630: 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 50];.. if( argc
2640: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 !=2 ){. Tcl_A
2650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
2660: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 rp, "wrong # arg
2670: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 s: should be \""
2680: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 , argv[0],.
2690: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 " ID\"", 0);.
26a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
26b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 ROR;. }. pCur
26c0: 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 = sqlite3TestTex
26d0: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b tToPtr(argv[1]);
26e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 . sqlite3BtreeE
26f0: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 nter(pCur->pBtre
2700: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 e);. rc = sqlit
2710: 65 33 42 74 72 65 65 45 6f 66 28 70 43 75 72 29 e3BtreeEof(pCur)
2720: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 ;. sqlite3Btree
2730: 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 Leave(pCur->pBtr
2740: 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 ee);. sqlite3_s
2750: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a nprintf(sizeof(z
2760: 42 75 66 29 2c 7a 42 75 66 2c 20 22 25 64 22 2c Buf),zBuf, "%d",
2770: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 rc);. Tcl_Appe
2780: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
2790: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 zBuf, 0);. ret
27a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
27b0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 ../*.** Usage:
27c0: 20 62 74 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 btree_payload_s
27d0: 69 7a 65 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 ize ID.**.** Ret
27e0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f urn the number o
27f0: 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f f bytes of paylo
2800: 61 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 ad.*/.static int
2810: 20 62 74 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 btree_payload_s
2820: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 ize(. void *Not
2830: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 Used,. Tcl_Inte
2840: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f rp *interp, /
2850: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 * The TCL interp
2860: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b reter that invok
2870: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 ed this command
2880: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 */. int argc,
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
28a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
28b0: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 ts */. const ch
28c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f ar **argv /
28d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 * Text of each a
28e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 rgument */.){.
28f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a BtCursor *pCur;.
2900: 20 20 69 6e 74 20 6e 32 3b 0a 20 20 75 36 34 20 int n2;. u64
2910: 6e 31 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b n1;. char zBuf[
2920: 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 50];.. if( argc
2930: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 !=2 ){. Tcl_A
2940: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
2950: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 rp, "wrong # arg
2960: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 s: should be \""
2970: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 , argv[0],.
2980: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 " ID\"", 0);.
2990: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
29a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 ROR;. }. pCur
29b0: 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 = sqlite3TestTex
29c0: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b tToPtr(argv[1]);
29d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 . sqlite3BtreeE
29e0: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 nter(pCur->pBtre
29f0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 75 e);.. /* The cu
2a00: 72 73 6f 72 20 6d 61 79 20 62 65 20 69 6e 20 22 rsor may be in "
2a10: 72 65 71 75 69 72 65 2d 73 65 65 6b 22 20 73 74 require-seek" st
2a20: 61 74 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 ate. If this is
2a30: 74 68 65 20 63 61 73 65 2c 20 74 68 65 0a 20 20 the case, the.
2a40: 2a 2a 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 ** call to Btree
2a50: 44 61 74 61 53 69 7a 65 28 29 20 77 69 6c 6c 20 DataSize() will
2a60: 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 73 71 6c fix it. */. sql
2a70: 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a ite3BtreeDataSiz
2a80: 65 28 70 43 75 72 2c 20 28 75 33 32 2a 29 26 6e e(pCur, (u32*)&n
2a90: 32 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 2);. if( pCur->
2aa0: 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 apPage[pCur->iPa
2ab0: 67 65 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 ge]->intKey ){.
2ac0: 20 20 20 6e 31 20 3d 20 30 3b 0a 20 20 7d 65 6c n1 = 0;. }el
2ad0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 se{. sqlite3B
2ae0: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 treeKeySize(pCur
2af0: 2c 20 28 69 36 34 2a 29 26 6e 31 29 3b 0a 20 20 , (i64*)&n1);.
2b00: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 }. sqlite3Btree
2b10: 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 Leave(pCur->pBtr
2b20: 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 ee);. sqlite3_s
2b30: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a nprintf(sizeof(z
2b40: 42 75 66 29 2c 7a 42 75 66 2c 20 22 25 64 22 2c Buf),zBuf, "%d",
2b50: 20 28 69 6e 74 29 28 6e 31 2b 6e 32 29 29 3b 0a (int)(n1+n2));.
2b60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
2b70: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c lt(interp, zBuf,
2b80: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 0);. return SQ
2b90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
2ba0: 2a 20 75 73 61 67 65 3a 20 20 20 76 61 72 69 6e * usage: varin
2bb0: 74 5f 74 65 73 74 20 20 53 54 41 52 54 20 20 4d t_test START M
2bc0: 55 4c 54 49 50 4c 49 45 52 20 20 43 4f 55 4e 54 ULTIPLIER COUNT
2bd0: 20 20 49 4e 43 52 45 4d 45 4e 54 0a 2a 2a 0a 2a INCREMENT.**.*
2be0: 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 74 * This command t
2bf0: 65 73 74 73 20 74 68 65 20 70 75 74 56 61 72 69 ests the putVari
2c00: 6e 74 28 29 20 61 6e 64 20 67 65 74 56 61 72 69 nt() and getVari
2c10: 6e 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 nt().** routines
2c20: 2c 20 62 6f 74 68 20 66 6f 72 20 61 63 63 75 72 , both for accur
2c30: 61 63 79 20 61 6e 64 20 66 6f 72 20 73 70 65 65 acy and for spee
2c40: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 d..**.** An inte
2c50: 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 75 ger is written u
2c60: 73 69 6e 67 20 70 75 74 56 61 72 69 6e 74 28 29 sing putVarint()
2c70: 20 61 6e 64 20 72 65 61 64 20 62 61 63 6b 20 77 and read back w
2c80: 69 74 68 0a 2a 2a 20 67 65 74 56 61 72 69 6e 74 ith.** getVarint
2c90: 28 29 20 61 6e 64 20 76 61 72 69 66 69 65 64 20 () and varified
2ca0: 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e to be unchanged.
2cb0: 20 20 54 68 69 73 20 72 65 70 65 61 74 73 20 43 This repeats C
2cc0: 4f 55 4e 54 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 OUNT.** times.
2cd0: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 The first intege
2ce0: 72 20 69 73 20 53 54 41 52 54 2a 4d 55 4c 54 49 r is START*MULTI
2cf0: 50 4c 49 45 52 2e 20 20 45 61 63 68 20 69 74 65 PLIER. Each ite
2d00: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 72 65 61 ration.** increa
2d10: 73 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 ses the integer
2d20: 62 79 20 49 4e 43 52 45 4d 45 4e 54 2e 0a 2a 2a by INCREMENT..**
2d30: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 .** This command
2d40: 20 72 65 74 75 72 6e 73 20 6e 6f 74 68 69 6e 67 returns nothing
2d50: 20 69 66 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 if it works. I
2d60: 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 t returns an err
2d70: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 66 or message.** if
2d80: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 something goes
2d90: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 wrong..*/.static
2da0: 20 69 6e 74 20 62 74 72 65 65 5f 76 61 72 69 6e int btree_varin
2db0: 74 5f 74 65 73 74 28 0a 20 20 76 6f 69 64 20 2a t_test(. void *
2dc0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 NotUsed,. Tcl_I
2dd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 nterp *interp,
2de0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 /* The TCL int
2df0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e erpreter that in
2e00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 voked this comma
2e10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 nd */. int argc
2e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
2e30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
2e40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 ments */. const
2e50: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 char **argv
2e60: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 /* Text of eac
2e70: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b h argument */.){
2e80: 0a 20 20 75 33 32 20 73 74 61 72 74 2c 20 6d 75 . u32 start, mu
2e90: 6c 74 2c 20 63 6f 75 6e 74 2c 20 69 6e 63 72 3b lt, count, incr;
2ea0: 0a 20 20 75 36 34 20 69 6e 2c 20 6f 75 74 3b 0a . u64 in, out;.
2eb0: 20 20 69 6e 74 20 6e 31 2c 20 6e 32 2c 20 69 2c int n1, n2, i,
2ec0: 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 j;. unsigned c
2ed0: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 har zBuf[100];.
2ee0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a if( argc!=5 ){.
2ef0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
2f00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 sult(interp, "wr
2f10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 ong # args: shou
2f20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b ld be \"", argv[
2f30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 53 54 41 0],. " STA
2f40: 52 54 20 4d 55 4c 54 49 50 4c 49 45 52 20 43 4f RT MULTIPLIER CO
2f50: 55 4e 54 20 49 4e 43 52 45 4d 45 4e 54 5c 22 22 UNT INCREMENT\""
2f60: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e , 0);. return
2f70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a TCL_ERROR;. }.
2f80: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 if( Tcl_GetInt
2f90: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d (interp, argv[1]
2fa0: 2c 20 28 69 6e 74 2a 29 26 73 74 61 72 74 29 20 , (int*)&start)
2fb0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ) return TCL_ERR
2fc0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 OR;. if( Tcl_Ge
2fd0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 tInt(interp, arg
2fe0: 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 6d 75 6c v[2], (int*)&mul
2ff0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f t) ) return TCL_
3000: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c ERROR;. if( Tcl
3010: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 _GetInt(interp,
3020: 61 72 67 76 5b 33 5d 2c 20 28 69 6e 74 2a 29 26 argv[3], (int*)&
3030: 63 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 count) ) return
3040: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 TCL_ERROR;. if(
3050: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 Tcl_GetInt(inte
3060: 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 28 69 6e rp, argv[4], (in
3070: 74 2a 29 26 69 6e 63 72 29 20 29 20 72 65 74 75 t*)&incr) ) retu
3080: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
3090: 69 6e 20 3d 20 73 74 61 72 74 3b 0a 20 20 69 6e in = start;. in
30a0: 20 2a 3d 20 6d 75 6c 74 3b 0a 20 20 66 6f 72 28 *= mult;. for(
30b0: 69 3d 30 3b 20 69 3c 28 69 6e 74 29 63 6f 75 6e i=0; i<(int)coun
30c0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 t; i++){. cha
30d0: 72 20 7a 45 72 72 5b 32 30 30 5d 3b 0a 20 20 20 r zErr[200];.
30e0: 20 6e 31 20 3d 20 70 75 74 56 61 72 69 6e 74 28 n1 = putVarint(
30f0: 7a 42 75 66 2c 20 69 6e 29 3b 0a 20 20 20 20 69 zBuf, in);. i
3100: 66 28 20 6e 31 3e 39 20 7c 7c 20 6e 31 3c 31 20 f( n1>9 || n1<1
3110: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
3120: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 _snprintf(sizeof
3130: 28 7a 45 72 72 29 2c 20 7a 45 72 72 2c 0a 20 20 (zErr), zErr,.
3140: 20 20 20 20 20 20 20 22 70 75 74 56 61 72 69 6e "putVarin
3150: 74 20 72 65 74 75 72 6e 65 64 20 25 64 20 2d 20 t returned %d -
3160: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 should be betwee
3170: 6e 20 31 20 61 6e 64 20 39 22 2c 20 6e 31 29 3b n 1 and 9", n1);
3180: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e . Tcl_Appen
3190: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
31a0: 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 zErr, 0);.
31b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
31c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 32 20 3d ;. }. n2 =
31d0: 20 67 65 74 56 61 72 69 6e 74 28 7a 42 75 66 2c getVarint(zBuf,
31e0: 20 26 6f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 &out);. if(
31f0: 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20 20 20 n1!=n2 ){.
3200: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
3210: 28 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20 7a (sizeof(zErr), z
3220: 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 Err,. "
3230: 70 75 74 56 61 72 69 6e 74 20 72 65 74 75 72 6e putVarint return
3240: 65 64 20 25 64 20 61 6e 64 20 67 65 74 56 61 72 ed %d and getVar
3250: 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64 22 int returned %d"
3260: 2c 20 6e 31 2c 20 6e 32 29 3b 0a 20 20 20 20 20 , n1, n2);.
3270: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
3280: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 t(interp, zErr,
3290: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 0);. return
32a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
32b0: 7d 0a 20 20 20 20 69 66 28 20 69 6e 21 3d 6f 75 }. if( in!=ou
32c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 t ){. sqlit
32d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 e3_snprintf(size
32e0: 6f 66 28 7a 45 72 72 29 2c 20 7a 45 72 72 2c 0a of(zErr), zErr,.
32f0: 20 20 20 20 20 20 20 20 20 20 22 57 72 6f 74 65 "Wrote
3300: 20 30 78 25 30 31 36 6c 6c 78 20 61 6e 64 20 67 0x%016llx and g
3310: 6f 74 20 62 61 63 6b 20 30 78 25 30 31 36 6c 6c ot back 0x%016ll
3320: 78 22 2c 20 69 6e 2c 20 6f 75 74 29 3b 0a 20 20 x", in, out);.
3330: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
3340: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 sult(interp, zEr
3350: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 r, 0);. ret
3360: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3370: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 69 6e }. if( (in
3380: 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3d 3d & 0xffffffff)==
3390: 69 6e 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 in ){. u32
33a0: 6f 75 74 33 32 3b 0a 20 20 20 20 20 20 6e 32 20 out32;. n2
33b0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 7a 42 = getVarint32(zB
33c0: 75 66 2c 20 6f 75 74 33 32 29 3b 0a 20 20 20 20 uf, out32);.
33d0: 20 20 6f 75 74 20 3d 20 6f 75 74 33 32 3b 0a 20 out = out32;.
33e0: 20 20 20 20 20 69 66 28 20 6e 31 21 3d 6e 32 20 if( n1!=n2
33f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
3400: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 e3_snprintf(size
3410: 6f 66 28 7a 45 72 72 29 2c 20 7a 45 72 72 2c 0a of(zErr), zErr,.
3420: 20 20 20 20 20 20 20 20 20 20 22 70 75 74 56 61 "putVa
3430: 72 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64 rint returned %d
3440: 20 61 6e 64 20 47 65 74 56 61 72 69 6e 74 33 32 and GetVarint32
3450: 20 72 65 74 75 72 6e 65 64 20 25 64 22 2c 20 0a returned %d", .
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3470: 20 20 6e 31 2c 20 6e 32 29 3b 0a 20 20 20 20 20 n1, n2);.
3480: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
3490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 ult(interp, zErr
34a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 , 0);. re
34b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
34c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 }. if
34d0: 28 20 69 6e 21 3d 6f 75 74 20 29 7b 0a 20 20 20 ( in!=out ){.
34e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
34f0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 rintf(sizeof(zEr
3500: 72 29 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 r), zErr,.
3510: 20 20 20 20 22 57 72 6f 74 65 20 30 78 25 30 31 "Wrote 0x%01
3520: 36 6c 6c 78 20 61 6e 64 20 67 6f 74 20 62 61 63 6llx and got bac
3530: 6b 20 30 78 25 30 31 36 6c 6c 78 20 66 72 6f 6d k 0x%016llx from
3540: 20 47 65 74 56 61 72 69 6e 74 33 32 22 2c 0a 20 GetVarint32",.
3550: 20 20 20 20 20 20 20 20 20 20 20 69 6e 2c 20 6f in, o
3560: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c ut);. Tcl
3570: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
3580: 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a terp, zErr, 0);.
3590: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 return T
35a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 CL_ERROR;.
35b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
35c0: 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 In order to get
35d0: 72 65 61 6c 69 73 74 69 63 20 74 69 6d 69 6e 67 realistic timing
35e0: 73 2c 20 72 75 6e 20 67 65 74 56 61 72 69 6e 74 s, run getVarint
35f0: 20 31 39 20 6d 6f 72 65 20 74 69 6d 65 73 2e 0a 19 more times..
3600: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 ** This is b
3610: 65 63 61 75 73 65 20 67 65 74 56 61 72 69 6e 74 ecause getVarint
3620: 20 69 73 20 63 61 6c 6c 65 64 20 61 62 6f 75 74 is called about
3630: 20 32 30 20 74 69 6d 65 73 20 6d 6f 72 65 20 6f 20 times more o
3640: 66 74 65 6e 0a 20 20 20 20 2a 2a 20 74 68 61 6e ften. ** than
3650: 20 70 75 74 56 61 72 69 6e 74 2e 0a 20 20 20 20 putVarint..
3660: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 */. for(j=0;
3670: 6a 3c 31 39 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 j<19; j++){.
3680: 20 20 67 65 74 56 61 72 69 6e 74 28 7a 42 75 66 getVarint(zBuf
3690: 2c 20 26 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 , &out);. }.
36a0: 20 20 20 69 6e 20 2b 3d 20 69 6e 63 72 3b 0a 20 in += incr;.
36b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f }. return TCL_
36c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 75 73 61 OK;.}../*.** usa
36d0: 67 65 3a 20 20 20 62 74 72 65 65 5f 66 72 6f 6d ge: btree_from
36e0: 5f 64 62 20 20 44 42 2d 48 41 4e 44 4c 45 0a 2a _db DB-HANDLE.*
36f0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e *.** This comman
3700: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 62 74 d returns the bt
3710: 72 65 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 ree handle for t
3720: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 he main database
3730: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 associated.** w
3740: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 ith the database
3750: 2d 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 -handle passed a
3760: 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 s the argument.
3770: 45 78 61 6d 70 6c 65 20 75 73 61 67 65 3a 0a 2a Example usage:.*
3780: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 20 64 62 20 *.** sqlite3 db
3790: 74 65 73 74 2e 64 62 0a 2a 2a 20 73 65 74 20 62 test.db.** set b
37a0: 74 20 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 t [btree_from_db
37b0: 20 64 62 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 db].*/.static i
37c0: 6e 74 20 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 nt btree_from_db
37d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 (. void *NotUse
37e0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 d,. Tcl_Interp
37f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 *interp, /* T
3800: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 he TCL interpret
3810: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 er that invoked
3820: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a this command */.
3830: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 int argc,
3840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
3850: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 er of arguments
3860: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
3870: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 **argv /* T
3880: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 ext of each argu
3890: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 ment */.){. cha
38a0: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 54 r zBuf[100];. T
38b0: 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b cl_CmdInfo info;
38c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a . sqlite3 *db;.
38d0: 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 Btree *pBt;.
38e0: 69 6e 74 20 69 44 62 20 3d 20 30 3b 0a 0a 20 20 int iDb = 0;..
38f0: 69 66 28 20 61 72 67 63 21 3d 32 20 26 26 20 61 if( argc!=2 && a
3900: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 rgc!=3 ){. Tc
3910: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
3920: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 nterp, "wrong #
3930: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 args: should be
3940: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 \"", argv[0],.
3950: 20 20 20 20 20 22 20 44 42 2d 48 41 4e 44 4c 45 " DB-HANDLE
3960: 20 3f 4e 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 ?N?\"", 0);.
3970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
3980: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 31 21 R;. }.. if( 1!
3990: 3d 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 =Tcl_GetCommandI
39a0: 6e 66 6f 28 69 6e 74 65 72 70 2c 20 61 72 67 76 nfo(interp, argv
39b0: 5b 31 5d 2c 20 26 69 6e 66 6f 29 20 29 7b 0a 20 [1], &info) ){.
39c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
39d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 ult(interp, "No
39e0: 73 75 63 68 20 64 62 2d 68 61 6e 64 6c 65 3a 20 such db-handle:
39f0: 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20 22 5c \"", argv[1], "\
3a00: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 "", 0);. retu
3a10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
3a20: 7d 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 }. if( argc==3
3a30: 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 61 74 6f ){. iDb = ato
3a40: 69 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d 0a i(argv[2]);. }.
3a50: 0a 20 20 64 62 20 3d 20 2a 28 28 73 71 6c 69 74 . db = *((sqlit
3a60: 65 33 20 2a 2a 29 69 6e 66 6f 2e 6f 62 6a 43 6c e3 **)info.objCl
3a70: 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 61 73 73 ientData);. ass
3a80: 65 72 74 28 20 64 62 20 29 3b 0a 0a 20 20 70 42 ert( db );.. pB
3a90: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d t = db->aDb[iDb]
3aa0: 2e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f .pBt;. sqlite3_
3ab0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 snprintf(sizeof(
3ac0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 zBuf), zBuf, "%p
3ad0: 22 2c 20 70 42 74 29 3b 0a 20 20 54 63 6c 5f 53 ", pBt);. Tcl_S
3ae0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
3af0: 20 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 zBuf, TCL_VOLAT
3b00: 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 ILE);. return T
3b10: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 CL_OK;.}../*.**
3b20: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 69 Usage: btree_i
3b30: 73 6d 65 6d 64 62 20 49 44 0a 2a 2a 0a 2a 2a 20 smemdb ID.**.**
3b40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 Return true if t
3b50: 68 65 20 42 2d 54 72 65 65 20 69 73 20 63 75 72 he B-Tree is cur
3b60: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 65 6e rently stored en
3b70: 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 tirely in memory
3b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
3b90: 62 74 72 65 65 5f 69 73 6d 65 6d 64 62 28 0a 20 btree_ismemdb(.
3ba0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a void *NotUsed,.
3bb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
3bc0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 terp, /* The
3bd0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 TCL interpreter
3be0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 that invoked thi
3bf0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 s command */. i
3c00: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 nt argc,
3c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
3c20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a of arguments */.
3c30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 const char **a
3c40: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 rgv /* Text
3c50: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e of each argumen
3c60: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 t */.){. Btree
3c70: 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b *pBt;. int res;
3c80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 . sqlite3_file
3c90: 2a 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 61 *pFile;.. if( a
3ca0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 rgc!=2 ){. Tc
3cb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
3cc0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 nterp, "wrong #
3cd0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 args: should be
3ce0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 \"", argv[0],.
3cf0: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 " ID\"", 0)
3d00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
3d10: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 _ERROR;. }. pB
3d20: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 t = sqlite3TestT
3d30: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d extToPtr(argv[1]
3d40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 );. sqlite3_mut
3d50: 65 78 5f 65 6e 74 65 72 28 70 42 74 2d 3e 64 62 ex_enter(pBt->db
3d60: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 ->mutex);. sqli
3d70: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 te3BtreeEnter(pB
3d80: 74 29 3b 0a 20 20 70 46 69 6c 65 20 3d 20 73 71 t);. pFile = sq
3d90: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 73 lite3PagerFile(s
3da0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 qlite3BtreePager
3db0: 28 70 42 74 29 29 3b 0a 20 20 72 65 73 20 3d 20 (pBt));. res =
3dc0: 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 (pFile->pMethods
3dd0: 3d 3d 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 ==0);. sqlite3B
3de0: 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a treeLeave(pBt);.
3df0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
3e00: 6c 65 61 76 65 28 70 42 74 2d 3e 64 62 2d 3e 6d leave(pBt->db->m
3e10: 75 74 65 78 29 3b 0a 20 20 54 63 6c 5f 53 65 74 utex);. Tcl_Set
3e20: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
3e30: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e , Tcl_NewBoolean
3e40: 4f 62 6a 28 72 65 73 29 29 3b 0a 20 20 72 65 74 Obj(res));. ret
3e50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
3e60: 0a 0a 2f 2a 0a 2a 2a 20 75 73 61 67 65 3a 20 20 ../*.** usage:
3e70: 20 62 74 72 65 65 5f 73 65 74 5f 63 61 63 68 65 btree_set_cache
3e80: 5f 73 69 7a 65 20 49 44 20 4e 43 41 43 48 45 0a _size ID NCACHE.
3e90: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 69 **.** Set the si
3ea0: 7a 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 ze of the cache
3eb0: 75 73 65 64 20 62 79 20 62 74 72 65 65 20 24 49 used by btree $I
3ec0: 44 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 D..*/.static int
3ed0: 20 62 74 72 65 65 5f 73 65 74 5f 63 61 63 68 65 btree_set_cache
3ee0: 5f 73 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 4e _size(. void *N
3ef0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e otUsed,. Tcl_In
3f00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 terp *interp,
3f10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 /* The TCL inte
3f20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 rpreter that inv
3f30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e oked this comman
3f40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c d */. int argc,
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
3f60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d Number of argum
3f70: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 ents */. const
3f80: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 char **argv
3f90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 /* Text of each
3fa0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a argument */.){.
3fb0: 20 20 69 6e 74 20 6e 43 61 63 68 65 3b 0a 20 20 int nCache;.
3fc0: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 0a 20 Btree *pBt;. .
3fd0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a if( argc!=3 ){.
3fe0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
3ff0: 73 75 6c 74 28 0a 20 20 20 20 20 20 20 20 69 6e sult(. in
4000: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 terp, "wrong # a
4010: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c rgs: should be \
4020: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 42 "", argv[0], " B
4030: 54 20 4e 43 41 43 48 45 5c 22 22 2c 20 30 29 3b T NCACHE\"", 0);
4040: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
4050: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 ERROR;. }. pBt
4060: 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 = sqlite3TestTe
4070: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 xtToPtr(argv[1])
4080: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 ;. if( Tcl_GetI
4090: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b nt(interp, argv[
40a0: 32 5d 2c 20 26 6e 43 61 63 68 65 29 20 29 20 72 2], &nCache) ) r
40b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
40c0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 .. sqlite3_mute
40d0: 78 5f 65 6e 74 65 72 28 70 42 74 2d 3e 64 62 2d x_enter(pBt->db-
40e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 >mutex);. sqlit
40f0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 e3BtreeEnter(pBt
4100: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 );. sqlite3Btre
4110: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 42 eSetCacheSize(pB
4120: 74 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 73 71 t, nCache);. sq
4130: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 lite3BtreeLeave(
4140: 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f pBt);. sqlite3_
4150: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 42 74 2d mutex_leave(pBt-
4160: 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 >db->mutex);. r
4170: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 eturn TCL_OK;.}
4180: 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 75 73 61 ../*.** usa
4190: 67 65 3a 20 20 20 62 74 72 65 65 5f 69 6e 73 65 ge: btree_inse
41a0: 72 74 20 43 53 52 20 3f 4b 45 59 3f 20 56 41 4c rt CSR ?KEY? VAL
41b0: 55 45 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 UE.**.** Set the
41c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 61 63 size of the cac
41d0: 68 65 20 75 73 65 64 20 62 79 20 62 74 72 65 65 he used by btree
41e0: 20 24 49 44 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 $ID..*/.static
41f0: 69 6e 74 20 62 74 72 65 65 5f 69 6e 73 65 72 74 int btree_insert
4200: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 (. ClientData c
4210: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c lientData,. Tcl
4220: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
4230: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 . int objc,. T
4240: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
4250: 6a 76 5b 5d 0a 29 7b 0a 20 20 42 74 43 75 72 73 jv[].){. BtCurs
4260: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 or *pCur;. int
4270: 72 63 3b 0a 20 20 42 74 72 65 65 50 61 79 6c 6f rc;. BtreePaylo
4280: 61 64 20 78 3b 0a 0a 20 20 69 66 28 20 6f 62 6a ad x;.. if( obj
4290: 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 c!=4 && objc!=3
42a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 ){. Tcl_Wrong
42b0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
42c0: 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 69 6e 74 6b 1, objv, "?-intk
42d0: 65 79 3f 20 43 53 52 20 4b 45 59 20 56 41 4c 55 ey? CSR KEY VALU
42e0: 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 E");. return
42f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a TCL_ERROR;. }..
4300: 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 memset(&x, 0,
4310: 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 69 66 sizeof(x));. if
4320: 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 ( objc==4 ){.
4330: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 if( Tcl_GetIntF
4340: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
4350: 62 6a 76 5b 32 5d 2c 20 26 72 63 29 20 29 20 72 bjv[2], &rc) ) r
4360: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
4370: 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20 72 63 . x.nKey = rc
4380: 3b 0a 20 20 20 20 78 2e 70 44 61 74 61 20 3d 20 ;. x.pData =
4390: 28 76 6f 69 64 2a 29 54 63 6c 5f 47 65 74 42 79 (void*)Tcl_GetBy
43a0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f teArrayFromObj(o
43b0: 62 6a 76 5b 33 5d 2c 20 26 78 2e 6e 44 61 74 61 bjv[3], &x.nData
43c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
43d0: 78 2e 70 4b 65 79 20 3d 20 28 76 6f 69 64 2a 29 x.pKey = (void*)
43e0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
43f0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c FromObj(objv[2],
4400: 20 26 72 63 29 3b 0a 20 20 20 20 78 2e 6e 4b 65 &rc);. x.nKe
4410: 79 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 y = rc;. }. pC
4420: 75 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a 29 ur = (BtCursor*)
4430: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 sqlite3TestTextT
4440: 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69 oPtr(Tcl_GetStri
4450: 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 0a 20 ng(objv[1]));..
4460: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 sqlite3_mutex_e
4470: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 nter(pCur->pBtre
4480: 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 e->db->mutex);.
4490: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 sqlite3BtreeEnt
44a0: 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 er(pCur->pBtree)
44b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 ;. rc = sqlite3
44c0: 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 75 72 BtreeInsert(pCur
44d0: 2c 20 26 78 2c 20 30 2c 20 30 29 3b 0a 20 20 73 , &x, 0, 0);. s
44e0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 qlite3BtreeLeave
44f0: 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a (pCur->pBtree);.
4500: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f sqlite3_mutex_
4510: 6c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 leave(pCur->pBtr
4520: 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a ee->db->mutex);.
4530: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 . Tcl_ResetResu
4540: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 lt(interp);. if
4550: 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f ( rc ){. Tcl_
4560: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
4570: 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e erp, sqlite3ErrN
4580: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 ame(rc), 0);.
4590: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
45a0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 R;. }. return
45b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a TCL_OK;.}.../*.*
45c0: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 * Register comma
45d0: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c nds with the TCL
45e0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f interpreter..*/
45f0: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 .int Sqlitetest3
4600: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 _Init(Tcl_Interp
4610: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61 *interp){. sta
4620: 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 tic struct {.
4630: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 char *zName;.
4640: 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 Tcl_CmdProc
4650: 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 *xProc;. } aCmd
4660: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 62 [] = {. { "b
4670: 74 72 65 65 5f 6f 70 65 6e 22 2c 20 20 20 20 20 tree_open",
4680: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 (Tcl_C
4690: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6f 70 mdProc*)btree_op
46a0: 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 en
46b0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 },. { "btre
46c0: 65 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 e_close",
46d0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 (Tcl_CmdP
46e0: 72 6f 63 2a 29 62 74 72 65 65 5f 63 6c 6f 73 65 roc*)btree_close
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c },
4700: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 62 . { "btree_b
4710: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e egin_transaction
4720: 22 2c 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 ", (Tcl_CmdProc
4730: 2a 29 62 74 72 65 65 5f 62 65 67 69 6e 5f 74 72 *)btree_begin_tr
4740: 61 6e 73 61 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 ansaction },.
4750: 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61 67 65 { "btree_page
4760: 72 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20 20 r_stats",
4770: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 (Tcl_CmdProc*)b
4780: 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61 74 73 tree_pager_stats
4790: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 },.
47a0: 7b 20 22 62 74 72 65 65 5f 63 75 72 73 6f 72 22 { "btree_cursor"
47b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 , (T
47c0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 cl_CmdProc*)btre
47d0: 65 5f 63 75 72 73 6f 72 20 20 20 20 20 20 20 20 e_cursor
47e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 },. { "
47f0: 62 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73 btree_close_curs
4800: 6f 72 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f or", (Tcl_
4810: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 CmdProc*)btree_c
4820: 6c 6f 73 65 5f 63 75 72 73 6f 72 20 20 20 20 20 lose_cursor
4830: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 },. { "btr
4840: 65 65 5f 6e 65 78 74 22 2c 20 20 20 20 20 20 20 ee_next",
4850: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 (Tcl_Cmd
4860: 50 72 6f 63 2a 29 62 74 72 65 65 5f 6e 65 78 74 Proc*)btree_next
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d }
4880: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f ,. { "btree_
4890: 65 6f 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 eof",
48a0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f (Tcl_CmdPro
48b0: 63 2a 29 62 74 72 65 65 5f 65 6f 66 20 20 20 20 c*)btree_eof
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 },.
48d0: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61 79 { "btree_pay
48e0: 6c 6f 61 64 5f 73 69 7a 65 22 2c 20 20 20 20 20 load_size",
48f0: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 (Tcl_CmdProc*)
4900: 62 74 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 69 btree_payload_si
4910: 7a 65 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 ze },.
4920: 20 7b 20 22 62 74 72 65 65 5f 66 69 72 73 74 22 { "btree_first"
4930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 , (
4940: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 Tcl_CmdProc*)btr
4950: 65 65 5f 66 69 72 73 74 20 20 20 20 20 20 20 20 ee_first
4960: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 },. {
4970: 22 62 74 72 65 65 5f 76 61 72 69 6e 74 5f 74 65 "btree_varint_te
4980: 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c st", (Tcl
4990: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f _CmdProc*)btree_
49a0: 76 61 72 69 6e 74 5f 74 65 73 74 20 20 20 20 20 varint_test
49b0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 },. { "bt
49c0: 72 65 65 5f 66 72 6f 6d 5f 64 62 22 2c 20 20 20 ree_from_db",
49d0: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d (Tcl_Cm
49e0: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 66 72 6f dProc*)btree_fro
49f0: 6d 5f 64 62 20 20 20 20 20 20 20 20 20 20 20 20 m_db
4a00: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 },. { "btree
4a10: 5f 69 73 6d 65 6d 64 62 22 2c 20 20 20 20 20 20 _ismemdb",
4a20: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 (Tcl_CmdPr
4a30: 6f 63 2a 29 62 74 72 65 65 5f 69 73 6d 65 6d 64 oc*)btree_ismemd
4a40: 62 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a b },.
4a50: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 73 65 { "btree_se
4a60: 74 5f 63 61 63 68 65 5f 73 69 7a 65 22 2c 20 20 t_cache_size",
4a70: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a (Tcl_CmdProc*
4a80: 29 62 74 72 65 65 5f 73 65 74 5f 63 61 63 68 65 )btree_set_cache
4a90: 5f 73 69 7a 65 20 20 20 20 20 7d 0a 20 20 7d 3b _size }. };
4aa0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 . int i;.. for
4ab0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 (i=0; i<sizeof(a
4ac0: 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 Cmd)/sizeof(aCmd
4ad0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 [0]); i++){.
4ae0: 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e Tcl_CreateComman
4af0: 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 d(interp, aCmd[i
4b00: 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d ].zName, aCmd[i]
4b10: 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 .xProc, 0, 0);.
4b20: 20 7d 0a 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 }.. Tcl_Create
4b30: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
4b40: 70 2c 20 22 62 74 72 65 65 5f 69 6e 73 65 72 74 p, "btree_insert
4b50: 22 2c 20 62 74 72 65 65 5f 69 6e 73 65 72 74 2c ", btree_insert,
4b60: 20 30 2c 20 30 29 3b 0a 0a 20 20 72 65 74 75 72 0, 0);.. retur
4b70: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a n TCL_OK;.}.