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

Artifact 075c45707c0f8f8af118f739f36df8098a08b7da:


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 69 6e  ree *pBtree);.in
0d30: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  t sqlite3BtreeLo
0d40: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
0d50: 42 74 72 65 65 2c 20 69 6e 74 20 69 54 61 62 2c  Btree, int iTab,
0d60: 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29   u8 isWriteLock)
0d70: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ;.int sqlite3Btr
0d80: 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
0d90: 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a  e *, int, int);.
0da0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0db0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
0dc0: 6e 61 6d 65 28 42 74 72 65 65 20 2a 29 3b 0a 63  name(Btree *);.c
0dd0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
0de0: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
0df0: 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 29 3b 0a  lname(Btree *);.
0e00: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
0e10: 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
0e20: 2c 20 42 74 72 65 65 20 2a 29 3b 0a 0a 69 6e 74  , Btree *);..int
0e30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
0e40: 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 29  rVacuum(Btree *)
0e50: 3b 0a 0a 2f 2a 20 54 68 65 20 66 6c 61 67 73 20  ;../* The flags 
0e60: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c  parameter to sql
0e70: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
0e80: 61 62 6c 65 20 63 61 6e 20 62 65 20 74 68 65 20  able can be the 
0e90: 62 69 74 77 69 73 65 20 4f 52 0a 2a 2a 20 6f 66  bitwise OR.** of
0ea0: 20 74 68 65 20 66 6c 61 67 73 20 73 68 6f 77 6e   the flags shown
0eb0: 20 62 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 45 76   below..**.** Ev
0ec0: 65 72 79 20 53 51 4c 69 74 65 20 74 61 62 6c 65  ery SQLite table
0ed0: 20 6d 75 73 74 20 68 61 76 65 20 65 69 74 68 65   must have eithe
0ee0: 72 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 6f  r BTREE_INTKEY o
0ef0: 72 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20  r BTREE_BLOBKEY 
0f00: 73 65 74 2e 0a 2a 2a 20 57 69 74 68 20 42 54 52  set..** With BTR
0f10: 45 45 5f 49 4e 54 4b 45 59 2c 20 74 68 65 20 74  EE_INTKEY, the t
0f20: 61 62 6c 65 20 6b 65 79 20 69 73 20 61 20 36 34  able key is a 64
0f30: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 6e 64  -bit integer and
0f40: 20 61 72 62 69 74 72 61 72 79 20 64 61 74 61 0a   arbitrary data.
0f50: 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
0f60: 74 68 65 20 6c 65 61 76 65 73 2e 20 20 28 42 54  the leaves.  (BT
0f70: 52 45 45 5f 49 4e 54 4b 45 59 20 69 73 20 75 73  REE_INTKEY is us
0f80: 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
0f90: 73 2e 29 20 20 57 69 74 68 0a 2a 2a 20 42 54 52  s.)  With.** BTR
0fa0: 45 45 5f 42 4c 4f 42 4b 45 59 2c 20 74 68 65 20  EE_BLOBKEY, the 
0fb0: 6b 65 79 20 69 73 20 61 6e 20 61 72 62 69 74 72  key is an arbitr
0fc0: 61 72 79 20 42 4c 4f 42 20 61 6e 64 20 6e 6f 20  ary BLOB and no 
0fd0: 63 6f 6e 74 65 6e 74 20 69 73 20 73 74 6f 72 65  content is store
0fe0: 64 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 2d 20  d.** anywhere - 
0ff0: 74 68 65 20 6b 65 79 20 69 73 20 74 68 65 20 63  the key is the c
1000: 6f 6e 74 65 6e 74 2e 20 20 28 42 54 52 45 45 5f  ontent.  (BTREE_
1010: 42 4c 4f 42 4b 45 59 20 69 73 20 75 73 65 64 20  BLOBKEY is used 
1020: 66 6f 72 20 53 51 4c 0a 2a 2a 20 69 6e 64 69 63  for SQL.** indic
1030: 65 73 2e 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  es.).*/.#define 
1040: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 20 20 20  BTREE_INTKEY    
1050: 20 31 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68   1    /* Table h
1060: 61 73 20 6f 6e 6c 79 20 36 34 2d 62 69 74 20 73  as only 64-bit s
1070: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 6b 65  igned integer ke
1080: 79 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54  ys */.#define BT
1090: 52 45 45 5f 42 4c 4f 42 4b 45 59 20 20 20 20 32  REE_BLOBKEY    2
10a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 61 73      /* Table has
10b0: 20 6b 65 79 73 20 6f 6e 6c 79 20 2d 20 6e 6f 20   keys only - no 
10c0: 64 61 74 61 20 2a 2f 0a 0a 69 6e 74 20 73 71 6c  data */..int sql
10d0: 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
10e0: 6c 65 28 42 74 72 65 65 2a 2c 20 69 6e 74 2c 20  le(Btree*, int, 
10f0: 69 6e 74 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  int*);.int sqlit
1100: 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
1110: 65 28 42 74 72 65 65 2a 2c 20 69 6e 74 2c 20 69  e(Btree*, int, i
1120: 6e 74 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65  nt*);.int sqlite
1130: 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1140: 4f 66 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  OfCursor(BtCurso
1150: 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  r*);.int sqlite3
1160: 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1170: 6f 72 73 28 42 74 72 65 65 2a 2c 20 69 6e 74 2c  ors(Btree*, int,
1180: 20 69 6e 74 29 3b 0a 0a 76 6f 69 64 20 73 71 6c   int);..void sql
1190: 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
11a0: 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
11b0: 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 56  int idx, u32 *pV
11c0: 61 6c 75 65 29 3b 0a 69 6e 74 20 73 71 6c 69 74  alue);.int sqlit
11d0: 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
11e0: 61 28 42 74 72 65 65 2a 2c 20 69 6e 74 20 69 64  a(Btree*, int id
11f0: 78 2c 20 75 33 32 20 76 61 6c 75 65 29 3b 0a 0a  x, u32 value);..
1200: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1210: 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 3b  NewDb(Btree *p);
1220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1230: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  nd parameter to 
1240: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
1250: 65 74 61 20 6f 72 20 73 71 6c 69 74 65 33 42 74  eta or sqlite3Bt
1260: 72 65 65 55 70 64 61 74 65 4d 65 74 61 0a 2a 2a  reeUpdateMeta.**
1270: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
1280: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1290: 76 61 6c 75 65 73 2e 20 54 68 65 20 69 6e 74 65  values. The inte
12a0: 67 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 61  ger values are a
12b0: 73 73 69 67 6e 65 64 20 0a 2a 2a 20 74 6f 20 63  ssigned .** to c
12c0: 6f 6e 73 74 61 6e 74 73 20 73 6f 20 74 68 61 74  onstants so that
12d0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
12e0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
12f0: 20 66 69 65 6c 64 20 69 6e 20 61 6e 0a 2a 2a 20   field in an.** 
1300: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
1310: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 66 6f  header may be fo
1320: 75 6e 64 20 75 73 69 6e 67 20 74 68 65 20 66 6f  und using the fo
1330: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 75 6c 61 3a  llowing formula:
1340: 0a 2a 2a 0a 2a 2a 20 20 20 6f 66 66 73 65 74 20  .**.**   offset 
1350: 3d 20 33 36 20 2b 20 28 69 64 78 20 2a 20 34 29  = 36 + (idx * 4)
1360: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1370: 6c 65 2c 20 74 68 65 20 66 72 65 65 2d 70 61 67  le, the free-pag
1380: 65 2d 63 6f 75 6e 74 20 66 69 65 6c 64 20 69 73  e-count field is
1390: 20 6c 6f 63 61 74 65 64 20 61 74 20 62 79 74 65   located at byte
13a0: 20 6f 66 66 73 65 74 20 33 36 20 6f 66 0a 2a 2a   offset 36 of.**
13b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13c0: 6c 65 20 68 65 61 64 65 72 2e 20 54 68 65 20 69  le header. The i
13d0: 6e 63 72 2d 76 61 63 75 75 6d 2d 66 6c 61 67 20  ncr-vacuum-flag 
13e0: 66 69 65 6c 64 20 69 73 20 6c 6f 63 61 74 65 64  field is located
13f0: 20 61 74 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73   at.** byte offs
1400: 65 74 20 36 34 20 28 3d 3d 20 33 36 2b 34 2a 37  et 64 (== 36+4*7
1410: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  )..**.** The BTR
1420: 45 45 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e 20  EE_DATA_VERSION 
1430: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 72 65 61  value is not rea
1440: 6c 6c 79 20 61 20 76 61 6c 75 65 20 73 74 6f 72  lly a value stor
1450: 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
1460: 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20 72 65 61  ..** It is a rea
1470: 64 2d 6f 6e 6c 79 20 6e 75 6d 62 65 72 20 63 6f  d-only number co
1480: 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 61  mputed by the pa
1490: 67 65 72 2e 20 20 42 75 74 20 77 65 20 6d 65 72  ger.  But we mer
14a0: 67 65 20 69 74 20 77 69 74 68 0a 2a 2a 20 74 68  ge it with.** th
14b0: 65 20 68 65 61 64 65 72 20 76 61 6c 75 65 20 61  e header value a
14c0: 63 63 65 73 73 20 72 6f 75 74 69 6e 65 73 20 73  ccess routines s
14d0: 69 6e 63 65 20 69 74 73 20 61 63 63 65 73 73 20  ince its access 
14e0: 70 61 74 74 65 72 6e 20 69 73 20 74 68 65 20 73  pattern is the s
14f0: 61 6d 65 2e 0a 2a 2a 20 43 61 6c 6c 20 69 74 20  ame..** Call it 
1500: 61 20 22 76 69 72 74 75 61 6c 20 6d 65 74 61 20  a "virtual meta 
1510: 76 61 6c 75 65 22 2e 0a 2a 2f 0a 23 64 65 66 69  value"..*/.#defi
1520: 6e 65 20 42 54 52 45 45 5f 46 52 45 45 5f 50 41  ne BTREE_FREE_PA
1530: 47 45 5f 43 4f 55 4e 54 20 20 20 20 20 30 0a 23  GE_COUNT     0.#
1540: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 53 43 48  define BTREE_SCH
1550: 45 4d 41 5f 56 45 52 53 49 4f 4e 20 20 20 20 20  EMA_VERSION     
1560: 20 31 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45   1.#define BTREE
1570: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 20 20 20  _FILE_FORMAT    
1580: 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 42       2.#define B
1590: 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  TREE_DEFAULT_CAC
15a0: 48 45 5f 53 49 5a 45 20 20 33 0a 23 64 65 66 69  HE_SIZE  3.#defi
15b0: 6e 65 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54  ne BTREE_LARGEST
15c0: 5f 52 4f 4f 54 5f 50 41 47 45 20 20 20 34 0a 23  _ROOT_PAGE   4.#
15d0: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 54 45 58  define BTREE_TEX
15e0: 54 5f 45 4e 43 4f 44 49 4e 47 20 20 20 20 20 20  T_ENCODING      
15f0: 20 35 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45   5.#define BTREE
1600: 5f 55 53 45 52 5f 56 45 52 53 49 4f 4e 20 20 20  _USER_VERSION   
1610: 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 42       6.#define B
1620: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
1630: 20 20 20 20 20 20 20 20 20 37 0a 23 64 65 66 69           7.#defi
1640: 6e 65 20 42 54 52 45 45 5f 41 50 50 4c 49 43 41  ne BTREE_APPLICA
1650: 54 49 4f 4e 5f 49 44 20 20 20 20 20 20 38 0a 23  TION_ID      8.#
1660: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 44 41 54  define BTREE_DAT
1670: 41 5f 56 45 52 53 49 4f 4e 20 20 20 20 20 20 20  A_VERSION       
1680: 20 31 35 20 20 2f 2a 20 41 20 76 69 72 74 75 61   15  /* A virtua
1690: 6c 20 6d 65 74 61 2d 76 61 6c 75 65 20 2a 2f 0a  l meta-value */.
16a0: 0a 2f 2a 0a 2a 2a 20 4b 69 6e 64 73 20 6f 66 20  ./*.** Kinds of 
16b0: 68 69 6e 74 73 20 74 68 61 74 20 63 61 6e 20 62  hints that can b
16c0: 65 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  e passed into th
16d0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
16e0: 72 73 6f 72 48 69 6e 74 28 29 0a 2a 2a 20 69 6e  rsorHint().** in
16f0: 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 42  terface..**.** B
1700: 54 52 45 45 5f 48 49 4e 54 5f 52 41 4e 47 45 20  TREE_HINT_RANGE 
1710: 20 28 61 72 67 75 6d 65 6e 74 73 3a 20 45 78 70   (arguments: Exp
1720: 72 2a 2c 20 4d 65 6d 2a 29 0a 2a 2a 0a 2a 2a 20  r*, Mem*).**.** 
1730: 20 20 20 20 54 68 65 20 66 69 72 73 74 20 61 72      The first ar
1740: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 45 78 70  gument is an Exp
1750: 72 2a 20 28 77 68 69 63 68 20 69 73 20 67 75 61  r* (which is gua
1760: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1770: 6e 73 74 61 6e 74 20 66 6f 72 0a 2a 2a 20 20 20  nstant for.**   
1780: 20 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f    the lifetime o
1790: 66 20 74 68 65 20 63 75 72 73 6f 72 29 20 74 68  f the cursor) th
17a0: 61 74 20 64 65 66 69 6e 65 73 20 63 6f 6e 73 74  at defines const
17b0: 72 61 69 6e 74 73 20 6f 6e 20 77 68 69 63 68 20  raints on which 
17c0: 72 6f 77 73 0a 2a 2a 20 20 20 20 20 6d 69 67 68  rows.**     migh
17d0: 74 20 62 65 20 66 65 74 63 68 65 64 20 77 69 74  t be fetched wit
17e0: 68 20 74 68 69 73 20 63 75 72 73 6f 72 2e 20 20  h this cursor.  
17f0: 54 68 65 20 45 78 70 72 2a 20 74 72 65 65 20 6d  The Expr* tree m
1800: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 20 20  ay contain.**   
1810: 20 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6e 6f    TK_REGISTER no
1820: 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  des that refer t
1830: 6f 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  o values stored 
1840: 69 6e 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  in the array of 
1850: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
1860: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1870: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2e  econd parameter.
1880: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1890: 2c 20 69 66 20 45 78 70 72 2e 6f 70 3d 3d 54 4b  , if Expr.op==TK
18a0: 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 20 20 20  _REGISTER.**    
18b0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
18c0: 6f 66 20 74 68 65 20 6e 6f 64 65 20 69 73 20 74  of the node is t
18d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 4d 65 6d 5b  he value in Mem[
18e0: 70 45 78 70 72 2e 69 54 61 62 6c 65 5d 2e 20 20  pExpr.iTable].  
18f0: 41 6e 79 0a 2a 2a 20 20 20 20 20 54 4b 5f 43 4f  Any.**     TK_CO
1900: 4c 55 4d 4e 20 6e 6f 64 65 20 69 6e 20 74 68 65  LUMN node in the
1910: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1920: 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 45   refers to the E
1930: 78 70 72 2e 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  xpr.iColumn-th.*
1940: 2a 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20  *     column of 
1950: 74 68 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68  the b-tree of th
1960: 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 45  e cursor.  The E
1970: 78 70 72 20 74 72 65 65 20 77 69 6c 6c 20 6e 6f  xpr tree will no
1980: 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 20 20 20  t contain.**    
1990: 20 61 6e 79 20 66 75 6e 63 74 69 6f 6e 20 63 61   any function ca
19a0: 6c 6c 73 20 6e 6f 72 20 73 75 62 71 75 65 72 69  lls nor subqueri
19b0: 65 73 20 6e 6f 72 20 72 65 66 65 72 65 6e 63 65  es nor reference
19c0: 73 20 74 6f 20 62 2d 74 72 65 65 73 20 6f 74 68  s to b-trees oth
19d0: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 74  er than.**     t
19e0: 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20  he cursor being 
19f0: 68 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  hinted..**.**   
1a00: 20 20 54 68 65 20 64 65 73 69 67 6e 20 6f 66 20    The design of 
1a10: 74 68 65 20 5f 52 41 4e 47 45 20 68 69 6e 74 20  the _RANGE hint 
1a20: 69 73 20 61 69 64 20 62 2d 74 72 65 65 20 69 6d  is aid b-tree im
1a30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 74 68  plementations th
1a40: 61 74 20 74 72 79 0a 2a 2a 20 20 20 20 20 74 6f  at try.**     to
1a50: 20 70 72 65 66 65 74 63 68 20 63 6f 6e 74 65 6e   prefetch conten
1a60: 74 20 66 72 6f 6d 20 72 65 6d 6f 74 65 20 6d 61  t from remote ma
1a70: 63 68 69 6e 65 73 20 2d 20 74 6f 20 70 72 6f 76  chines - to prov
1a80: 69 64 65 20 74 68 6f 73 65 0a 2a 2a 20 20 20 20  ide those.**    
1a90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1aa0: 20 77 69 74 68 20 6c 69 6d 69 74 73 20 6f 6e 20   with limits on 
1ab0: 77 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  what needs to be
1ac0: 20 70 72 65 66 65 74 63 68 65 64 20 61 6e 64 20   prefetched and 
1ad0: 74 68 65 72 65 62 79 0a 2a 2a 20 20 20 20 20 72  thereby.**     r
1ae0: 65 64 75 63 65 20 6e 65 74 77 6f 72 6b 20 62 61  educe network ba
1af0: 6e 64 77 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 4e  ndwidth..**.** N
1b00: 6f 74 65 20 74 68 61 74 20 42 54 52 45 45 5f 48  ote that BTREE_H
1b10: 49 4e 54 5f 46 4c 41 47 53 20 77 69 74 68 20 42  INT_FLAGS with B
1b20: 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 69 73  TREE_BULKLOAD is
1b30: 20 74 68 65 20 6f 6e 6c 79 20 68 69 6e 74 20 75   the only hint u
1b40: 73 65 64 20 62 79 0a 2a 2a 20 73 74 61 6e 64 61  sed by.** standa
1b50: 72 64 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  rd SQLite.  The 
1b60: 6f 74 68 65 72 20 68 69 6e 74 73 20 61 72 65 20  other hints are 
1b70: 70 72 6f 76 69 64 65 64 20 66 6f 72 20 65 78 74  provided for ext
1b80: 65 6e 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65  entions that use
1b90: 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 70  .** the SQLite p
1ba0: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1bb0: 65 6e 65 72 61 74 6f 72 20 62 75 74 20 73 75 62  enerator but sub
1bc0: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
1bd0: 6e 20 73 74 6f 72 61 67 65 0a 2a 2a 20 65 6e 67  n storage.** eng
1be0: 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ine..*/.#define 
1bf0: 42 54 52 45 45 5f 48 49 4e 54 5f 52 41 4e 47 45  BTREE_HINT_RANGE
1c00: 20 30 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67   0       /* Rang
1c10: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  e constraints on
1c20: 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 2f 2a 0a   queries */../*.
1c30: 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d  ** Values that m
1c40: 61 79 20 62 65 20 4f 52 27 64 20 74 6f 67 65 74  ay be OR'd toget
1c50: 68 65 72 20 74 6f 20 66 6f 72 6d 20 74 68 65 20  her to form the 
1c60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
1c70: 2a 2a 20 42 54 52 45 45 5f 48 49 4e 54 5f 46 4c  ** BTREE_HINT_FL
1c80: 41 47 53 20 68 69 6e 74 20 66 6f 72 20 73 71 6c  AGS hint for sql
1c90: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
1ca0: 69 6e 74 28 29 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  int():.**.** The
1cb0: 20 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20   BTREE_BULKLOAD 
1cc0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 69  flag is set on i
1cd0: 6e 64 65 78 20 63 75 72 73 6f 72 73 20 77 68 65  ndex cursors whe
1ce0: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 67  n the index is g
1cf0: 6f 69 6e 67 0a 2a 2a 20 74 6f 20 62 65 20 66 69  oing.** to be fi
1d00: 6c 6c 65 64 20 77 69 74 68 20 63 6f 6e 74 65 6e  lled with conten
1d10: 74 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  t that is alread
1d20: 79 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  y in sorted orde
1d30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  r..**.** The BTR
1d40: 45 45 5f 53 45 45 4b 5f 45 51 20 66 6c 61 67 20  EE_SEEK_EQ flag 
1d50: 69 73 20 73 65 74 20 6f 6e 20 63 75 72 73 6f 72  is set on cursor
1d60: 73 20 74 68 61 74 20 77 69 6c 6c 20 67 65 74 20  s that will get 
1d70: 4f 50 5f 53 65 65 6b 47 45 20 6f 72 0a 2a 2a 20  OP_SeekGE or.** 
1d80: 4f 50 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65  OP_SeekLE opcode
1d90: 73 20 66 6f 72 20 61 20 72 61 6e 67 65 20 73 65  s for a range se
1da0: 61 72 63 68 2c 20 62 75 74 20 77 68 65 72 65 20  arch, but where 
1db0: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 65 6e 74  the range of ent
1dc0: 72 69 65 73 0a 2a 2a 20 73 65 6c 65 63 74 65 64  ries.** selected
1dd0: 20 77 69 6c 6c 20 61 6c 6c 20 68 61 76 65 20 74   will all have t
1de0: 68 65 20 73 61 6d 65 20 6b 65 79 2e 20 20 49 6e  he same key.  In
1df0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1e00: 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 0a 2a 2a  e cursor will.**
1e10: 20 62 65 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f   be used only fo
1e20: 72 20 65 71 75 61 6c 69 74 79 20 6b 65 79 20 73  r equality key s
1e30: 65 61 72 63 68 65 73 2e 0a 2a 2a 0a 2a 2f 0a 23  earches..**.*/.#
1e40: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 42 55 4c  define BTREE_BUL
1e50: 4b 4c 4f 41 44 20 30 78 30 30 30 30 30 30 30 31  KLOAD 0x00000001
1e60: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 66 75 6c    /* Used to ful
1e70: 6c 20 69 6e 64 65 78 20 69 6e 20 73 6f 72 74 65  l index in sorte
1e80: 64 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69  d order */.#defi
1e90: 6e 65 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51  ne BTREE_SEEK_EQ
1ea0: 20 20 30 78 30 30 30 30 30 30 30 32 20 20 2f 2a    0x00000002  /*
1eb0: 20 45 51 20 73 65 65 6b 73 20 6f 6e 6c 79 20 2d   EQ seeks only -
1ec0: 20 6e 6f 20 72 61 6e 67 65 20 73 65 65 6b 73 20   no range seeks 
1ed0: 2a 2f 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 61 67 73  */../* .** Flags
1ee0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
1ef0: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
1f00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1f10: 73 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  sor()..**.** For
1f20: 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1f30: 72 73 20 74 68 65 20 77 72 46 6c 61 67 20 61 72  rs the wrFlag ar
1f40: 67 75 6d 65 6e 74 20 69 73 20 61 6c 77 61 79 73  gument is always
1f50: 20 7a 65 72 6f 2e 20 46 6f 72 20 72 65 61 64 2d   zero. For read-
1f60: 77 72 69 74 65 0a 2a 2a 20 63 75 72 73 6f 72 73  write.** cursors
1f70: 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
1f80: 6f 20 65 69 74 68 65 72 20 28 42 54 52 45 45 5f  o either (BTREE_
1f90: 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
1fa0: 45 4c 45 54 45 29 20 6f 72 20 6a 75 73 74 0a 2a  ELETE) or just.*
1fb0: 2a 20 28 42 54 52 45 45 5f 57 52 43 53 52 29 2e  * (BTREE_WRCSR).
1fc0: 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 46 4f   If the BTREE_FO
1fd0: 52 44 45 4c 45 54 45 20 62 69 74 20 69 73 20 73  RDELETE bit is s
1fe0: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
1ff0: 73 6f 72 20 77 69 6c 6c 0a 2a 2a 20 6f 6e 6c 79  sor will.** only
2000: 20 62 65 20 75 73 65 64 20 62 79 20 53 51 4c 69   be used by SQLi
2010: 74 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f  te for the follo
2020: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  wing:.**.**   * 
2030: 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 74  to seek to and t
2040: 68 65 6e 20 64 65 6c 65 74 65 20 73 70 65 63 69  hen delete speci
2050: 66 69 63 20 65 6e 74 72 69 65 73 2c 20 61 6e 64  fic entries, and
2060: 2f 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 6f  /or.**.**   * to
2070: 20 72 65 61 64 20 76 61 6c 75 65 73 20 74 68 61   read values tha
2080: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
2090: 6f 20 63 72 65 61 74 65 20 6b 65 79 73 20 74 68  o create keys th
20a0: 61 74 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  at other.**     
20b0: 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20  BTREE_FORDELETE 
20c0: 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 73 65 65  cursors will see
20d0: 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 2e  k to and delete.
20e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45  .**.** The BTREE
20f0: 5f 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20  _FORDELETE flag 
2100: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2110: 6f 6e 20 68 69 6e 74 2e 20 20 49 74 20 69 73 20  on hint.  It is 
2120: 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 62  not used by.** b
2130: 79 20 74 68 69 73 2c 20 74 68 65 20 6e 61 74 69  y this, the nati
2140: 76 65 20 62 2d 74 72 65 65 20 65 6e 67 69 6e 65  ve b-tree engine
2150: 20 6f 66 20 53 51 4c 69 74 65 2c 20 62 75 74 20   of SQLite, but 
2160: 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  it is available 
2170: 74 6f 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76  to.** alternativ
2180: 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  e storage engine
2190: 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  s that might be 
21a0: 73 75 62 73 74 69 74 75 74 65 64 20 69 6e 20 70  substituted in p
21b0: 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
21c0: 62 2d 74 72 65 65 20 73 79 73 74 65 6d 2e 20 20  b-tree system.  
21d0: 46 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  For alternative 
21e0: 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 73 20  storage engines 
21f0: 69 6e 20 77 68 69 63 68 20 61 20 64 65 6c 65 74  in which a delet
2200: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 69 6e  e of.** the main
2210: 20 74 61 62 6c 65 20 72 6f 77 20 61 75 74 6f 6d   table row autom
2220: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 73  atically deletes
2230: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
2240: 6e 64 65 78 20 72 6f 77 73 2c 0a 2a 2a 20 74 68  ndex rows,.** th
2250: 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67  e FORDELETE flag
2260: 20 68 69 6e 74 20 61 6c 6c 6f 77 73 20 74 68 6f   hint allows tho
2270: 73 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  se alternative s
2280: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 73 20 74  torage engines t
2290: 6f 0a 2a 2a 20 73 6b 69 70 20 61 20 6c 6f 74 20  o.** skip a lot 
22a0: 6f 66 20 77 6f 72 6b 2e 20 20 4e 61 6d 65 6c 79  of work.  Namely
22b0: 3a 20 20 46 4f 52 44 45 4c 45 54 45 20 63 75 72  :  FORDELETE cur
22c0: 73 6f 72 73 20 6d 61 79 20 74 72 65 61 74 20 61  sors may treat a
22d0: 6c 6c 20 53 45 45 4b 0a 2a 2a 20 61 6e 64 20 44  ll SEEK.** and D
22e0: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
22f0: 20 61 73 20 6e 6f 2d 6f 70 73 2c 20 61 6e 64 20   as no-ops, and 
2300: 61 6e 79 20 52 45 41 44 20 6f 70 65 72 61 74 69  any READ operati
2310: 6f 6e 20 61 67 61 69 6e 73 74 20 61 0a 2a 2a 20  on against a.** 
2320: 46 4f 52 44 45 4c 45 54 45 20 63 75 72 73 6f 72  FORDELETE cursor
2330: 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6e 75   may return a nu
2340: 6c 6c 20 72 6f 77 3a 20 30 78 30 31 20 30 78 30  ll row: 0x01 0x0
2350: 30 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54  0..*/.#define BT
2360: 52 45 45 5f 57 52 43 53 52 20 20 20 20 20 30 78  REE_WRCSR     0x
2370: 30 30 30 30 30 30 30 34 20 20 20 20 20 2f 2a 20  00000004     /* 
2380: 72 65 61 64 2d 77 72 69 74 65 20 63 75 72 73 6f  read-write curso
2390: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52  r */.#define BTR
23a0: 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 30 78 30  EE_FORDELETE 0x0
23b0: 30 30 30 30 30 30 38 20 20 20 20 20 2f 2a 20 43  0000008     /* C
23c0: 75 72 73 6f 72 20 69 73 20 66 6f 72 20 73 65 65  ursor is for see
23d0: 6b 2f 64 65 6c 65 74 65 20 6f 6e 6c 79 20 2a 2f  k/delete only */
23e0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ..int sqlite3Btr
23f0: 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
2400: 65 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e*,             
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 2f 2a 20 42 54 72 65 65 20 63 6f 6e 74 61 69   /* BTree contai
2430: 6e 69 6e 67 20 74 61 62 6c 65 20 74 6f 20 6f 70  ning table to op
2440: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  en */.  int iTab
2450: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2470: 49 6e 64 65 78 20 6f 66 20 72 6f 6f 74 20 70 61  Index of root pa
2480: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  ge */.  int wrFl
2490: 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b0: 31 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 20  1 for writing.  
24c0: 30 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  0 for read-only 
24d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
24e0: 6e 66 6f 2a 2c 20 20 20 20 20 20 20 20 20 20 20  nfo*,           
24f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2500: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 63  st argument to c
2510: 6f 6d 70 61 72 65 20 66 75 6e 63 74 69 6f 6e 20  ompare function 
2520: 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
2530: 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20  Cursor          
2540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
2550: 63 65 20 74 6f 20 77 72 69 74 65 20 63 75 72 73  ce to write curs
2560: 6f 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  or structure */.
2570: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  );.int sqlite3Bt
2580: 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
2590: 69 64 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  id);.void sqlite
25a0: 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
25b0: 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a 76 6f 69  (BtCursor*);.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 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
25e0: 43 75 72 73 6f 72 2a 2c 20 75 6e 73 69 67 6e 65  Cursor*, unsigne
25f0: 64 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d);.#ifdef SQLIT
2600: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
2610: 48 49 4e 54 53 0a 76 6f 69 64 20 73 71 6c 69 74  HINTS.void sqlit
2620: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
2630: 74 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74  t(BtCursor*, int
2640: 2c 20 2e 2e 2e 29 3b 0a 23 65 6e 64 69 66 0a 0a  , ...);.#endif..
2650: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2660: 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
2670: 72 73 6f 72 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  rsor*);.int sqli
2680: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2690: 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
26a0: 6f 72 2a 2c 0a 20 20 55 6e 70 61 63 6b 65 64 52  or*,.  UnpackedR
26b0: 65 63 6f 72 64 20 2a 70 55 6e 4b 65 79 2c 0a 20  ecord *pUnKey,. 
26c0: 20 69 36 34 20 69 6e 74 4b 65 79 2c 0a 20 20 69   i64 intKey,.  i
26d0: 6e 74 20 62 69 61 73 2c 0a 20 20 69 6e 74 20 2a  nt bias,.  int *
26e0: 70 52 65 73 0a 29 3b 0a 69 6e 74 20 73 71 6c 69  pRes.);.int sqli
26f0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
2700: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 2a  sMoved(BtCursor*
2710: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  );.int sqlite3Bt
2720: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
2730: 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 2a  (BtCursor*, int*
2740: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  );.int sqlite3Bt
2750: 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2760: 6f 72 2a 2c 20 75 38 20 66 6c 61 67 73 29 3b 0a  or*, u8 flags);.
2770: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61 67  ./* Allowed flag
2780: 73 20 66 6f 72 20 74 68 65 20 32 6e 64 20 61 72  s for the 2nd ar
2790: 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
27a0: 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 2a  3BtreeDelete() *
27b0: 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f  /.#define BTREE_
27c0: 53 41 56 45 50 4f 53 49 54 49 4f 4e 20 30 78 30  SAVEPOSITION 0x0
27d0: 32 20 20 2f 2a 20 4c 65 61 76 65 20 63 75 72 73  2  /* Leave curs
27e0: 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 4e  or pointing at N
27f0: 45 58 54 20 6f 72 20 50 52 45 56 20 2a 2f 0a 23  EXT or PREV */.#
2800: 64 65 66 69 6e 65 20 42 54 52 45 45 5f 41 55 58  define BTREE_AUX
2810: 44 45 4c 45 54 45 20 20 20 20 30 78 30 34 20 20  DELETE    0x04  
2820: 2f 2a 20 6e 6f 74 20 74 68 65 20 70 72 69 6d 61  /* not the prima
2830: 72 79 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74  ry delete operat
2840: 69 6f 6e 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e  ion */../* An in
2850: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 42 74  stance of the Bt
2860: 72 65 65 50 61 79 6c 6f 61 64 20 6f 62 6a 65 63  reePayload objec
2870: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
2880: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
2890: 67 6c 65 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  gle.** entry in 
28a0: 65 69 74 68 65 72 20 61 6e 20 69 6e 64 65 78 20  either an index 
28b0: 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a  or table btree..
28c0: 2a 2a 0a 2a 2a 20 49 6e 64 65 78 20 62 74 72 65  **.** Index btre
28d0: 65 73 20 28 75 73 65 64 20 66 6f 72 20 69 6e 64  es (used for ind
28e0: 65 78 65 73 20 61 6e 64 20 61 6c 73 6f 20 57 49  exes and also WI
28f0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
2900: 65 73 29 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  es) contain.** a
2910: 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65 79 20  n arbitrary key 
2920: 61 6e 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68  and no data.  Th
2930: 65 73 65 20 62 74 72 65 65 73 20 68 61 76 65 20  ese btrees have 
2940: 70 4b 65 79 2c 6e 4b 65 79 20 73 65 74 20 74 6f  pKey,nKey set to
2950: 20 74 68 65 69 72 0a 2a 2a 20 6b 65 79 20 61 6e   their.** key an
2960: 64 20 70 44 61 74 61 2c 6e 44 61 74 61 2c 6e 5a  d pData,nData,nZ
2970: 65 72 6f 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ero set to zero.
2980: 0a 2a 2a 0a 2a 2a 20 54 61 62 6c 65 20 62 74 72  .**.** Table btr
2990: 65 65 73 20 28 75 73 65 64 20 66 6f 72 20 72 6f  ees (used for ro
29a0: 77 69 64 20 74 61 62 6c 65 73 29 20 63 6f 6e 74  wid tables) cont
29b0: 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  ain an integer r
29c0: 6f 77 69 64 20 75 73 65 64 20 61 73 0a 2a 2a 20  owid used as.** 
29d0: 74 68 65 20 6b 65 79 20 61 6e 64 20 70 61 73 73  the key and pass
29e0: 65 64 20 69 6e 20 74 68 65 20 6e 4b 65 79 20 66  ed in the nKey f
29f0: 69 65 6c 64 2e 20 20 54 68 65 20 70 4b 65 79 20  ield.  The pKey 
2a00: 66 69 65 6c 64 20 69 73 20 7a 65 72 6f 2e 20 20  field is zero.  
2a10: 0a 2a 2a 20 70 44 61 74 61 2c 6e 44 61 74 61 20  .** pData,nData 
2a20: 68 6f 6c 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  hold the content
2a30: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
2a40: 79 2e 20 20 6e 5a 65 72 6f 20 65 78 74 72 61 20  y.  nZero extra 
2a50: 7a 65 72 6f 20 62 79 74 65 73 0a 2a 2a 20 61 72  zero bytes.** ar
2a60: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
2a70: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6e  e end of the con
2a80: 74 65 6e 74 20 77 68 65 6e 20 63 6f 6e 73 74 72  tent when constr
2a90: 75 63 74 69 6e 67 20 74 68 65 20 65 6e 74 72 79  ucting the entry
2aa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a  ..**.** This obj
2ab0: 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 70  ect is used to p
2ac0: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
2ad0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
2ae0: 65 49 6e 73 65 72 74 28 29 2e 20 20 54 68 65 0a  eInsert().  The.
2af0: 2a 2a 20 73 61 6d 65 20 69 6e 66 6f 72 6d 61 74  ** same informat
2b00: 69 6f 6e 20 75 73 65 64 20 74 6f 20 62 65 20 70  ion used to be p
2b10: 61 73 73 65 64 20 61 73 20 66 69 76 65 20 73 65  assed as five se
2b20: 70 61 72 61 74 65 20 70 61 72 61 6d 65 74 65 72  parate parameter
2b30: 73 2e 20 20 42 75 74 20 70 6c 61 63 69 6e 67 0a  s.  But placing.
2b40: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
2b50: 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 6f 62 6a  on into this obj
2b60: 65 63 74 20 68 65 6c 70 73 20 74 6f 20 6b 65 65  ect helps to kee
2b70: 70 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20  p the interface 
2b80: 6d 6f 72 65 20 0a 2a 2a 20 6f 72 67 61 6e 69 7a  more .** organiz
2b90: 65 64 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e  ed and understan
2ba0: 64 61 62 6c 65 2c 20 61 6e 64 20 69 74 20 61 6c  dable, and it al
2bb0: 73 6f 20 68 65 6c 70 73 20 74 68 65 20 72 65 73  so helps the res
2bc0: 75 6c 74 69 6e 67 20 63 6f 64 65 20 74 6f 0a 2a  ulting code to.*
2bd0: 2a 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 66  * run a little f
2be0: 61 73 74 65 72 20 62 79 20 75 73 69 6e 67 20 66  aster by using f
2bf0: 65 77 65 72 20 72 65 67 69 73 74 65 72 73 20 66  ewer registers f
2c00: 6f 72 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  or parameter pas
2c10: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  sing..*/.struct 
2c20: 42 74 72 65 65 50 61 79 6c 6f 61 64 20 7b 0a 20  BtreePayload {. 
2c30: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
2c40: 79 3b 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20  y;       /* Key 
2c50: 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 65  content for inde
2c60: 78 65 73 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  xes.  NULL for t
2c70: 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ables */.  sqlit
2c80: 65 33 5f 69 6e 74 36 34 20 6e 4b 65 79 3b 20 20  e3_int64 nKey;  
2c90: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b     /* Size of pK
2ca0: 65 79 20 66 6f 72 20 69 6e 64 65 78 65 73 2e 20  ey for indexes. 
2cb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
2cc0: 20 74 61 62 73 20 2a 2f 0a 20 20 63 6f 6e 73 74   tabs */.  const
2cd0: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20 20 20   void *pData;   
2ce0: 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
2cf0: 61 62 6c 65 73 2e 20 20 4e 55 4c 4c 20 66 6f 72  ables.  NULL for
2d00: 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e   indexes */.  in
2d10: 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  t nData;        
2d20: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2d30: 20 70 44 61 74 61 2e 20 20 30 20 69 66 20 6e 6f   pData.  0 if no
2d40: 6e 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ne. */.  int nZe
2d50: 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ro;             
2d60: 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 64   /* Extra zero d
2d70: 61 74 61 20 61 70 70 65 6e 64 65 64 20 61 66 74  ata appended aft
2d80: 65 72 20 70 44 61 74 61 2c 6e 44 61 74 61 20 2a  er pData,nData *
2d90: 2f 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65  /.};..int sqlite
2da0: 33 42 74 72 65 65 49 6e 73 65 72 74 28 42 74 43  3BtreeInsert(BtC
2db0: 75 72 73 6f 72 2a 2c 20 63 6f 6e 73 74 20 42 74  ursor*, const Bt
2dc0: 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 50 61 79  reePayload *pPay
2dd0: 6c 6f 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20  load,.          
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2df0: 20 62 69 61 73 2c 20 69 6e 74 20 73 65 65 6b 52   bias, int seekR
2e00: 65 73 75 6c 74 29 3b 0a 69 6e 74 20 73 71 6c 69  esult);.int sqli
2e10: 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
2e20: 43 75 72 73 6f 72 2a 2c 20 69 6e 74 20 2a 70 52  Cursor*, int *pR
2e30: 65 73 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  es);.int sqlite3
2e40: 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
2e50: 6f 72 2a 2c 20 69 6e 74 20 2a 70 52 65 73 29 3b  or*, int *pRes);
2e60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e70: 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 2a 2c  eNext(BtCursor*,
2e80: 20 69 6e 74 20 2a 70 52 65 73 29 3b 0a 69 6e 74   int *pRes);.int
2e90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
2ea0: 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a 69 6e 74  (BtCursor*);.int
2eb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2ec0: 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 2a 2c  vious(BtCursor*,
2ed0: 20 69 6e 74 20 2a 70 52 65 73 29 3b 0a 69 36 34   int *pRes);.i64
2ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
2ef0: 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72  egerKey(BtCursor
2f00: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  *);.int sqlite3B
2f10: 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
2f20: 2a 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  *, u32 offset, u
2f30: 33 32 20 61 6d 74 2c 20 76 6f 69 64 2a 29 3b 0a  32 amt, void*);.
2f40: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
2f50: 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
2f60: 65 74 63 68 28 42 74 43 75 72 73 6f 72 2a 2c 20  etch(BtCursor*, 
2f70: 75 33 32 20 2a 70 41 6d 74 29 3b 0a 75 33 32 20  u32 *pAmt);.u32 
2f80: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2f90: 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72  oadSize(BtCursor
2fa0: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  *);.int sqlite3B
2fb0: 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
2fc0: 72 2a 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  r*, u32 offset, 
2fd0: 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 2a 29 3b  u32 amt, void*);
2fe0: 0a 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  ..char *sqlite3B
2ff0: 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65  treeIntegrityChe
3000: 63 6b 28 42 74 72 65 65 2a 2c 20 69 6e 74 20 2a  ck(Btree*, int *
3010: 61 52 6f 6f 74 2c 20 69 6e 74 20 6e 52 6f 6f 74  aRoot, int nRoot
3020: 2c 20 69 6e 74 2c 20 69 6e 74 2a 29 3b 0a 73 74  , int, int*);.st
3030: 72 75 63 74 20 50 61 67 65 72 20 2a 73 71 6c 69  ruct Pager *sqli
3040: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
3050: 72 65 65 2a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69  ree*);..int sqli
3060: 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61 28  te3BtreePutData(
3070: 42 74 43 75 72 73 6f 72 2a 2c 20 75 33 32 20 6f  BtCursor*, u32 o
3080: 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
3090: 76 6f 69 64 2a 29 3b 0a 76 6f 69 64 20 73 71 6c  void*);.void sql
30a0: 69 74 65 33 42 74 72 65 65 49 6e 63 72 62 6c 6f  ite3BtreeIncrblo
30b0: 62 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  bCursor(BtCursor
30c0: 20 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65   *);.void sqlite
30d0: 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
30e0: 72 28 42 74 43 75 72 73 6f 72 20 2a 29 3b 0a 69  r(BtCursor *);.i
30f0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
3100: 65 74 56 65 72 73 69 6f 6e 28 42 74 72 65 65 20  etVersion(Btree 
3110: 2a 70 42 74 2c 20 69 6e 74 20 69 56 65 72 73 69  *pBt, int iVersi
3120: 6f 6e 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  on);.int sqlite3
3130: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69  BtreeCursorHasHi
3140: 6e 74 28 42 74 43 75 72 73 6f 72 2a 2c 20 75 6e  nt(BtCursor*, un
3150: 73 69 67 6e 65 64 20 69 6e 74 20 6d 61 73 6b 29  signed int mask)
3160: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ;.int sqlite3Btr
3170: 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 42 74 72  eeIsReadonly(Btr
3180: 65 65 20 2a 70 42 74 29 3b 0a 69 6e 74 20 73 71  ee *pBt);.int sq
3190: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42  lite3HeaderSizeB
31a0: 74 72 65 65 28 76 6f 69 64 29 3b 0a 0a 23 69 66  tree(void);..#if
31b0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
31c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
31d0: 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
31e0: 6f 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  or*);.#endif..#i
31f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3200: 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 69 6e 74  T_BTREECOUNT.int
3210: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 75   sqlite3BtreeCou
3220: 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 2c 20 69  nt(BtCursor *, i
3230: 36 34 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  64 *);.#endif..#
3240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3250: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  T.int sqlite3Btr
3260: 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 42 74 43  eeCursorInfo(BtC
3270: 75 72 73 6f 72 2a 2c 20 69 6e 74 2a 2c 20 69 6e  ursor*, int*, in
3280: 74 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  t);.void sqlite3
3290: 42 74 72 65 65 43 75 72 73 6f 72 4c 69 73 74 28  BtreeCursorList(
32a0: 42 74 72 65 65 2a 29 3b 0a 23 65 6e 64 69 66 0a  Btree*);.#endif.
32b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 6e 74 20 73  OMIT_WAL.  int s
32d0: 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
32e0: 70 6f 69 6e 74 28 42 74 72 65 65 2a 2c 20 69 6e  point(Btree*, in
32f0: 74 2c 20 69 6e 74 20 2a 2c 20 69 6e 74 20 2a 29  t, int *, int *)
3300: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
3310: 49 66 20 77 65 20 61 72 65 20 6e 6f 74 20 75 73  If we are not us
3320: 69 6e 67 20 73 68 61 72 65 64 20 63 61 63 68 65  ing shared cache
3330: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
3340: 6e 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 75 73  no need to.** us
3350: 65 20 6d 75 74 65 78 65 73 20 74 6f 20 61 63 63  e mutexes to acc
3360: 65 73 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ess the BtShared
3370: 20 73 74 72 75 63 74 75 72 65 73 2e 20 20 53 6f   structures.  So
3380: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 45 6e 74   make the.** Ent
3390: 65 72 20 61 6e 64 20 4c 65 61 76 65 20 70 72 6f  er and Leave pro
33a0: 63 65 64 75 72 65 73 20 6e 6f 2d 6f 70 73 2e 0a  cedures no-ops..
33b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
33c0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
33d0: 43 48 45 0a 20 20 76 6f 69 64 20 73 71 6c 69 74  CHE.  void sqlit
33e0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 42 74 72  e3BtreeEnter(Btr
33f0: 65 65 2a 29 3b 0a 20 20 76 6f 69 64 20 73 71 6c  ee*);.  void sql
3400: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
3410: 6c 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 69  l(sqlite3*);.  i
3420: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
3430: 68 61 72 61 62 6c 65 28 42 74 72 65 65 2a 29 3b  harable(Btree*);
3440: 0a 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42  .  void sqlite3B
3450: 74 72 65 65 45 6e 74 65 72 43 75 72 73 6f 72 28  treeEnterCursor(
3460: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 20 20 69 6e  BtCursor*);.  in
3470: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
3480: 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 42 74  nnectionCount(Bt
3490: 72 65 65 2a 29 3b 0a 23 65 6c 73 65 0a 23 20 64  ree*);.#else.# d
34a0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72  efine sqlite3Btr
34b0: 65 65 45 6e 74 65 72 28 58 29 20 0a 23 20 64 65  eeEnter(X) .# de
34c0: 66 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72 65  fine sqlite3Btre
34d0: 65 45 6e 74 65 72 41 6c 6c 28 58 29 0a 23 20 64  eEnterAll(X).# d
34e0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72  efine sqlite3Btr
34f0: 65 65 53 68 61 72 61 62 6c 65 28 58 29 20 30 0a  eeSharable(X) 0.
3500: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  # define sqlite3
3510: 42 74 72 65 65 45 6e 74 65 72 43 75 72 73 6f 72  BtreeEnterCursor
3520: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  (X).# define sql
3530: 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74  ite3BtreeConnect
3540: 69 6f 6e 43 6f 75 6e 74 28 58 29 20 31 0a 23 65  ionCount(X) 1.#e
3550: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
3560: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
3570: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
3580: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3590: 45 0a 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33  E.  void sqlite3
35a0: 42 74 72 65 65 4c 65 61 76 65 28 42 74 72 65 65  BtreeLeave(Btree
35b0: 2a 29 3b 0a 20 20 76 6f 69 64 20 73 71 6c 69 74  *);.  void sqlit
35c0: 65 33 42 74 72 65 65 4c 65 61 76 65 43 75 72 73  e3BtreeLeaveCurs
35d0: 6f 72 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a 20  or(BtCursor*);. 
35e0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72   void sqlite3Btr
35f0: 65 65 4c 65 61 76 65 41 6c 6c 28 73 71 6c 69 74  eeLeaveAll(sqlit
3600: 65 33 2a 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  e3*);.#ifndef ND
3610: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 73 65 20  EBUG.  /* These 
3620: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
3630: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
3640: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c  ) statements onl
3650: 79 2e 20 2a 2f 0a 20 20 69 6e 74 20 73 71 6c 69  y. */.  int sqli
3660: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3670: 65 78 28 42 74 72 65 65 2a 29 3b 0a 20 20 69 6e  ex(Btree*);.  in
3680: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  t sqlite3BtreeHo
3690: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 73 71  ldsAllMutexes(sq
36a0: 6c 69 74 65 33 2a 29 3b 0a 20 20 69 6e 74 20 73  lite3*);.  int s
36b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
36c0: 78 48 65 6c 64 28 73 71 6c 69 74 65 33 2a 2c 69  xHeld(sqlite3*,i
36d0: 6e 74 2c 53 63 68 65 6d 61 2a 29 3b 0a 23 65 6e  nt,Schema*);.#en
36e0: 64 69 66 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66  dif.#else..# def
36f0: 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ine sqlite3Btree
3700: 4c 65 61 76 65 28 58 29 0a 23 20 64 65 66 69 6e  Leave(X).# defin
3710: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65  e sqlite3BtreeLe
3720: 61 76 65 43 75 72 73 6f 72 28 58 29 0a 23 20 64  aveCursor(X).# d
3730: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72  efine sqlite3Btr
3740: 65 65 4c 65 61 76 65 41 6c 6c 28 58 29 0a 0a 23  eeLeaveAll(X)..#
3750: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42   define sqlite3B
3760: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 58  treeHoldsMutex(X
3770: 29 20 31 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  ) 1.# define sql
3780: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
3790: 6c 4d 75 74 65 78 65 73 28 58 29 20 31 0a 23 20  lMutexes(X) 1.# 
37a0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 53 63  define sqlite3Sc
37b0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 58 2c  hemaMutexHeld(X,
37c0: 59 2c 5a 29 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  Y,Z) 1.#endif...
37d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
37e0: 5f 42 54 52 45 45 5f 48 20 2a 2f 0a              _BTREE_H */.