/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3edc5329bc59534d2d15b4f069a9f54b779a7e51289e98fa481ae3c0e526a5ca:


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 54 68 69 73 20 68  ******.** This h
0180: 65 61 64 65 72 20 66 69 6c 65 20 64 65 66 69 6e  eader file defin
0190: 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63 65  es the interface
01a0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
01b0: 20 42 2d 54 72 65 65 20 66 69 6c 65 0a 2a 2a 20   B-Tree file.** 
01c0: 73 75 62 73 79 73 74 65 6d 2e 20 20 53 65 65 20  subsystem.  See 
01d0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
01e0: 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
01f0: 61 20 64 65 74 61 69 6c 65 64 20 64 65 73 63 72  a detailed descr
0200: 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 77 68 61  iption.** of wha
0210: 74 20 65 61 63 68 20 69 6e 74 65 72 66 61 63 65  t each interface
0220: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 2e 0a 2a   routine does..*
0230: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0240: 5f 42 54 52 45 45 5f 48 0a 23 64 65 66 69 6e 65  _BTREE_H.#define
0250: 20 53 51 4c 49 54 45 5f 42 54 52 45 45 5f 48 0a   SQLITE_BTREE_H.
0260: 0a 2f 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 64  ./* TODO: This d
0270: 65 66 69 6e 69 74 69 6f 6e 20 69 73 20 6a 75 73  efinition is jus
0280: 74 20 69 6e 63 6c 75 64 65 64 20 73 6f 20 6f 74  t included so ot
0290: 68 65 72 20 6d 6f 64 75 6c 65 73 20 63 6f 6d 70  her modules comp
02a0: 69 6c 65 2e 20 49 74 0a 2a 2a 20 6e 65 65 64 73  ile. It.** needs
02b0: 20 74 6f 20 62 65 20 72 65 76 69 73 69 74 65 64   to be revisited
02c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  ..*/.#define SQL
02d0: 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41  ITE_N_BTREE_META
02e0: 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 64 65   16../*.** If de
02f0: 66 69 6e 65 64 20 61 73 20 6e 6f 6e 2d 7a 65 72  fined as non-zer
0300: 6f 2c 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  o, auto-vacuum i
0310: 73 20 65 6e 61 62 6c 65 64 20 62 79 20 64 65 66  s enabled by def
0320: 61 75 6c 74 2e 20 4f 74 68 65 72 77 69 73 65 0a  ault. Otherwise.
0330: 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20 74 75  ** it must be tu
0340: 72 6e 65 64 20 6f 6e 20 66 6f 72 20 65 61 63 68  rned on for each
0350: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
0360: 22 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63  "PRAGMA auto_vac
0370: 75 75 6d 20 3d 20 31 22 2e 0a 2a 2f 0a 23 69 66  uum = 1"..*/.#if
0380: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
0390: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  ULT_AUTOVACUUM. 
03a0: 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f   #define SQLITE_
03b0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
03c0: 55 4d 20 30 0a 23 65 6e 64 69 66 0a 0a 23 64 65  UM 0.#endif..#de
03d0: 66 69 6e 65 20 42 54 52 45 45 5f 41 55 54 4f 56  fine BTREE_AUTOV
03e0: 41 43 55 55 4d 5f 4e 4f 4e 45 20 30 20 20 20 20  ACUUM_NONE 0    
03f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
0400: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 2a 2f 0a   auto-vacuum */.
0410: 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 41 55  #define BTREE_AU
0420: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 20 31 20  TOVACUUM_FULL 1 
0430: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 6c         /* Do ful
0440: 6c 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 2a 2f  l auto-vacuum */
0450: 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 41  .#define BTREE_A
0460: 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 20 32  UTOVACUUM_INCR 2
0470: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
0480: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 2a 2f  mental vacuum */
0490: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
04a0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 6f 66 20  declarations of 
04b0: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 74 79 70  structure.*/.typ
04c0: 65 64 65 66 20 73 74 72 75 63 74 20 42 74 72 65  edef struct Btre
04d0: 65 20 42 74 72 65 65 3b 0a 74 79 70 65 64 65 66  e Btree;.typedef
04e0: 20 73 74 72 75 63 74 20 42 74 43 75 72 73 6f 72   struct BtCursor
04f0: 20 42 74 43 75 72 73 6f 72 3b 0a 74 79 70 65 64   BtCursor;.typed
0500: 65 66 20 73 74 72 75 63 74 20 42 74 53 68 61 72  ef struct BtShar
0510: 65 64 20 42 74 53 68 61 72 65 64 3b 0a 74 79 70  ed BtShared;.typ
0520: 65 64 65 66 20 73 74 72 75 63 74 20 42 74 72 65  edef struct Btre
0530: 65 50 61 79 6c 6f 61 64 20 42 74 72 65 65 50 61  ePayload BtreePa
0540: 79 6c 6f 61 64 3b 0a 0a 0a 69 6e 74 20 73 71 6c  yload;...int sql
0550: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
0560: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
0570: 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 56 46 53  fs,       /* VFS
0580: 20 74 6f 20 75 73 65 20 77 69 74 68 20 74 68 69   to use with thi
0590: 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
05a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
05b0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
05c0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
05d0: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 73 71 6c  to open */.  sql
05e0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
05f0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
0600: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
0610: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 72  nection */.  Btr
0620: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
0630: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
0640: 6f 70 65 6e 20 42 74 72 65 65 2a 20 68 65 72 65  open Btree* here
0650: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0670: 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  * Flags */.  int
0680: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
0690: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
06a0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
06b0: 20 56 46 53 20 6f 70 65 6e 20 2a 2f 0a 29 3b 0a   VFS open */.);.
06c0: 0a 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  ./* The flags pa
06d0: 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69 74  rameter to sqlit
06e0: 65 33 42 74 72 65 65 4f 70 65 6e 20 63 61 6e 20  e3BtreeOpen can 
06f0: 62 65 20 74 68 65 20 62 69 74 77 69 73 65 20 6f  be the bitwise o
0700: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  r of the.** foll
0710: 6f 77 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a 2a  owing values..**
0720: 0a 2a 2a 20 4e 4f 54 45 3a 20 20 54 68 65 73 65  .** NOTE:  These
0730: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 6d 61 74   values must mat
0740: 63 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ch the correspon
0750: 64 69 6e 67 20 50 41 47 45 52 5f 20 76 61 6c 75  ding PAGER_ valu
0760: 65 73 20 69 6e 0a 2a 2a 20 70 61 67 65 72 2e 68  es in.** pager.h
0770: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52  ..*/.#define BTR
0780: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
0790: 20 31 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72   1  /* Do not cr
07a0: 65 61 74 65 20 6f 72 20 75 73 65 20 61 20 72 6f  eate or use a ro
07b0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 2a  llback journal *
07c0: 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f  /.#define BTREE_
07d0: 4d 45 4d 4f 52 59 20 20 20 20 20 20 20 20 32 20  MEMORY        2 
07e0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69   /* This is an i
07f0: 6e 2d 6d 65 6d 6f 72 79 20 44 42 20 2a 2f 0a 23  n-memory DB */.#
0800: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 53 49 4e  define BTREE_SIN
0810: 47 4c 45 20 20 20 20 20 20 20 20 34 20 20 2f 2a  GLE        4  /*
0820: 20 54 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   The file contai
0830: 6e 73 20 61 74 20 6d 6f 73 74 20 31 20 62 2d 74  ns at most 1 b-t
0840: 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  ree */.#define B
0850: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 20  TREE_UNORDERED  
0860: 20 20 20 38 20 20 2f 2a 20 55 73 65 20 6f 66 20     8  /* Use of 
0870: 61 20 68 61 73 68 20 69 6d 70 6c 65 6d 65 6e 74  a hash implement
0880: 61 74 69 6f 6e 20 69 73 20 4f 4b 20 2a 2f 0a 0a  ation is OK */..
0890: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
08a0: 43 6c 6f 73 65 28 42 74 72 65 65 2a 29 3b 0a 69  Close(Btree*);.i
08b0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
08c0: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
08d0: 65 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c  e*,int);.int sql
08e0: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
08f0: 6c 53 69 7a 65 28 42 74 72 65 65 2a 2c 69 6e 74  lSize(Btree*,int
0900: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  );.#if SQLITE_MA
0910: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
0920: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
0930: 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72  SetMmapLimit(Btr
0940: 65 65 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  ee*,sqlite3_int6
0950: 34 29 3b 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73  4);.#endif.int s
0960: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
0970: 67 65 72 46 6c 61 67 73 28 42 74 72 65 65 2a 2c  gerFlags(Btree*,
0980: 75 6e 73 69 67 6e 65 64 29 3b 0a 69 6e 74 20 73  unsigned);.int s
0990: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
09a0: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
09b0: 20 69 6e 74 20 6e 50 61 67 65 73 69 7a 65 2c 20   int nPagesize, 
09c0: 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
09d0: 74 20 65 46 69 78 29 3b 0a 69 6e 74 20 73 71 6c  t eFix);.int sql
09e0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
09f0: 53 69 7a 65 28 42 74 72 65 65 2a 29 3b 0a 69 6e  Size(Btree*);.in
0a00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
0a10: 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
0a20: 2a 2c 69 6e 74 29 3b 0a 75 33 32 20 73 71 6c 69  *,int);.u32 sqli
0a30: 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65  te3BtreeLastPage
0a40: 28 42 74 72 65 65 2a 29 3b 0a 69 6e 74 20 73 71  (Btree*);.int sq
0a50: 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
0a60: 44 65 6c 65 74 65 28 42 74 72 65 65 2a 2c 69 6e  Delete(Btree*,in
0a70: 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  t);.int sqlite3B
0a80: 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65  treeGetOptimalRe
0a90: 73 65 72 76 65 28 42 74 72 65 65 2a 29 3b 0a 69  serve(Btree*);.i
0aa0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
0ab0: 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
0ac0: 28 42 74 72 65 65 20 2a 70 29 3b 0a 69 6e 74 20  (Btree *p);.int 
0ad0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
0ae0: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
0af0: 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c  *, int);.int sql
0b00: 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
0b10: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 29 3b  Vacuum(Btree *);
0b20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0b30: 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
0b40: 65 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c  e*,int);.int sql
0b50: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
0b60: 68 61 73 65 4f 6e 65 28 42 74 72 65 65 2a 2c 20  haseOne(Btree*, 
0b70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
0b80: 74 65 72 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  ter);.int sqlite
0b90: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
0ba0: 65 54 77 6f 28 42 74 72 65 65 2a 2c 20 69 6e 74  eTwo(Btree*, int
0bb0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  );.int sqlite3Bt
0bc0: 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 2a  reeCommit(Btree*
0bd0: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  );.int sqlite3Bt
0be0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
0bf0: 65 2a 2c 69 6e 74 2c 69 6e 74 29 3b 0a 69 6e 74  e*,int,int);.int
0c00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
0c10: 69 6e 53 74 6d 74 28 42 74 72 65 65 2a 2c 69 6e  inStmt(Btree*,in
0c20: 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  t);.int sqlite3B
0c30: 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
0c40: 42 74 72 65 65 2a 2c 20 69 6e 74 2a 2c 20 69 6e  Btree*, int*, in
0c50: 74 20 66 6c 61 67 73 29 3b 0a 69 6e 74 20 73 71  t flags);.int sq
0c60: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
0c70: 61 6e 73 28 42 74 72 65 65 2a 29 3b 0a 69 6e 74  ans(Btree*);.int
0c80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
0c90: 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65  nReadTrans(Btree
0ca0: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  *);.int sqlite3B
0cb0: 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 42  treeIsInBackup(B
0cc0: 74 72 65 65 2a 29 3b 0a 76 6f 69 64 20 2a 73 71  tree*);.void *sq
0cd0: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
0ce0: 28 42 74 72 65 65 20 2a 2c 20 69 6e 74 2c 20 76  (Btree *, int, v
0cf0: 6f 69 64 28 2a 29 28 76 6f 69 64 20 2a 29 29 3b  oid(*)(void *));
0d00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0d10: 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74  eSchemaLocked(Bt
0d20: 72 65 65 20 2a 70 42 74 72 65 65 29 3b 0a 23 69  ree *pBtree);.#i
0d30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0d40: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 69  T_SHARED_CACHE.i
0d50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
0d60: 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ockTable(Btree *
0d70: 70 42 74 72 65 65 2c 20 69 6e 74 20 69 54 61 62  pBtree, int iTab
0d80: 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b  , u8 isWriteLock
0d90: 29 3b 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71  );.#endif.int sq
0da0: 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
0db0: 69 6e 74 28 42 74 72 65 65 20 2a 2c 20 69 6e 74  int(Btree *, int
0dc0: 2c 20 69 6e 74 29 3b 0a 0a 63 6f 6e 73 74 20 63  , int);..const c
0dd0: 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
0de0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72  eGetFilename(Btr
0df0: 65 65 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68 61  ee *);.const cha
0e00: 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
0e10: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74  etJournalname(Bt
0e20: 72 65 65 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  ree *);.int sqli
0e30: 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65  te3BtreeCopyFile
0e40: 28 42 74 72 65 65 20 2a 2c 20 42 74 72 65 65 20  (Btree *, Btree 
0e50: 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  *);..int sqlite3
0e60: 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
0e70: 42 74 72 65 65 20 2a 29 3b 0a 0a 2f 2a 20 54 68  Btree *);../* Th
0e80: 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
0e90: 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
0ea0: 65 43 72 65 61 74 65 54 61 62 6c 65 20 63 61 6e  eCreateTable can
0eb0: 20 62 65 20 74 68 65 20 62 69 74 77 69 73 65 20   be the bitwise 
0ec0: 4f 52 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6c 61  OR.** of the fla
0ed0: 67 73 20 73 68 6f 77 6e 20 62 65 6c 6f 77 2e 0a  gs shown below..
0ee0: 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 53 51 4c 69  **.** Every SQLi
0ef0: 74 65 20 74 61 62 6c 65 20 6d 75 73 74 20 68 61  te table must ha
0f00: 76 65 20 65 69 74 68 65 72 20 42 54 52 45 45 5f  ve either BTREE_
0f10: 49 4e 54 4b 45 59 20 6f 72 20 42 54 52 45 45 5f  INTKEY or BTREE_
0f20: 42 4c 4f 42 4b 45 59 20 73 65 74 2e 0a 2a 2a 20  BLOBKEY set..** 
0f30: 57 69 74 68 20 42 54 52 45 45 5f 49 4e 54 4b 45  With BTREE_INTKE
0f40: 59 2c 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79  Y, the table key
0f50: 20 69 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74   is a 64-bit int
0f60: 65 67 65 72 20 61 6e 64 20 61 72 62 69 74 72 61  eger and arbitra
0f70: 72 79 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 74  ry data.** is st
0f80: 6f 72 65 64 20 69 6e 20 74 68 65 20 6c 65 61 76  ored in the leav
0f90: 65 73 2e 20 20 28 42 54 52 45 45 5f 49 4e 54 4b  es.  (BTREE_INTK
0fa0: 45 59 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  EY is used for S
0fb0: 51 4c 20 74 61 62 6c 65 73 2e 29 20 20 57 69 74  QL tables.)  Wit
0fc0: 68 0a 2a 2a 20 42 54 52 45 45 5f 42 4c 4f 42 4b  h.** BTREE_BLOBK
0fd0: 45 59 2c 20 74 68 65 20 6b 65 79 20 69 73 20 61  EY, the key is a
0fe0: 6e 20 61 72 62 69 74 72 61 72 79 20 42 4c 4f 42  n arbitrary BLOB
0ff0: 20 61 6e 64 20 6e 6f 20 63 6f 6e 74 65 6e 74 20   and no content 
1000: 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 61 6e 79  is stored.** any
1010: 77 68 65 72 65 20 2d 20 74 68 65 20 6b 65 79 20  where - the key 
1020: 69 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  is the content. 
1030: 20 28 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20   (BTREE_BLOBKEY 
1040: 69 73 20 75 73 65 64 20 66 6f 72 20 53 51 4c 0a  is used for SQL.
1050: 2a 2a 20 69 6e 64 69 63 65 73 2e 29 0a 2a 2f 0a  ** indices.).*/.
1060: 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 49 4e  #define BTREE_IN
1070: 54 4b 45 59 20 20 20 20 20 31 20 20 20 20 2f 2a  TKEY     1    /*
1080: 20 54 61 62 6c 65 20 68 61 73 20 6f 6e 6c 79 20   Table has only 
1090: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
10a0: 74 65 67 65 72 20 6b 65 79 73 20 2a 2f 0a 23 64  teger keys */.#d
10b0: 65 66 69 6e 65 20 42 54 52 45 45 5f 42 4c 4f 42  efine BTREE_BLOB
10c0: 4b 45 59 20 20 20 20 32 20 20 20 20 2f 2a 20 54  KEY    2    /* T
10d0: 61 62 6c 65 20 68 61 73 20 6b 65 79 73 20 6f 6e  able has keys on
10e0: 6c 79 20 2d 20 6e 6f 20 64 61 74 61 20 2a 2f 0a  ly - no data */.
10f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1100: 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
1110: 2a 2c 20 69 6e 74 2c 20 69 6e 74 2a 29 3b 0a 69  *, int, int*);.i
1120: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1130: 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 2a  learTable(Btree*
1140: 2c 20 69 6e 74 2c 20 69 6e 74 2a 29 3b 0a 69 6e  , int, int*);.in
1150: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1160: 65 61 72 54 61 62 6c 65 4f 66 43 75 72 73 6f 72  earTableOfCursor
1170: 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a 69 6e 74  (BtCursor*);.int
1180: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1190: 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
11a0: 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a  e*, int, int);..
11b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
11c0: 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a  eGetMeta(Btree *
11d0: 70 42 74 72 65 65 2c 20 69 6e 74 20 69 64 78 2c  pBtree, int idx,
11e0: 20 75 33 32 20 2a 70 56 61 6c 75 65 29 3b 0a 69   u32 *pValue);.i
11f0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55  nt sqlite3BtreeU
1200: 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 2a  pdateMeta(Btree*
1210: 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 76  , int idx, u32 v
1220: 61 6c 75 65 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  alue);..int sqli
1230: 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74  te3BtreeNewDb(Bt
1240: 72 65 65 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ree *p);../*.** 
1250: 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
1260: 65 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 42  eter to sqlite3B
1270: 74 72 65 65 47 65 74 4d 65 74 61 20 6f 72 20 73  treeGetMeta or s
1280: 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
1290: 65 4d 65 74 61 0a 2a 2a 20 73 68 6f 75 6c 64 20  eMeta.** should 
12a0: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  be one of the fo
12b0: 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 2e 20  llowing values. 
12c0: 54 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  The integer valu
12d0: 65 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  es are assigned 
12e0: 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74 61 6e 74 73  .** to constants
12f0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6f 66 66   so that the off
1300: 73 65 74 20 6f 66 20 74 68 65 20 63 6f 72 72 65  set of the corre
1310: 73 70 6f 6e 64 69 6e 67 20 66 69 65 6c 64 20 69  sponding field i
1320: 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 64  n an.** SQLite d
1330: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 6d  atabase header m
1340: 61 79 20 62 65 20 66 6f 75 6e 64 20 75 73 69 6e  ay be found usin
1350: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1360: 66 6f 72 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a 20 20  formula:.**.**  
1370: 20 6f 66 66 73 65 74 20 3d 20 33 36 20 2b 20 28   offset = 36 + (
1380: 69 64 78 20 2a 20 34 29 0a 2a 2a 0a 2a 2a 20 46  idx * 4).**.** F
1390: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
13a0: 66 72 65 65 2d 70 61 67 65 2d 63 6f 75 6e 74 20  free-page-count 
13b0: 66 69 65 6c 64 20 69 73 20 6c 6f 63 61 74 65 64  field is located
13c0: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
13d0: 33 36 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  36 of.** the dat
13e0: 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
13f0: 72 2e 20 54 68 65 20 69 6e 63 72 2d 76 61 63 75  r. The incr-vacu
1400: 75 6d 2d 66 6c 61 67 20 66 69 65 6c 64 20 69 73  um-flag field is
1410: 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 62   located at.** b
1420: 79 74 65 20 6f 66 66 73 65 74 20 36 34 20 28 3d  yte offset 64 (=
1430: 3d 20 33 36 2b 34 2a 37 29 2e 0a 2a 2a 0a 2a 2a  = 36+4*7)..**.**
1440: 20 54 68 65 20 42 54 52 45 45 5f 44 41 54 41 5f   The BTREE_DATA_
1450: 56 45 52 53 49 4f 4e 20 76 61 6c 75 65 20 69 73  VERSION value is
1460: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 20 76 61   not really a va
1470: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
1480: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 20 49 74 20  e header..** It 
1490: 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6e  is a read-only n
14a0: 75 6d 62 65 72 20 63 6f 6d 70 75 74 65 64 20 62  umber computed b
14b0: 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 42 75  y the pager.  Bu
14c0: 74 20 77 65 20 6d 65 72 67 65 20 69 74 20 77 69  t we merge it wi
14d0: 74 68 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  th.** the header
14e0: 20 76 61 6c 75 65 20 61 63 63 65 73 73 20 72 6f   value access ro
14f0: 75 74 69 6e 65 73 20 73 69 6e 63 65 20 69 74 73  utines since its
1500: 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20   access pattern 
1510: 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20  is the same..** 
1520: 43 61 6c 6c 20 69 74 20 61 20 22 76 69 72 74 75  Call it a "virtu
1530: 61 6c 20 6d 65 74 61 20 76 61 6c 75 65 22 2e 0a  al meta value"..
1540: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45  */.#define BTREE
1550: 5f 46 52 45 45 5f 50 41 47 45 5f 43 4f 55 4e 54  _FREE_PAGE_COUNT
1560: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 42       0.#define B
1570: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
1580: 49 4f 4e 20 20 20 20 20 20 31 0a 23 64 65 66 69  ION      1.#defi
1590: 6e 65 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  ne BTREE_FILE_FO
15a0: 52 4d 41 54 20 20 20 20 20 20 20 20 20 32 0a 23  RMAT         2.#
15b0: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 44 45 46  define BTREE_DEF
15c0: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 20  AULT_CACHE_SIZE 
15d0: 20 33 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45   3.#define BTREE
15e0: 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41  _LARGEST_ROOT_PA
15f0: 47 45 20 20 20 34 0a 23 64 65 66 69 6e 65 20 42  GE   4.#define B
1600: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
1610: 4e 47 20 20 20 20 20 20 20 35 0a 23 64 65 66 69  NG       5.#defi
1620: 6e 65 20 42 54 52 45 45 5f 55 53 45 52 5f 56 45  ne BTREE_USER_VE
1630: 52 53 49 4f 4e 20 20 20 20 20 20 20 20 36 0a 23  RSION        6.#
1640: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 49 4e 43  define BTREE_INC
1650: 52 5f 56 41 43 55 55 4d 20 20 20 20 20 20 20 20  R_VACUUM        
1660: 20 37 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45   7.#define BTREE
1670: 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 49 44 20  _APPLICATION_ID 
1680: 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 42       8.#define B
1690: 54 52 45 45 5f 44 41 54 41 5f 56 45 52 53 49 4f  TREE_DATA_VERSIO
16a0: 4e 20 20 20 20 20 20 20 20 31 35 20 20 2f 2a 20  N        15  /* 
16b0: 41 20 76 69 72 74 75 61 6c 20 6d 65 74 61 2d 76  A virtual meta-v
16c0: 61 6c 75 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4b  alue */../*.** K
16d0: 69 6e 64 73 20 6f 66 20 68 69 6e 74 73 20 74 68  inds of hints th
16e0: 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  at can be passed
16f0: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
1700: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
1710: 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
1720: 0a 2a 2a 0a 2a 2a 20 42 54 52 45 45 5f 48 49 4e  .**.** BTREE_HIN
1730: 54 5f 52 41 4e 47 45 20 20 28 61 72 67 75 6d 65  T_RANGE  (argume
1740: 6e 74 73 3a 20 45 78 70 72 2a 2c 20 4d 65 6d 2a  nts: Expr*, Mem*
1750: 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  ).**.**     The 
1760: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1770: 73 20 61 6e 20 45 78 70 72 2a 20 28 77 68 69 63  s an Expr* (whic
1780: 68 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  h is guaranteed 
1790: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66  to be constant f
17a0: 6f 72 0a 2a 2a 20 20 20 20 20 74 68 65 20 6c 69  or.**     the li
17b0: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 75  fetime of the cu
17c0: 72 73 6f 72 29 20 74 68 61 74 20 64 65 66 69 6e  rsor) that defin
17d0: 65 73 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  es constraints o
17e0: 6e 20 77 68 69 63 68 20 72 6f 77 73 0a 2a 2a 20  n which rows.** 
17f0: 20 20 20 20 6d 69 67 68 74 20 62 65 20 66 65 74      might be fet
1800: 63 68 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ched with this c
1810: 75 72 73 6f 72 2e 20 20 54 68 65 20 45 78 70 72  ursor.  The Expr
1820: 2a 20 74 72 65 65 20 6d 61 79 20 63 6f 6e 74 61  * tree may conta
1830: 69 6e 0a 2a 2a 20 20 20 20 20 54 4b 5f 52 45 47  in.**     TK_REG
1840: 49 53 54 45 52 20 6e 6f 64 65 73 20 74 68 61 74  ISTER nodes that
1850: 20 72 65 66 65 72 20 74 6f 20 76 61 6c 75 65 73   refer to values
1860: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
1870: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
1880: 73 0a 2a 2a 20 20 20 20 20 70 61 73 73 65 64 20  s.**     passed 
1890: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
18a0: 72 61 6d 65 74 65 72 2e 20 20 49 6e 20 6f 74 68  rameter.  In oth
18b0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 45 78 70  er words, if Exp
18c0: 72 2e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  r.op==TK_REGISTE
18d0: 52 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  R.**     then th
18e0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6e  e value of the n
18f0: 6f 64 65 20 69 73 20 74 68 65 20 76 61 6c 75 65  ode is the value
1900: 20 69 6e 20 4d 65 6d 5b 70 45 78 70 72 2e 69 54   in Mem[pExpr.iT
1910: 61 62 6c 65 5d 2e 20 20 41 6e 79 0a 2a 2a 20 20  able].  Any.**  
1920: 20 20 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64     TK_COLUMN nod
1930: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
1940: 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 73 20  ion tree refers 
1950: 74 6f 20 74 68 65 20 45 78 70 72 2e 69 43 6f 6c  to the Expr.iCol
1960: 75 6d 6e 2d 74 68 0a 2a 2a 20 20 20 20 20 63 6f  umn-th.**     co
1970: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 62 2d 74 72  lumn of the b-tr
1980: 65 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ee of the cursor
1990: 2e 20 20 54 68 65 20 45 78 70 72 20 74 72 65 65  .  The Expr tree
19a0: 20 77 69 6c 6c 20 6e 6f 74 20 63 6f 6e 74 61 69   will not contai
19b0: 6e 0a 2a 2a 20 20 20 20 20 61 6e 79 20 66 75 6e  n.**     any fun
19c0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6e 6f 72 20  ction calls nor 
19d0: 73 75 62 71 75 65 72 69 65 73 20 6e 6f 72 20 72  subqueries nor r
19e0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 62 2d 74  eferences to b-t
19f0: 72 65 65 73 20 6f 74 68 65 72 20 74 68 61 6e 0a  rees other than.
1a00: 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72 73 6f  **     the curso
1a10: 72 20 62 65 69 6e 67 20 68 69 6e 74 65 64 2e 0a  r being hinted..
1a20: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 64 65  **.**     The de
1a30: 73 69 67 6e 20 6f 66 20 74 68 65 20 5f 52 41 4e  sign of the _RAN
1a40: 47 45 20 68 69 6e 74 20 69 73 20 61 69 64 20 62  GE hint is aid b
1a50: 2d 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  -tree implementa
1a60: 74 69 6f 6e 73 20 74 68 61 74 20 74 72 79 0a 2a  tions that try.*
1a70: 2a 20 20 20 20 20 74 6f 20 70 72 65 66 65 74 63  *     to prefetc
1a80: 68 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  h content from r
1a90: 65 6d 6f 74 65 20 6d 61 63 68 69 6e 65 73 20 2d  emote machines -
1aa0: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 6f 73   to provide thos
1ab0: 65 0a 2a 2a 20 20 20 20 20 69 6d 70 6c 65 6d 65  e.**     impleme
1ac0: 6e 74 61 74 69 6f 6e 73 20 77 69 74 68 20 6c 69  ntations with li
1ad0: 6d 69 74 73 20 6f 6e 20 77 68 61 74 20 6e 65 65  mits on what nee
1ae0: 64 73 20 74 6f 20 62 65 20 70 72 65 66 65 74 63  ds to be prefetc
1af0: 68 65 64 20 61 6e 64 20 74 68 65 72 65 62 79 0a  hed and thereby.
1b00: 2a 2a 20 20 20 20 20 72 65 64 75 63 65 20 6e 65  **     reduce ne
1b10: 74 77 6f 72 6b 20 62 61 6e 64 77 69 64 74 68 2e  twork bandwidth.
1b20: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1b30: 20 42 54 52 45 45 5f 48 49 4e 54 5f 46 4c 41 47   BTREE_HINT_FLAG
1b40: 53 20 77 69 74 68 20 42 54 52 45 45 5f 42 55 4c  S with BTREE_BUL
1b50: 4b 4c 4f 41 44 20 69 73 20 74 68 65 20 6f 6e 6c  KLOAD is the onl
1b60: 79 20 68 69 6e 74 20 75 73 65 64 20 62 79 0a 2a  y hint used by.*
1b70: 2a 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74  * standard SQLit
1b80: 65 2e 20 20 54 68 65 20 6f 74 68 65 72 20 68 69  e.  The other hi
1b90: 6e 74 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  nts are provided
1ba0: 20 66 6f 72 20 65 78 74 65 6e 74 69 6f 6e 73 20   for extentions 
1bb0: 74 68 61 74 20 75 73 65 0a 2a 2a 20 74 68 65 20  that use.** the 
1bc0: 53 51 4c 69 74 65 20 70 61 72 73 65 72 20 61 6e  SQLite parser an
1bd0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1be0: 20 62 75 74 20 73 75 62 73 74 69 74 75 74 65 20   but substitute 
1bf0: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
1c00: 65 0a 2a 2a 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  e.** engine..*/.
1c10: 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 48 49  #define BTREE_HI
1c20: 4e 54 5f 52 41 4e 47 45 20 30 20 20 20 20 20 20  NT_RANGE 0      
1c30: 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 73 74 72   /* Range constr
1c40: 61 69 6e 74 73 20 6f 6e 20 71 75 65 72 69 65 73  aints on queries
1c50: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65   */../*.** Value
1c60: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 4f 52  s that may be OR
1c70: 27 64 20 74 6f 67 65 74 68 65 72 20 74 6f 20 66  'd together to f
1c80: 6f 72 6d 20 74 68 65 20 61 72 67 75 6d 65 6e 74  orm the argument
1c90: 20 74 6f 20 74 68 65 0a 2a 2a 20 42 54 52 45 45   to the.** BTREE
1ca0: 5f 48 49 4e 54 5f 46 4c 41 47 53 20 68 69 6e 74  _HINT_FLAGS hint
1cb0: 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   for sqlite3Btre
1cc0: 65 43 75 72 73 6f 72 48 69 6e 74 28 29 3a 0a 2a  eCursorHint():.*
1cd0: 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 42  *.** The BTREE_B
1ce0: 55 4c 4b 4c 4f 41 44 20 66 6c 61 67 20 69 73 20  ULKLOAD flag is 
1cf0: 73 65 74 20 6f 6e 20 69 6e 64 65 78 20 63 75 72  set on index cur
1d00: 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 69 6e  sors when the in
1d10: 64 65 78 20 69 73 20 67 6f 69 6e 67 0a 2a 2a 20  dex is going.** 
1d20: 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
1d30: 68 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  h content that i
1d40: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 73 6f 72  s already in sor
1d50: 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a  ted order..**.**
1d60: 20 54 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f   The BTREE_SEEK_
1d70: 45 51 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  EQ flag is set o
1d80: 6e 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  n cursors that w
1d90: 69 6c 6c 20 67 65 74 20 4f 50 5f 53 65 65 6b 47  ill get OP_SeekG
1da0: 45 20 6f 72 0a 2a 2a 20 4f 50 5f 53 65 65 6b 4c  E or.** OP_SeekL
1db0: 45 20 6f 70 63 6f 64 65 73 20 66 6f 72 20 61 20  E opcodes for a 
1dc0: 72 61 6e 67 65 20 73 65 61 72 63 68 2c 20 62 75  range search, bu
1dd0: 74 20 77 68 65 72 65 20 74 68 65 20 72 61 6e 67  t where the rang
1de0: 65 20 6f 66 20 65 6e 74 72 69 65 73 0a 2a 2a 20  e of entries.** 
1df0: 73 65 6c 65 63 74 65 64 20 77 69 6c 6c 20 61 6c  selected will al
1e00: 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  l have the same 
1e10: 6b 65 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  key.  In other w
1e20: 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72  ords, the cursor
1e30: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
1e40: 20 6f 6e 6c 79 20 66 6f 72 20 65 71 75 61 6c 69   only for equali
1e50: 74 79 20 6b 65 79 20 73 65 61 72 63 68 65 73 2e  ty key searches.
1e60: 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 42  .**.*/.#define B
1e70: 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 30 78  TREE_BULKLOAD 0x
1e80: 30 30 30 30 30 30 30 31 20 20 2f 2a 20 55 73 65  00000001  /* Use
1e90: 64 20 74 6f 20 66 75 6c 6c 20 69 6e 64 65 78 20  d to full index 
1ea0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
1eb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45  */.#define BTREE
1ec0: 5f 53 45 45 4b 5f 45 51 20 20 30 78 30 30 30 30  _SEEK_EQ  0x0000
1ed0: 30 30 30 32 20 20 2f 2a 20 45 51 20 73 65 65 6b  0002  /* EQ seek
1ee0: 73 20 6f 6e 6c 79 20 2d 20 6e 6f 20 72 61 6e 67  s only - no rang
1ef0: 65 20 73 65 65 6b 73 20 2a 2f 0a 0a 2f 2a 20 0a  e seeks */../* .
1f00: 2a 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  ** Flags passed 
1f10: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
1f20: 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
1f30: 42 74 72 65 65 43 75 72 73 6f 72 28 29 2e 0a 2a  BtreeCursor()..*
1f40: 2a 0a 2a 2a 20 46 6f 72 20 72 65 61 64 2d 6f 6e  *.** For read-on
1f50: 6c 79 20 63 75 72 73 6f 72 73 20 74 68 65 20 77  ly cursors the w
1f60: 72 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  rFlag argument i
1f70: 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2e 20 46  s always zero. F
1f80: 6f 72 20 72 65 61 64 2d 77 72 69 74 65 0a 2a 2a  or read-write.**
1f90: 20 63 75 72 73 6f 72 73 20 69 74 20 6d 61 79 20   cursors it may 
1fa0: 62 65 20 73 65 74 20 74 6f 20 65 69 74 68 65 72  be set to either
1fb0: 20 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54   (BTREE_WRCSR|BT
1fc0: 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 6f  REE_FORDELETE) o
1fd0: 72 20 6a 75 73 74 0a 2a 2a 20 28 42 54 52 45 45  r just.** (BTREE
1fe0: 5f 57 52 43 53 52 29 2e 20 49 66 20 74 68 65 20  _WRCSR). If the 
1ff0: 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20  BTREE_FORDELETE 
2000: 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
2010: 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
2020: 0a 2a 2a 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  .** only be used
2030: 20 62 79 20 53 51 4c 69 74 65 20 66 6f 72 20 74   by SQLite for t
2040: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2050: 0a 2a 2a 20 20 20 2a 20 74 6f 20 73 65 65 6b 20  .**   * to seek 
2060: 74 6f 20 61 6e 64 20 74 68 65 6e 20 64 65 6c 65  to and then dele
2070: 74 65 20 73 70 65 63 69 66 69 63 20 65 6e 74 72  te specific entr
2080: 69 65 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 0a 2a  ies, and/or.**.*
2090: 2a 20 20 20 2a 20 74 6f 20 72 65 61 64 20 76 61  *   * to read va
20a0: 6c 75 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  lues that will b
20b0: 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  e used to create
20c0: 20 6b 65 79 73 20 74 68 61 74 20 6f 74 68 65 72   keys that other
20d0: 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 46 4f  .**     BTREE_FO
20e0: 52 44 45 4c 45 54 45 20 63 75 72 73 6f 72 73 20  RDELETE cursors 
20f0: 77 69 6c 6c 20 73 65 65 6b 20 74 6f 20 61 6e 64  will seek to and
2100: 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 54   delete..**.** T
2110: 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  he BTREE_FORDELE
2120: 54 45 20 66 6c 61 67 20 69 73 20 61 6e 20 6f 70  TE flag is an op
2130: 74 69 6d 69 7a 61 74 69 6f 6e 20 68 69 6e 74 2e  timization hint.
2140: 20 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64    It is not used
2150: 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 2c 20   by.** by this, 
2160: 74 68 65 20 6e 61 74 69 76 65 20 62 2d 74 72 65  the native b-tre
2170: 65 20 65 6e 67 69 6e 65 20 6f 66 20 53 51 4c 69  e engine of SQLi
2180: 74 65 2c 20 62 75 74 20 69 74 20 69 73 20 61 76  te, but it is av
2190: 61 69 6c 61 62 6c 65 20 74 6f 0a 2a 2a 20 61 6c  ailable to.** al
21a0: 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67  ternative storag
21b0: 65 20 65 6e 67 69 6e 65 73 20 74 68 61 74 20 6d  e engines that m
21c0: 69 67 68 74 20 62 65 20 73 75 62 73 74 69 74 75  ight be substitu
21d0: 74 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ted in place of 
21e0: 74 68 69 73 0a 2a 2a 20 62 2d 74 72 65 65 20 73  this.** b-tree s
21f0: 79 73 74 65 6d 2e 20 20 46 6f 72 20 61 6c 74 65  ystem.  For alte
2200: 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20  rnative storage 
2210: 65 6e 67 69 6e 65 73 20 69 6e 20 77 68 69 63 68  engines in which
2220: 20 61 20 64 65 6c 65 74 65 20 6f 66 0a 2a 2a 20   a delete of.** 
2230: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 72  the main table r
2240: 6f 77 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ow automatically
2250: 20 64 65 6c 65 74 65 73 20 63 6f 72 72 65 73 70   deletes corresp
2260: 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20 72 6f 77  onding index row
2270: 73 2c 0a 2a 2a 20 74 68 65 20 46 4f 52 44 45 4c  s,.** the FORDEL
2280: 45 54 45 20 66 6c 61 67 20 68 69 6e 74 20 61 6c  ETE flag hint al
2290: 6c 6f 77 73 20 74 68 6f 73 65 20 61 6c 74 65 72  lows those alter
22a0: 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
22b0: 6e 67 69 6e 65 73 20 74 6f 0a 2a 2a 20 73 6b 69  ngines to.** ski
22c0: 70 20 61 20 6c 6f 74 20 6f 66 20 77 6f 72 6b 2e  p a lot of work.
22d0: 20 20 4e 61 6d 65 6c 79 3a 20 20 46 4f 52 44 45    Namely:  FORDE
22e0: 4c 45 54 45 20 63 75 72 73 6f 72 73 20 6d 61 79  LETE cursors may
22f0: 20 74 72 65 61 74 20 61 6c 6c 20 53 45 45 4b 0a   treat all SEEK.
2300: 2a 2a 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  ** and DELETE op
2310: 65 72 61 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f  erations as no-o
2320: 70 73 2c 20 61 6e 64 20 61 6e 79 20 52 45 41 44  ps, and any READ
2330: 20 6f 70 65 72 61 74 69 6f 6e 20 61 67 61 69 6e   operation again
2340: 73 74 20 61 0a 2a 2a 20 46 4f 52 44 45 4c 45 54  st a.** FORDELET
2350: 45 20 63 75 72 73 6f 72 20 6d 61 79 20 72 65 74  E cursor may ret
2360: 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 3a 20  urn a null row: 
2370: 30 78 30 31 20 30 78 30 30 2e 0a 2a 2f 0a 23 64  0x01 0x00..*/.#d
2380: 65 66 69 6e 65 20 42 54 52 45 45 5f 57 52 43 53  efine BTREE_WRCS
2390: 52 20 20 20 20 20 30 78 30 30 30 30 30 30 30 34  R     0x00000004
23a0: 20 20 20 20 20 2f 2a 20 72 65 61 64 2d 77 72 69       /* read-wri
23b0: 74 65 20 63 75 72 73 6f 72 20 2a 2f 0a 23 64 65  te cursor */.#de
23c0: 66 69 6e 65 20 42 54 52 45 45 5f 46 4f 52 44 45  fine BTREE_FORDE
23d0: 4c 45 54 45 20 30 78 30 30 30 30 30 30 30 38 20  LETE 0x00000008 
23e0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 69 73      /* Cursor is
23f0: 20 66 6f 72 20 73 65 65 6b 2f 64 65 6c 65 74 65   for seek/delete
2400: 20 6f 6e 6c 79 20 2a 2f 0a 0a 69 6e 74 20 73 71   only */..int sq
2410: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
2420: 28 0a 20 20 42 74 72 65 65 2a 2c 20 20 20 20 20  (.  Btree*,     
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 72 65           /* BTre
2450: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
2460: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2470: 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
24a0: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
24b0: 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 77 72       /* 1 for wr
24e0: 69 74 69 6e 67 2e 20 20 30 20 66 6f 72 20 72 65  iting.  0 for re
24f0: 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
2500: 75 63 74 20 4b 65 79 49 6e 66 6f 2a 2c 20 20 20  uct KeyInfo*,   
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
2530: 65 6e 74 20 74 6f 20 63 6f 6d 70 61 72 65 20 66  ent to compare f
2540: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
2550: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 20 20  ursor *pCursor  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 77 72    /* Space to wr
2580: 69 74 65 20 63 75 72 73 6f 72 20 73 74 72 75 63  ite cursor struc
2590: 74 75 72 65 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73  ture */.);.int s
25a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
25b0: 72 53 69 7a 65 28 76 6f 69 64 29 3b 0a 76 6f 69  rSize(void);.voi
25c0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
25d0: 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
25e0: 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  r*);.void sqlite
25f0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
2600: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 2a 2c  Flags(BtCursor*,
2610: 20 75 6e 73 69 67 6e 65 64 29 3b 0a 23 69 66 64   unsigned);.#ifd
2620: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2630: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 76 6f  _CURSOR_HINTS.vo
2640: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
2650: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
2660: 6f 72 2a 2c 20 69 6e 74 2c 20 2e 2e 2e 29 3b 0a  or*, int, ...);.
2670: 23 65 6e 64 69 66 0a 0a 69 6e 74 20 73 71 6c 69  #endif..int sqli
2680: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
2690: 73 6f 72 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a  sor(BtCursor*);.
26a0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
26b0: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
26c0: 20 20 42 74 43 75 72 73 6f 72 2a 2c 0a 20 20 55    BtCursor*,.  U
26d0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
26e0: 55 6e 4b 65 79 2c 0a 20 20 69 36 34 20 69 6e 74  UnKey,.  i64 int
26f0: 4b 65 79 2c 0a 20 20 69 6e 74 20 62 69 61 73 2c  Key,.  int bias,
2700: 0a 20 20 69 6e 74 20 2a 70 52 65 73 0a 29 3b 0a  .  int *pRes.);.
2710: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2720: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
2730: 74 43 75 72 73 6f 72 2a 29 3b 0a 69 6e 74 20 73  tCursor*);.int s
2740: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
2750: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
2760: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69 6e 74 20 73  r*, int*);.int s
2770: 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
2780: 65 28 42 74 43 75 72 73 6f 72 2a 2c 20 75 38 20  e(BtCursor*, u8 
2790: 66 6c 61 67 73 29 3b 0a 0a 2f 2a 20 41 6c 6c 6f  flags);../* Allo
27a0: 77 65 64 20 66 6c 61 67 73 20 66 6f 72 20 73 71  wed flags for sq
27b0: 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
27c0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
27d0: 72 65 65 49 6e 73 65 72 74 28 29 20 2a 2f 0a 23  reeInsert() */.#
27e0: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 53 41 56  define BTREE_SAV
27f0: 45 50 4f 53 49 54 49 4f 4e 20 30 78 30 32 20 20  EPOSITION 0x02  
2800: 2f 2a 20 4c 65 61 76 65 20 63 75 72 73 6f 72 20  /* Leave cursor 
2810: 70 6f 69 6e 74 69 6e 67 20 61 74 20 4e 45 58 54  pointing at NEXT
2820: 20 6f 72 20 50 52 45 56 20 2a 2f 0a 23 64 65 66   or PREV */.#def
2830: 69 6e 65 20 42 54 52 45 45 5f 41 55 58 44 45 4c  ine BTREE_AUXDEL
2840: 45 54 45 20 20 20 20 30 78 30 34 20 20 2f 2a 20  ETE    0x04  /* 
2850: 6e 6f 74 20 74 68 65 20 70 72 69 6d 61 72 79 20  not the primary 
2860: 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e  delete operation
2870: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45   */.#define BTRE
2880: 45 5f 41 50 50 45 4e 44 20 20 20 20 20 20 20 30  E_APPEND       0
2890: 78 30 38 20 20 2f 2a 20 49 6e 73 65 72 74 20 69  x08  /* Insert i
28a0: 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
28b0: 6e 64 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73  nd */../* An ins
28c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 42 74 72  tance of the Btr
28d0: 65 65 50 61 79 6c 6f 61 64 20 6f 62 6a 65 63 74  eePayload object
28e0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
28f0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
2900: 6c 65 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 65  le.** entry in e
2910: 69 74 68 65 72 20 61 6e 20 69 6e 64 65 78 20 6f  ither an index o
2920: 72 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a  r table btree..*
2930: 2a 0a 2a 2a 20 49 6e 64 65 78 20 62 74 72 65 65  *.** Index btree
2940: 73 20 28 75 73 65 64 20 66 6f 72 20 69 6e 64 65  s (used for inde
2950: 78 65 73 20 61 6e 64 20 61 6c 73 6f 20 57 49 54  xes and also WIT
2960: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2970: 73 29 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e  s) contain.** an
2980: 20 61 72 62 69 74 72 61 72 79 20 6b 65 79 20 61   arbitrary key a
2990: 6e 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65  nd no data.  The
29a0: 73 65 20 62 74 72 65 65 73 20 68 61 76 65 20 70  se btrees have p
29b0: 4b 65 79 2c 6e 4b 65 79 20 73 65 74 20 74 6f 20  Key,nKey set to 
29c0: 74 68 65 69 72 0a 2a 2a 20 6b 65 79 20 61 6e 64  their.** key and
29d0: 20 70 44 61 74 61 2c 6e 44 61 74 61 2c 6e 5a 65   pData,nData,nZe
29e0: 72 6f 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ro set to zero..
29f0: 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 62 74 72 65  **.** Table btre
2a00: 65 73 20 28 75 73 65 64 20 66 6f 72 20 72 6f 77  es (used for row
2a10: 69 64 20 74 61 62 6c 65 73 29 20 63 6f 6e 74 61  id tables) conta
2a20: 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f  in an integer ro
2a30: 77 69 64 20 75 73 65 64 20 61 73 0a 2a 2a 20 74  wid used as.** t
2a40: 68 65 20 6b 65 79 20 61 6e 64 20 70 61 73 73 65  he key and passe
2a50: 64 20 69 6e 20 74 68 65 20 6e 4b 65 79 20 66 69  d in the nKey fi
2a60: 65 6c 64 2e 20 20 54 68 65 20 70 4b 65 79 20 66  eld.  The pKey f
2a70: 69 65 6c 64 20 69 73 20 7a 65 72 6f 2e 20 20 0a  ield is zero.  .
2a80: 2a 2a 20 70 44 61 74 61 2c 6e 44 61 74 61 20 68  ** pData,nData h
2a90: 6f 6c 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  old the content 
2aa0: 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  of the new entry
2ab0: 2e 20 20 6e 5a 65 72 6f 20 65 78 74 72 61 20 7a  .  nZero extra z
2ac0: 65 72 6f 20 62 79 74 65 73 0a 2a 2a 20 61 72 65  ero bytes.** are
2ad0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2ae0: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6e 74   end of the cont
2af0: 65 6e 74 20 77 68 65 6e 20 63 6f 6e 73 74 72 75  ent when constru
2b00: 63 74 69 6e 67 20 74 68 65 20 65 6e 74 72 79 2e  cting the entry.
2b10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65  .**.** This obje
2b20: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 70 61  ct is used to pa
2b30: 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ss information i
2b40: 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65  nto sqlite3Btree
2b50: 49 6e 73 65 72 74 28 29 2e 20 20 54 68 65 0a 2a  Insert().  The.*
2b60: 2a 20 73 61 6d 65 20 69 6e 66 6f 72 6d 61 74 69  * same informati
2b70: 6f 6e 20 75 73 65 64 20 74 6f 20 62 65 20 70 61  on used to be pa
2b80: 73 73 65 64 20 61 73 20 66 69 76 65 20 73 65 70  ssed as five sep
2b90: 61 72 61 74 65 20 70 61 72 61 6d 65 74 65 72 73  arate parameters
2ba0: 2e 20 20 42 75 74 20 70 6c 61 63 69 6e 67 0a 2a  .  But placing.*
2bb0: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
2bc0: 6e 20 69 6e 74 6f 20 74 68 69 73 20 6f 62 6a 65  n into this obje
2bd0: 63 74 20 68 65 6c 70 73 20 74 6f 20 6b 65 65 70  ct helps to keep
2be0: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 6d   the interface m
2bf0: 6f 72 65 20 0a 2a 2a 20 6f 72 67 61 6e 69 7a 65  ore .** organize
2c00: 64 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e 64  d and understand
2c10: 61 62 6c 65 2c 20 61 6e 64 20 69 74 20 61 6c 73  able, and it als
2c20: 6f 20 68 65 6c 70 73 20 74 68 65 20 72 65 73 75  o helps the resu
2c30: 6c 74 69 6e 67 20 63 6f 64 65 20 74 6f 0a 2a 2a  lting code to.**
2c40: 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 66 61   run a little fa
2c50: 73 74 65 72 20 62 79 20 75 73 69 6e 67 20 66 65  ster by using fe
2c60: 77 65 72 20 72 65 67 69 73 74 65 72 73 20 66 6f  wer registers fo
2c70: 72 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  r parameter pass
2c80: 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42  ing..*/.struct B
2c90: 74 72 65 65 50 61 79 6c 6f 61 64 20 7b 0a 20 20  treePayload {.  
2ca0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
2cb0: 3b 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 63  ;       /* Key c
2cc0: 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 65 78  ontent for index
2cd0: 65 73 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 61  es.  NULL for ta
2ce0: 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bles */.  sqlite
2cf0: 33 5f 69 6e 74 36 34 20 6e 4b 65 79 3b 20 20 20  3_int64 nKey;   
2d00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65    /* Size of pKe
2d10: 79 20 66 6f 72 20 69 6e 64 65 78 65 73 2e 20 20  y for indexes.  
2d20: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
2d30: 74 61 62 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tabs */.  const 
2d40: 76 6f 69 64 20 2a 70 44 61 74 61 3b 20 20 20 20  void *pData;    
2d50: 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 61    /* Data for ta
2d60: 62 6c 65 73 2e 20 20 4e 55 4c 4c 20 66 6f 72 20  bles.  NULL for 
2d70: 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 73 71 6c  indexes */.  sql
2d80: 69 74 65 33 5f 76 61 6c 75 65 20 2a 61 4d 65 6d  ite3_value *aMem
2d90: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66  ;    /* First of
2da0: 20 6e 4d 65 6d 20 76 61 6c 75 65 20 69 6e 20 74   nMem value in t
2db0: 68 65 20 75 6e 70 61 63 6b 65 64 20 70 4b 65 79  he unpacked pKey
2dc0: 20 2a 2f 0a 20 20 75 31 36 20 6e 4d 65 6d 3b 20   */.  u16 nMem; 
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 4d 65 6d 5b   Number of aMem[
2df0: 5d 20 76 61 6c 75 65 2e 20 20 4d 69 67 68 74 20  ] value.  Might 
2e00: 62 65 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  be zero */.  int
2e10: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
2e20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2e30: 70 44 61 74 61 2e 20 20 30 20 69 66 20 6e 6f 6e  pData.  0 if non
2e40: 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  e. */.  int nZer
2e50: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
2e60: 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 64 61  /* Extra zero da
2e70: 74 61 20 61 70 70 65 6e 64 65 64 20 61 66 74 65  ta appended afte
2e80: 72 20 70 44 61 74 61 2c 6e 44 61 74 61 20 2a 2f  r pData,nData */
2e90: 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .};..int sqlite3
2ea0: 42 74 72 65 65 49 6e 73 65 72 74 28 42 74 43 75  BtreeInsert(BtCu
2eb0: 72 73 6f 72 2a 2c 20 63 6f 6e 73 74 20 42 74 72  rsor*, const Btr
2ec0: 65 65 50 61 79 6c 6f 61 64 20 2a 70 50 61 79 6c  eePayload *pPayl
2ed0: 6f 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oad,.           
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2ef0: 66 6c 61 67 73 2c 20 69 6e 74 20 73 65 65 6b 52  flags, int seekR
2f00: 65 73 75 6c 74 29 3b 0a 69 6e 74 20 73 71 6c 69  esult);.int sqli
2f10: 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
2f20: 43 75 72 73 6f 72 2a 2c 20 69 6e 74 20 2a 70 52  Cursor*, int *pR
2f30: 65 73 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  es);.int sqlite3
2f40: 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
2f50: 6f 72 2a 2c 20 69 6e 74 20 2a 70 52 65 73 29 3b  or*, int *pRes);
2f60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2f70: 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 2a 2c  eNext(BtCursor*,
2f80: 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 69 6e 74   int flags);.int
2f90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
2fa0: 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a 69 6e 74  (BtCursor*);.int
2fb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2fc0: 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 2a 2c  vious(BtCursor*,
2fd0: 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 69 36 34   int flags);.i64
2fe0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
2ff0: 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72  egerKey(BtCursor
3000: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  *);.int sqlite3B
3010: 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75  treePayload(BtCu
3020: 72 73 6f 72 2a 2c 20 75 33 32 20 6f 66 66 73 65  rsor*, u32 offse
3030: 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
3040: 2a 29 3b 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *);.const void *
3050: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
3060: 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f  oadFetch(BtCurso
3070: 72 2a 2c 20 75 33 32 20 2a 70 41 6d 74 29 3b 0a  r*, u32 *pAmt);.
3080: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
3090: 50 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75  PayloadSize(BtCu
30a0: 72 73 6f 72 2a 29 3b 0a 0a 63 68 61 72 20 2a 73  rsor*);..char *s
30b0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
30c0: 72 69 74 79 43 68 65 63 6b 28 42 74 72 65 65 2a  rityCheck(Btree*
30d0: 2c 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 69 6e  , int *aRoot, in
30e0: 74 20 6e 52 6f 6f 74 2c 20 69 6e 74 2c 20 69 6e  t nRoot, int, in
30f0: 74 2a 29 3b 0a 73 74 72 75 63 74 20 50 61 67 65  t*);.struct Page
3100: 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50  r *sqlite3BtreeP
3110: 61 67 65 72 28 42 74 72 65 65 2a 29 3b 0a 69 36  ager(Btree*);.i6
3120: 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  4 sqlite3BtreeRo
3130: 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73  wCountEst(BtCurs
3140: 6f 72 2a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  or*);..#ifndef S
3150: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
3160: 4c 4f 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  LOB.int sqlite3B
3170: 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
3180: 65 64 28 42 74 43 75 72 73 6f 72 2a 2c 20 75 33  ed(BtCursor*, u3
3190: 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
31a0: 74 2c 20 76 6f 69 64 2a 29 3b 0a 69 6e 74 20 73  t, void*);.int s
31b0: 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
31c0: 74 61 28 42 74 43 75 72 73 6f 72 2a 2c 20 75 33  ta(BtCursor*, u3
31d0: 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
31e0: 74 2c 20 76 6f 69 64 2a 29 3b 0a 76 6f 69 64 20  t, void*);.void 
31f0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
3200: 62 6c 6f 62 43 75 72 73 6f 72 28 42 74 43 75 72  blobCursor(BtCur
3210: 73 6f 72 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 76  sor *);.#endif.v
3220: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3230: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
3240: 72 73 6f 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c  rsor *);.int sql
3250: 69 74 65 33 42 74 72 65 65 53 65 74 56 65 72 73  ite3BtreeSetVers
3260: 69 6f 6e 28 42 74 72 65 65 20 2a 70 42 74 2c 20  ion(Btree *pBt, 
3270: 69 6e 74 20 69 56 65 72 73 69 6f 6e 29 3b 0a 69  int iVersion);.i
3280: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
3290: 75 72 73 6f 72 48 61 73 48 69 6e 74 28 42 74 43  ursorHasHint(BtC
32a0: 75 72 73 6f 72 2a 2c 20 75 6e 73 69 67 6e 65 64  ursor*, unsigned
32b0: 20 69 6e 74 20 6d 61 73 6b 29 3b 0a 69 6e 74 20   int mask);.int 
32c0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
32d0: 61 64 6f 6e 6c 79 28 42 74 72 65 65 20 2a 70 42  adonly(Btree *pB
32e0: 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 48  t);.int sqlite3H
32f0: 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28 76  eaderSizeBtree(v
3300: 6f 69 64 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  oid);..#ifndef N
3310: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
3320: 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
3330: 6c 69 64 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a  lid(BtCursor*);.
3340: 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
3350: 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
3360: 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 2a  alidNN(BtCursor*
3370: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
3380: 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
3390: 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  NT.int sqlite3Bt
33a0: 72 65 65 43 6f 75 6e 74 28 42 74 43 75 72 73 6f  reeCount(BtCurso
33b0: 72 20 2a 2c 20 69 36 34 20 2a 29 3b 0a 23 65 6e  r *, i64 *);.#en
33c0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
33d0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
33e0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 6e  te3BtreeCursorIn
33f0: 66 6f 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e  fo(BtCursor*, in
3400: 74 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 73  t*, int);.void s
3410: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
3420: 72 4c 69 73 74 28 42 74 72 65 65 2a 29 3b 0a 23  rList(Btree*);.#
3430: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
3440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
3450: 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65   int sqlite3Btre
3460: 65 43 68 65 63 6b 70 6f 69 6e 74 28 42 74 72 65  eCheckpoint(Btre
3470: 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 2c 20  e*, int, int *, 
3480: 69 6e 74 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  int *);.#endif..
3490: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
34a0: 6e 6f 74 20 75 73 69 6e 67 20 73 68 61 72 65 64  not using shared
34b0: 20 63 61 63 68 65 2c 20 74 68 65 6e 20 74 68 65   cache, then the
34c0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
34d0: 0a 2a 2a 20 75 73 65 20 6d 75 74 65 78 65 73 20  .** use mutexes 
34e0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 42 74  to access the Bt
34f0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
3500: 73 2e 20 20 53 6f 20 6d 61 6b 65 20 74 68 65 0a  s.  So make the.
3510: 2a 2a 20 45 6e 74 65 72 20 61 6e 64 20 4c 65 61  ** Enter and Lea
3520: 76 65 20 70 72 6f 63 65 64 75 72 65 73 20 6e 6f  ve procedures no
3530: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  -ops..*/.#ifndef
3540: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3550: 52 45 44 5f 43 41 43 48 45 0a 20 20 76 6f 69 64  RED_CACHE.  void
3560: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3570: 65 72 28 42 74 72 65 65 2a 29 3b 0a 20 20 76 6f  er(Btree*);.  vo
3580: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  id sqlite3BtreeE
3590: 6e 74 65 72 41 6c 6c 28 73 71 6c 69 74 65 33 2a  nterAll(sqlite3*
35a0: 29 3b 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  );.  int sqlite3
35b0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 42 74  BtreeSharable(Bt
35c0: 72 65 65 2a 29 3b 0a 20 20 76 6f 69 64 20 73 71  ree*);.  void sq
35d0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 43  lite3BtreeEnterC
35e0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 2a 29  ursor(BtCursor*)
35f0: 3b 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.  int sqlite3B
3600: 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f  treeConnectionCo
3610: 75 6e 74 28 42 74 72 65 65 2a 29 3b 0a 23 65 6c  unt(Btree*);.#el
3620: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
3630: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 58 29  te3BtreeEnter(X)
3640: 20 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74   .# define sqlit
3650: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3660: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  X).# define sqli
3670: 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65  te3BtreeSharable
3680: 28 58 29 20 30 0a 23 20 64 65 66 69 6e 65 20 73  (X) 0.# define s
3690: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
36a0: 43 75 72 73 6f 72 28 58 29 0a 23 20 64 65 66 69  Cursor(X).# defi
36b0: 6e 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ne sqlite3BtreeC
36c0: 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 58  onnectionCount(X
36d0: 29 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ) 1.#endif..#if 
36e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
36f0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3700: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3710: 45 41 44 53 41 46 45 0a 20 20 76 6f 69 64 20 73  EADSAFE.  void s
3720: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
3730: 28 42 74 72 65 65 2a 29 3b 0a 20 20 76 6f 69 64  (Btree*);.  void
3740: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
3750: 76 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  veCursor(BtCurso
3760: 72 2a 29 3b 0a 20 20 76 6f 69 64 20 73 71 6c 69  r*);.  void sqli
3770: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
3780: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69 66 6e  (sqlite3*);.#ifn
3790: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
37a0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
37b0: 72 65 20 75 73 65 64 20 69 6e 73 69 64 65 20 61  re used inside a
37c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
37d0: 74 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 69 6e  ts only. */.  in
37e0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  t sqlite3BtreeHo
37f0: 6c 64 73 4d 75 74 65 78 28 42 74 72 65 65 2a 29  ldsMutex(Btree*)
3800: 3b 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.  int sqlite3B
3810: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3820: 78 65 73 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  xes(sqlite3*);. 
3830: 20 69 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65   int sqlite3Sche
3840: 6d 61 4d 75 74 65 78 48 65 6c 64 28 73 71 6c 69  maMutexHeld(sqli
3850: 74 65 33 2a 2c 69 6e 74 2c 53 63 68 65 6d 61 2a  te3*,int,Schema*
3860: 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  );.#endif.#else.
3870: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
3880: 33 42 74 72 65 65 4c 65 61 76 65 28 58 29 0a 23  3BtreeLeave(X).#
3890: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42   define sqlite3B
38a0: 74 72 65 65 4c 65 61 76 65 43 75 72 73 6f 72 28  treeLeaveCursor(
38b0: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  X).# define sqli
38c0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
38d0: 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 73 71  (X)..# define sq
38e0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
38f0: 75 74 65 78 28 58 29 20 31 0a 23 20 64 65 66 69  utex(X) 1.# defi
3900: 6e 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  ne sqlite3BtreeH
3910: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 58  oldsAllMutexes(X
3920: 29 20 31 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  ) 1.# define sql
3930: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
3940: 65 6c 64 28 58 2c 59 2c 5a 29 20 31 0a 23 65 6e  eld(X,Y,Z) 1.#en
3950: 64 69 66 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  dif...#endif /* 
3960: 53 51 4c 49 54 45 5f 42 54 52 45 45 5f 48 20 2a  SQLITE_BTREE_H *
3970: 2f 0a                                            /.