/ Hex Artifact Content
Login

Artifact ab639c4b9b210b8f4cd7a3a922af73df9a3f27c1d124267339fd73ef8619f488:


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 2c 69 6e 74 2a 29 3b 0a 69 6e  e*,int,int*);.in
0b50: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
0b60: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
0b70: 65 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ee*, const char 
0b80: 2a 7a 4d 61 73 74 65 72 29 3b 0a 69 6e 74 20 73  *zMaster);.int s
0b90: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
0ba0: 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 2a  tPhaseTwo(Btree*
0bb0: 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c 69  , int);.int sqli
0bc0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
0bd0: 74 72 65 65 2a 29 3b 0a 69 6e 74 20 73 71 6c 69  tree*);.int sqli
0be0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
0bf0: 28 42 74 72 65 65 2a 2c 69 6e 74 2c 69 6e 74 29  (Btree*,int,int)
0c00: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ;.int sqlite3Btr
0c10: 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
0c20: 65 2a 2c 69 6e 74 29 3b 0a 69 6e 74 20 73 71 6c  e*,int);.int sql
0c30: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
0c40: 61 62 6c 65 28 42 74 72 65 65 2a 2c 20 69 6e 74  able(Btree*, int
0c50: 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 69  *, int flags);.i
0c60: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
0c70: 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 2a 29  sInTrans(Btree*)
0c80: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ;.int sqlite3Btr
0c90: 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
0ca0: 42 74 72 65 65 2a 29 3b 0a 69 6e 74 20 73 71 6c  Btree*);.int sql
0cb0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
0cc0: 6b 75 70 28 42 74 72 65 65 2a 29 3b 0a 76 6f 69  kup(Btree*);.voi
0cd0: 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53  d *sqlite3BtreeS
0ce0: 63 68 65 6d 61 28 42 74 72 65 65 20 2a 2c 20 69  chema(Btree *, i
0cf0: 6e 74 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64  nt, void(*)(void
0d00: 20 2a 29 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65   *));.int sqlite
0d10: 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
0d20: 65 64 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ed(Btree *pBtree
0d30: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
0d40: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0d50: 43 48 45 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  CHE.int sqlite3B
0d60: 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74  treeLockTable(Bt
0d70: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
0d80: 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74   iTab, u8 isWrit
0d90: 65 4c 6f 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 69  eLock);.#endif.i
0da0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
0db0: 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
0dc0: 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a 63 6f  , int, int);..co
0dd0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0de0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
0df0: 65 28 42 74 72 65 65 20 2a 29 3b 0a 63 6f 6e 73  e(Btree *);.cons
0e00: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
0e10: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
0e20: 6d 65 28 42 74 72 65 65 20 2a 29 3b 0a 69 6e 74  me(Btree *);.int
0e30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70   sqlite3BtreeCop
0e40: 79 46 69 6c 65 28 42 74 72 65 65 20 2a 2c 20 42  yFile(Btree *, B
0e50: 74 72 65 65 20 2a 29 3b 0a 0a 69 6e 74 20 73 71  tree *);..int sq
0e60: 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
0e70: 63 75 75 6d 28 42 74 72 65 65 20 2a 29 3b 0a 0a  cuum(Btree *);..
0e80: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  /* The flags par
0e90: 61 6d 65 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ameter to sqlite
0ea0: 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
0eb0: 65 20 63 61 6e 20 62 65 20 74 68 65 20 62 69 74  e can be the bit
0ec0: 77 69 73 65 20 4f 52 0a 2a 2a 20 6f 66 20 74 68  wise OR.** of th
0ed0: 65 20 66 6c 61 67 73 20 73 68 6f 77 6e 20 62 65  e flags shown be
0ee0: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  low..**.** Every
0ef0: 20 53 51 4c 69 74 65 20 74 61 62 6c 65 20 6d 75   SQLite table mu
0f00: 73 74 20 68 61 76 65 20 65 69 74 68 65 72 20 42  st have either B
0f10: 54 52 45 45 5f 49 4e 54 4b 45 59 20 6f 72 20 42  TREE_INTKEY or B
0f20: 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 73 65 74  TREE_BLOBKEY set
0f30: 2e 0a 2a 2a 20 57 69 74 68 20 42 54 52 45 45 5f  ..** With BTREE_
0f40: 49 4e 54 4b 45 59 2c 20 74 68 65 20 74 61 62 6c  INTKEY, the tabl
0f50: 65 20 6b 65 79 20 69 73 20 61 20 36 34 2d 62 69  e key is a 64-bi
0f60: 74 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 72  t integer and ar
0f70: 62 69 74 72 61 72 79 20 64 61 74 61 0a 2a 2a 20  bitrary data.** 
0f80: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
0f90: 20 6c 65 61 76 65 73 2e 20 20 28 42 54 52 45 45   leaves.  (BTREE
0fa0: 5f 49 4e 54 4b 45 59 20 69 73 20 75 73 65 64 20  _INTKEY is used 
0fb0: 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 2e 29  for SQL tables.)
0fc0: 20 20 57 69 74 68 0a 2a 2a 20 42 54 52 45 45 5f    With.** BTREE_
0fd0: 42 4c 4f 42 4b 45 59 2c 20 74 68 65 20 6b 65 79  BLOBKEY, the key
0fe0: 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
0ff0: 20 42 4c 4f 42 20 61 6e 64 20 6e 6f 20 63 6f 6e   BLOB and no con
1000: 74 65 6e 74 20 69 73 20 73 74 6f 72 65 64 0a 2a  tent is stored.*
1010: 2a 20 61 6e 79 77 68 65 72 65 20 2d 20 74 68 65  * anywhere - the
1020: 20 6b 65 79 20 69 73 20 74 68 65 20 63 6f 6e 74   key is the cont
1030: 65 6e 74 2e 20 20 28 42 54 52 45 45 5f 42 4c 4f  ent.  (BTREE_BLO
1040: 42 4b 45 59 20 69 73 20 75 73 65 64 20 66 6f 72  BKEY is used for
1050: 20 53 51 4c 0a 2a 2a 20 69 6e 64 69 63 65 73 2e   SQL.** indices.
1060: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52  ).*/.#define BTR
1070: 45 45 5f 49 4e 54 4b 45 59 20 20 20 20 20 31 20  EE_INTKEY     1 
1080: 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 61 73 20     /* Table has 
1090: 6f 6e 6c 79 20 36 34 2d 62 69 74 20 73 69 67 6e  only 64-bit sign
10a0: 65 64 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  ed integer keys 
10b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45  */.#define BTREE
10c0: 5f 42 4c 4f 42 4b 45 59 20 20 20 20 32 20 20 20  _BLOBKEY    2   
10d0: 20 2f 2a 20 54 61 62 6c 65 20 68 61 73 20 6b 65   /* Table has ke
10e0: 79 73 20 6f 6e 6c 79 20 2d 20 6e 6f 20 64 61 74  ys only - no dat
10f0: 61 20 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65  a */..int sqlite
1100: 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
1110: 42 74 72 65 65 2a 2c 20 69 6e 74 2c 20 69 6e 74  Btree*, int, int
1120: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  *);.int sqlite3B
1130: 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42  treeClearTable(B
1140: 74 72 65 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 2a  tree*, int, int*
1150: 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  );.int sqlite3Bt
1160: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 4f 66 43  reeClearTableOfC
1170: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 2a 29  ursor(BtCursor*)
1180: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ;.int sqlite3Btr
1190: 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
11a0: 28 42 74 72 65 65 2a 2c 20 69 6e 74 2c 20 69 6e  (Btree*, int, in
11b0: 74 29 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  t);..void sqlite
11c0: 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74  3BtreeGetMeta(Bt
11d0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
11e0: 20 69 64 78 2c 20 75 33 32 20 2a 70 56 61 6c 75   idx, u32 *pValu
11f0: 65 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  e);.int sqlite3B
1200: 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 42  treeUpdateMeta(B
1210: 74 72 65 65 2a 2c 20 69 6e 74 20 69 64 78 2c 20  tree*, int idx, 
1220: 75 33 32 20 76 61 6c 75 65 29 3b 0a 0a 69 6e 74  u32 value);..int
1230: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
1240: 44 62 28 42 74 72 65 65 20 2a 70 29 3b 0a 0a 2f  Db(Btree *p);../
1250: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1260: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 73 71 6c  parameter to sql
1270: 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
1280: 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1290: 55 70 64 61 74 65 4d 65 74 61 0a 2a 2a 20 73 68  UpdateMeta.** sh
12a0: 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 20 74  ould be one of t
12b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
12c0: 75 65 73 2e 20 54 68 65 20 69 6e 74 65 67 65 72  ues. The integer
12d0: 20 76 61 6c 75 65 73 20 61 72 65 20 61 73 73 69   values are assi
12e0: 67 6e 65 64 20 0a 2a 2a 20 74 6f 20 63 6f 6e 73  gned .** to cons
12f0: 74 61 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tants so that th
1300: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
1310: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 66 69  corresponding fi
1320: 65 6c 64 20 69 6e 20 61 6e 0a 2a 2a 20 53 51 4c  eld in an.** SQL
1330: 69 74 65 20 64 61 74 61 62 61 73 65 20 68 65 61  ite database hea
1340: 64 65 72 20 6d 61 79 20 62 65 20 66 6f 75 6e 64  der may be found
1350: 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
1360: 77 69 6e 67 20 66 6f 72 6d 75 6c 61 3a 0a 2a 2a  wing formula:.**
1370: 0a 2a 2a 20 20 20 6f 66 66 73 65 74 20 3d 20 33  .**   offset = 3
1380: 36 20 2b 20 28 69 64 78 20 2a 20 34 29 0a 2a 2a  6 + (idx * 4).**
1390: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
13a0: 20 74 68 65 20 66 72 65 65 2d 70 61 67 65 2d 63   the free-page-c
13b0: 6f 75 6e 74 20 66 69 65 6c 64 20 69 73 20 6c 6f  ount field is lo
13c0: 63 61 74 65 64 20 61 74 20 62 79 74 65 20 6f 66  cated at byte of
13d0: 66 73 65 74 20 33 36 20 6f 66 0a 2a 2a 20 74 68  fset 36 of.** th
13e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13f0: 68 65 61 64 65 72 2e 20 54 68 65 20 69 6e 63 72  header. The incr
1400: 2d 76 61 63 75 75 6d 2d 66 6c 61 67 20 66 69 65  -vacuum-flag fie
1410: 6c 64 20 69 73 20 6c 6f 63 61 74 65 64 20 61 74  ld is located at
1420: 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
1430: 36 34 20 28 3d 3d 20 33 36 2b 34 2a 37 29 2e 0a  64 (== 36+4*7)..
1440: 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f  **.** The BTREE_
1450: 44 41 54 41 5f 56 45 52 53 49 4f 4e 20 76 61 6c  DATA_VERSION val
1460: 75 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ue is not really
1470: 20 61 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20   a value stored 
1480: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1490: 2a 20 49 74 20 69 73 20 61 20 72 65 61 64 2d 6f  * It is a read-o
14a0: 6e 6c 79 20 6e 75 6d 62 65 72 20 63 6f 6d 70 75  nly number compu
14b0: 74 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72  ted by the pager
14c0: 2e 20 20 42 75 74 20 77 65 20 6d 65 72 67 65 20  .  But we merge 
14d0: 69 74 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 68  it with.** the h
14e0: 65 61 64 65 72 20 76 61 6c 75 65 20 61 63 63 65  eader value acce
14f0: 73 73 20 72 6f 75 74 69 6e 65 73 20 73 69 6e 63  ss routines sinc
1500: 65 20 69 74 73 20 61 63 63 65 73 73 20 70 61 74  e its access pat
1510: 74 65 72 6e 20 69 73 20 74 68 65 20 73 61 6d 65  tern is the same
1520: 2e 0a 2a 2a 20 43 61 6c 6c 20 69 74 20 61 20 22  ..** Call it a "
1530: 76 69 72 74 75 61 6c 20 6d 65 74 61 20 76 61 6c  virtual meta val
1540: 75 65 22 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ue"..*/.#define 
1550: 42 54 52 45 45 5f 46 52 45 45 5f 50 41 47 45 5f  BTREE_FREE_PAGE_
1560: 43 4f 55 4e 54 20 20 20 20 20 30 0a 23 64 65 66  COUNT     0.#def
1570: 69 6e 65 20 42 54 52 45 45 5f 53 43 48 45 4d 41  ine BTREE_SCHEMA
1580: 5f 56 45 52 53 49 4f 4e 20 20 20 20 20 20 31 0a  _VERSION      1.
1590: 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 46 49  #define BTREE_FI
15a0: 4c 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 20  LE_FORMAT       
15b0: 20 20 32 0a 23 64 65 66 69 6e 65 20 42 54 52 45    2.#define BTRE
15c0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
15d0: 53 49 5a 45 20 20 33 0a 23 64 65 66 69 6e 65 20  SIZE  3.#define 
15e0: 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f  BTREE_LARGEST_RO
15f0: 4f 54 5f 50 41 47 45 20 20 20 34 0a 23 64 65 66  OT_PAGE   4.#def
1600: 69 6e 65 20 42 54 52 45 45 5f 54 45 58 54 5f 45  ine BTREE_TEXT_E
1610: 4e 43 4f 44 49 4e 47 20 20 20 20 20 20 20 35 0a  NCODING       5.
1620: 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 55 53  #define BTREE_US
1630: 45 52 5f 56 45 52 53 49 4f 4e 20 20 20 20 20 20  ER_VERSION      
1640: 20 20 36 0a 23 64 65 66 69 6e 65 20 42 54 52 45    6.#define BTRE
1650: 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 20 20 20  E_INCR_VACUUM   
1660: 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20        7.#define 
1670: 42 54 52 45 45 5f 41 50 50 4c 49 43 41 54 49 4f  BTREE_APPLICATIO
1680: 4e 5f 49 44 20 20 20 20 20 20 38 0a 23 64 65 66  N_ID      8.#def
1690: 69 6e 65 20 42 54 52 45 45 5f 44 41 54 41 5f 56  ine BTREE_DATA_V
16a0: 45 52 53 49 4f 4e 20 20 20 20 20 20 20 20 31 35  ERSION        15
16b0: 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 6d    /* A virtual m
16c0: 65 74 61 2d 76 61 6c 75 65 20 2a 2f 0a 0a 2f 2a  eta-value */../*
16d0: 0a 2a 2a 20 4b 69 6e 64 73 20 6f 66 20 68 69 6e  .** Kinds of hin
16e0: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  ts that can be p
16f0: 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 73  assed into the s
1700: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1710: 72 48 69 6e 74 28 29 0a 2a 2a 20 69 6e 74 65 72  rHint().** inter
1720: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 42 54 52 45  face..**.** BTRE
1730: 45 5f 48 49 4e 54 5f 52 41 4e 47 45 20 20 28 61  E_HINT_RANGE  (a
1740: 72 67 75 6d 65 6e 74 73 3a 20 45 78 70 72 2a 2c  rguments: Expr*,
1750: 20 4d 65 6d 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 20   Mem*).**.**    
1760: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1770: 65 6e 74 20 69 73 20 61 6e 20 45 78 70 72 2a 20  ent is an Expr* 
1780: 28 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e  (which is guaran
1790: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 74  teed to be const
17a0: 61 6e 74 20 66 6f 72 0a 2a 2a 20 20 20 20 20 74  ant for.**     t
17b0: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74  he lifetime of t
17c0: 68 65 20 63 75 72 73 6f 72 29 20 74 68 61 74 20  he cursor) that 
17d0: 64 65 66 69 6e 65 73 20 63 6f 6e 73 74 72 61 69  defines constrai
17e0: 6e 74 73 20 6f 6e 20 77 68 69 63 68 20 72 6f 77  nts on which row
17f0: 73 0a 2a 2a 20 20 20 20 20 6d 69 67 68 74 20 62  s.**     might b
1800: 65 20 66 65 74 63 68 65 64 20 77 69 74 68 20 74  e fetched with t
1810: 68 69 73 20 63 75 72 73 6f 72 2e 20 20 54 68 65  his cursor.  The
1820: 20 45 78 70 72 2a 20 74 72 65 65 20 6d 61 79 20   Expr* tree may 
1830: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 20 20 20 20 54  contain.**     T
1840: 4b 5f 52 45 47 49 53 54 45 52 20 6e 6f 64 65 73  K_REGISTER nodes
1850: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 76   that refer to v
1860: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
1870: 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67  the array of reg
1880: 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 70 61  isters.**     pa
1890: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
18a0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2e 20 20 49  nd parameter.  I
18b0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
18c0: 66 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 52 45  f Expr.op==TK_RE
18d0: 47 49 53 54 45 52 0a 2a 2a 20 20 20 20 20 74 68  GISTER.**     th
18e0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
18f0: 74 68 65 20 6e 6f 64 65 20 69 73 20 74 68 65 20  the node is the 
1900: 76 61 6c 75 65 20 69 6e 20 4d 65 6d 5b 70 45 78  value in Mem[pEx
1910: 70 72 2e 69 54 61 62 6c 65 5d 2e 20 20 41 6e 79  pr.iTable].  Any
1920: 0a 2a 2a 20 20 20 20 20 54 4b 5f 43 4f 4c 55 4d  .**     TK_COLUM
1930: 4e 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78  N node in the ex
1940: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
1950: 66 65 72 73 20 74 6f 20 74 68 65 20 45 78 70 72  fers to the Expr
1960: 2e 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 20  .iColumn-th.**  
1970: 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65     column of the
1980: 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65 20 63   b-tree of the c
1990: 75 72 73 6f 72 2e 20 20 54 68 65 20 45 78 70 72  ursor.  The Expr
19a0: 20 74 72 65 65 20 77 69 6c 6c 20 6e 6f 74 20 63   tree will not c
19b0: 6f 6e 74 61 69 6e 0a 2a 2a 20 20 20 20 20 61 6e  ontain.**     an
19c0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  y function calls
19d0: 20 6e 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   nor subqueries 
19e0: 6e 6f 72 20 72 65 66 65 72 65 6e 63 65 73 20 74  nor references t
19f0: 6f 20 62 2d 74 72 65 65 73 20 6f 74 68 65 72 20  o b-trees other 
1a00: 74 68 61 6e 0a 2a 2a 20 20 20 20 20 74 68 65 20  than.**     the 
1a10: 63 75 72 73 6f 72 20 62 65 69 6e 67 20 68 69 6e  cursor being hin
1a20: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54  ted..**.**     T
1a30: 68 65 20 64 65 73 69 67 6e 20 6f 66 20 74 68 65  he design of the
1a40: 20 5f 52 41 4e 47 45 20 68 69 6e 74 20 69 73 20   _RANGE hint is 
1a50: 61 69 64 20 62 2d 74 72 65 65 20 69 6d 70 6c 65  aid b-tree imple
1a60: 6d 65 6e 74 61 74 69 6f 6e 73 20 74 68 61 74 20  mentations that 
1a70: 74 72 79 0a 2a 2a 20 20 20 20 20 74 6f 20 70 72  try.**     to pr
1a80: 65 66 65 74 63 68 20 63 6f 6e 74 65 6e 74 20 66  efetch content f
1a90: 72 6f 6d 20 72 65 6d 6f 74 65 20 6d 61 63 68 69  rom remote machi
1aa0: 6e 65 73 20 2d 20 74 6f 20 70 72 6f 76 69 64 65  nes - to provide
1ab0: 20 74 68 6f 73 65 0a 2a 2a 20 20 20 20 20 69 6d   those.**     im
1ac0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 77 69  plementations wi
1ad0: 74 68 20 6c 69 6d 69 74 73 20 6f 6e 20 77 68 61  th limits on wha
1ae0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
1af0: 65 66 65 74 63 68 65 64 20 61 6e 64 20 74 68 65  efetched and the
1b00: 72 65 62 79 0a 2a 2a 20 20 20 20 20 72 65 64 75  reby.**     redu
1b10: 63 65 20 6e 65 74 77 6f 72 6b 20 62 61 6e 64 77  ce network bandw
1b20: 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  idth..**.** Note
1b30: 20 74 68 61 74 20 42 54 52 45 45 5f 48 49 4e 54   that BTREE_HINT
1b40: 5f 46 4c 41 47 53 20 77 69 74 68 20 42 54 52 45  _FLAGS with BTRE
1b50: 45 5f 42 55 4c 4b 4c 4f 41 44 20 69 73 20 74 68  E_BULKLOAD is th
1b60: 65 20 6f 6e 6c 79 20 68 69 6e 74 20 75 73 65 64  e only hint used
1b70: 20 62 79 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20   by.** standard 
1b80: 53 51 4c 69 74 65 2e 20 20 54 68 65 20 6f 74 68  SQLite.  The oth
1b90: 65 72 20 68 69 6e 74 73 20 61 72 65 20 70 72 6f  er hints are pro
1ba0: 76 69 64 65 64 20 66 6f 72 20 65 78 74 65 6e 74  vided for extent
1bb0: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 0a 2a 2a  ions that use.**
1bc0: 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73   the SQLite pars
1bd0: 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  er and code gene
1be0: 72 61 74 6f 72 20 62 75 74 20 73 75 62 73 74 69  rator but substi
1bf0: 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73  tute their own s
1c00: 74 6f 72 61 67 65 0a 2a 2a 20 65 6e 67 69 6e 65  torage.** engine
1c10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52  ..*/.#define BTR
1c20: 45 45 5f 48 49 4e 54 5f 52 41 4e 47 45 20 30 20  EE_HINT_RANGE 0 
1c30: 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63        /* Range c
1c40: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 71 75  onstraints on qu
1c50: 65 72 69 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eries */../*.** 
1c60: 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79 20  Values that may 
1c70: 62 65 20 4f 52 27 64 20 74 6f 67 65 74 68 65 72  be OR'd together
1c80: 20 74 6f 20 66 6f 72 6d 20 74 68 65 20 61 72 67   to form the arg
1c90: 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  ument to the.** 
1ca0: 42 54 52 45 45 5f 48 49 4e 54 5f 46 4c 41 47 53  BTREE_HINT_FLAGS
1cb0: 20 68 69 6e 74 20 66 6f 72 20 73 71 6c 69 74 65   hint for sqlite
1cc0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
1cd0: 28 29 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  ():.**.** The BT
1ce0: 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 66 6c 61  REE_BULKLOAD fla
1cf0: 67 20 69 73 20 73 65 74 20 6f 6e 20 69 6e 64 65  g is set on inde
1d00: 78 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74  x cursors when t
1d10: 68 65 20 69 6e 64 65 78 20 69 73 20 67 6f 69 6e  he index is goin
1d20: 67 0a 2a 2a 20 74 6f 20 62 65 20 66 69 6c 6c 65  g.** to be fille
1d30: 64 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 74  d with content t
1d40: 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
1d50: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a  n sorted order..
1d60: 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f  **.** The BTREE_
1d70: 53 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73 20  SEEK_EQ flag is 
1d80: 73 65 74 20 6f 6e 20 63 75 72 73 6f 72 73 20 74  set on cursors t
1d90: 68 61 74 20 77 69 6c 6c 20 67 65 74 20 4f 50 5f  hat will get OP_
1da0: 53 65 65 6b 47 45 20 6f 72 0a 2a 2a 20 4f 50 5f  SeekGE or.** OP_
1db0: 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65 73 20 66  SeekLE opcodes f
1dc0: 6f 72 20 61 20 72 61 6e 67 65 20 73 65 61 72 63  or a range searc
1dd0: 68 2c 20 62 75 74 20 77 68 65 72 65 20 74 68 65  h, but where the
1de0: 20 72 61 6e 67 65 20 6f 66 20 65 6e 74 72 69 65   range of entrie
1df0: 73 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 77 69  s.** selected wi
1e00: 6c 6c 20 61 6c 6c 20 68 61 76 65 20 74 68 65 20  ll all have the 
1e10: 73 61 6d 65 20 6b 65 79 2e 20 20 49 6e 20 6f 74  same key.  In ot
1e20: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1e30: 75 72 73 6f 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  ursor will.** be
1e40: 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 65   used only for e
1e50: 71 75 61 6c 69 74 79 20 6b 65 79 20 73 65 61 72  quality key sear
1e60: 63 68 65 73 2e 0a 2a 2a 0a 2a 2f 0a 23 64 65 66  ches..**.*/.#def
1e70: 69 6e 65 20 42 54 52 45 45 5f 42 55 4c 4b 4c 4f  ine BTREE_BULKLO
1e80: 41 44 20 30 78 30 30 30 30 30 30 30 31 20 20 2f  AD 0x00000001  /
1e90: 2a 20 55 73 65 64 20 74 6f 20 66 75 6c 6c 20 69  * Used to full i
1ea0: 6e 64 65 78 20 69 6e 20 73 6f 72 74 65 64 20 6f  ndex in sorted o
1eb0: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1ec0: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 20 30  BTREE_SEEK_EQ  0
1ed0: 78 30 30 30 30 30 30 30 32 20 20 2f 2a 20 45 51  x00000002  /* EQ
1ee0: 20 73 65 65 6b 73 20 6f 6e 6c 79 20 2d 20 6e 6f   seeks only - no
1ef0: 20 72 61 6e 67 65 20 73 65 65 6b 73 20 2a 2f 0a   range seeks */.
1f00: 0a 2f 2a 20 0a 2a 2a 20 46 6c 61 67 73 20 70 61  ./* .** Flags pa
1f10: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
1f20: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  d argument to sq
1f30: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1f40: 28 29 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 72 65  ()..**.** For re
1f50: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 73 20  ad-only cursors 
1f60: 74 68 65 20 77 72 46 6c 61 67 20 61 72 67 75 6d  the wrFlag argum
1f70: 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20 7a 65  ent is always ze
1f80: 72 6f 2e 20 46 6f 72 20 72 65 61 64 2d 77 72 69  ro. For read-wri
1f90: 74 65 0a 2a 2a 20 63 75 72 73 6f 72 73 20 69 74  te.** cursors it
1fa0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 65   may be set to e
1fb0: 69 74 68 65 72 20 28 42 54 52 45 45 5f 57 52 43  ither (BTREE_WRC
1fc0: 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  SR|BTREE_FORDELE
1fd0: 54 45 29 20 6f 72 20 6a 75 73 74 0a 2a 2a 20 28  TE) or just.** (
1fe0: 42 54 52 45 45 5f 57 52 43 53 52 29 2e 20 49 66  BTREE_WRCSR). If
1ff0: 20 74 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45   the BTREE_FORDE
2000: 4c 45 54 45 20 62 69 74 20 69 73 20 73 65 74 2c  LETE bit is set,
2010: 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2020: 20 77 69 6c 6c 0a 2a 2a 20 6f 6e 6c 79 20 62 65   will.** only be
2030: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
2040: 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
2050: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 6f 20  g:.**.**   * to 
2060: 73 65 65 6b 20 74 6f 20 61 6e 64 20 74 68 65 6e  seek to and then
2070: 20 64 65 6c 65 74 65 20 73 70 65 63 69 66 69 63   delete specific
2080: 20 65 6e 74 72 69 65 73 2c 20 61 6e 64 2f 6f 72   entries, and/or
2090: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 6f 20 72 65  .**.**   * to re
20a0: 61 64 20 76 61 6c 75 65 73 20 74 68 61 74 20 77  ad values that w
20b0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 63  ill be used to c
20c0: 72 65 61 74 65 20 6b 65 79 73 20 74 68 61 74 20  reate keys that 
20d0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 42 54 52  other.**     BTR
20e0: 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 63 75 72  EE_FORDELETE cur
20f0: 73 6f 72 73 20 77 69 6c 6c 20 73 65 65 6b 20 74  sors will seek t
2100: 6f 20 61 6e 64 20 64 65 6c 65 74 65 2e 0a 2a 2a  o and delete..**
2110: 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f  .** The BTREE_FO
2120: 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20  RDELETE flag is 
2130: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2140: 68 69 6e 74 2e 20 20 49 74 20 69 73 20 6e 6f 74  hint.  It is not
2150: 20 75 73 65 64 20 62 79 0a 2a 2a 20 62 79 20 74   used by.** by t
2160: 68 69 73 2c 20 74 68 65 20 6e 61 74 69 76 65 20  his, the native 
2170: 62 2d 74 72 65 65 20 65 6e 67 69 6e 65 20 6f 66  b-tree engine of
2180: 20 53 51 4c 69 74 65 2c 20 62 75 74 20 69 74 20   SQLite, but it 
2190: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  is available to.
21a0: 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  ** alternative s
21b0: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 73 20 74  torage engines t
21c0: 68 61 74 20 6d 69 67 68 74 20 62 65 20 73 75 62  hat might be sub
21d0: 73 74 69 74 75 74 65 64 20 69 6e 20 70 6c 61 63  stituted in plac
21e0: 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 62 2d 74  e of this.** b-t
21f0: 72 65 65 20 73 79 73 74 65 6d 2e 20 20 46 6f 72  ree system.  For
2200: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f   alternative sto
2210: 72 61 67 65 20 65 6e 67 69 6e 65 73 20 69 6e 20  rage engines in 
2220: 77 68 69 63 68 20 61 20 64 65 6c 65 74 65 20 6f  which a delete o
2230: 66 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61  f.** the main ta
2240: 62 6c 65 20 72 6f 77 20 61 75 74 6f 6d 61 74 69  ble row automati
2250: 63 61 6c 6c 79 20 64 65 6c 65 74 65 73 20 63 6f  cally deletes co
2260: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 64 65  rresponding inde
2270: 78 20 72 6f 77 73 2c 0a 2a 2a 20 74 68 65 20 46  x rows,.** the F
2280: 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 68 69  ORDELETE flag hi
2290: 6e 74 20 61 6c 6c 6f 77 73 20 74 68 6f 73 65 20  nt allows those 
22a0: 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72  alternative stor
22b0: 61 67 65 20 65 6e 67 69 6e 65 73 20 74 6f 0a 2a  age engines to.*
22c0: 2a 20 73 6b 69 70 20 61 20 6c 6f 74 20 6f 66 20  * skip a lot of 
22d0: 77 6f 72 6b 2e 20 20 4e 61 6d 65 6c 79 3a 20 20  work.  Namely:  
22e0: 46 4f 52 44 45 4c 45 54 45 20 63 75 72 73 6f 72  FORDELETE cursor
22f0: 73 20 6d 61 79 20 74 72 65 61 74 20 61 6c 6c 20  s may treat all 
2300: 53 45 45 4b 0a 2a 2a 20 61 6e 64 20 44 45 4c 45  SEEK.** and DELE
2310: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 73  TE operations as
2320: 20 6e 6f 2d 6f 70 73 2c 20 61 6e 64 20 61 6e 79   no-ops, and any
2330: 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 20   READ operation 
2340: 61 67 61 69 6e 73 74 20 61 0a 2a 2a 20 46 4f 52  against a.** FOR
2350: 44 45 4c 45 54 45 20 63 75 72 73 6f 72 20 6d 61  DELETE cursor ma
2360: 79 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  y return a null 
2370: 72 6f 77 3a 20 30 78 30 31 20 30 78 30 30 2e 0a  row: 0x01 0x00..
2380: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45  */.#define BTREE
2390: 5f 57 52 43 53 52 20 20 20 20 20 30 78 30 30 30  _WRCSR     0x000
23a0: 30 30 30 30 34 20 20 20 20 20 2f 2a 20 72 65 61  00004     /* rea
23b0: 64 2d 77 72 69 74 65 20 63 75 72 73 6f 72 20 2a  d-write cursor *
23c0: 2f 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f  /.#define BTREE_
23d0: 46 4f 52 44 45 4c 45 54 45 20 30 78 30 30 30 30  FORDELETE 0x0000
23e0: 30 30 30 38 20 20 20 20 20 2f 2a 20 43 75 72 73  0008     /* Curs
23f0: 6f 72 20 69 73 20 66 6f 72 20 73 65 65 6b 2f 64  or is for seek/d
2400: 65 6c 65 74 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 69  elete only */..i
2410: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2420: 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 2a 2c  ursor(.  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 20 20 20 20 20 2f 2a                /*
2450: 20 42 54 72 65 65 20 63 6f 6e 74 61 69 6e 69 6e   BTree containin
2460: 67 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  g table to open 
2470: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  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 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
24a0: 65 78 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 20  ex of root page 
24b0: 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  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 20 20 20 20 20 2f 2a 20 31 20 66            /* 1 f
24e0: 6f 72 20 77 72 69 74 69 6e 67 2e 20 20 30 20 66  or writing.  0 f
24f0: 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  or read-only */.
2500: 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
2510: 2a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *,              
2520: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2530: 61 72 67 75 6d 65 6e 74 20 74 6f 20 63 6f 6d 70  argument to comp
2540: 61 72 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  are function */.
2550: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2560: 73 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  sor             
2570: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2580: 74 6f 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  to write cursor 
2590: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 3b 0a  structure */.);.
25a0: 42 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65  BtCursor *sqlite
25b0: 33 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43  3BtreeFakeValidC
25c0: 75 72 73 6f 72 28 76 6f 69 64 29 3b 0a 69 6e 74  ursor(void);.int
25d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
25e0: 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 3b 0a 76  sorSize(void);.v
25f0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
2600: 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
2610: 73 6f 72 2a 29 3b 0a 76 6f 69 64 20 73 71 6c 69  sor*);.void sqli
2620: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
2630: 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  ntFlags(BtCursor
2640: 2a 2c 20 75 6e 73 69 67 6e 65 64 29 3b 0a 23 69  *, unsigned);.#i
2650: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2660: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
2670: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
2680: 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75  eCursorHint(BtCu
2690: 72 73 6f 72 2a 2c 20 69 6e 74 2c 20 2e 2e 2e 29  rsor*, int, ...)
26a0: 3b 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 20 73 71  ;.#endif..int sq
26b0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
26c0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 2a 29  ursor(BtCursor*)
26d0: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ;.int sqlite3Btr
26e0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
26f0: 28 0a 20 20 42 74 43 75 72 73 6f 72 2a 2c 0a 20  (.  BtCursor*,. 
2700: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2710: 2a 70 55 6e 4b 65 79 2c 0a 20 20 69 36 34 20 69  *pUnKey,.  i64 i
2720: 6e 74 4b 65 79 2c 0a 20 20 69 6e 74 20 62 69 61  ntKey,.  int bia
2730: 73 2c 0a 20 20 69 6e 74 20 2a 70 52 65 73 0a 29  s,.  int *pRes.)
2740: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  ;.int sqlite3Btr
2750: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
2760: 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a 69 6e 74  (BtCursor*);.int
2770: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
2780: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
2790: 73 6f 72 2a 2c 20 69 6e 74 2a 29 3b 0a 69 6e 74  sor*, int*);.int
27a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
27b0: 65 74 65 28 42 74 43 75 72 73 6f 72 2a 2c 20 75  ete(BtCursor*, u
27c0: 38 20 66 6c 61 67 73 29 3b 0a 0a 2f 2a 20 41 6c  8 flags);../* Al
27d0: 6c 6f 77 65 64 20 66 6c 61 67 73 20 66 6f 72 20  lowed flags for 
27e0: 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
27f0: 74 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  te() and sqlite3
2800: 42 74 72 65 65 49 6e 73 65 72 74 28 29 20 2a 2f  BtreeInsert() */
2810: 0a 23 64 65 66 69 6e 65 20 42 54 52 45 45 5f 53  .#define BTREE_S
2820: 41 56 45 50 4f 53 49 54 49 4f 4e 20 30 78 30 32  AVEPOSITION 0x02
2830: 20 20 2f 2a 20 4c 65 61 76 65 20 63 75 72 73 6f    /* Leave curso
2840: 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 4e 45  r pointing at NE
2850: 58 54 20 6f 72 20 50 52 45 56 20 2a 2f 0a 23 64  XT or PREV */.#d
2860: 65 66 69 6e 65 20 42 54 52 45 45 5f 41 55 58 44  efine BTREE_AUXD
2870: 45 4c 45 54 45 20 20 20 20 30 78 30 34 20 20 2f  ELETE    0x04  /
2880: 2a 20 6e 6f 74 20 74 68 65 20 70 72 69 6d 61 72  * not the primar
2890: 79 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69  y delete operati
28a0: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 54  on */.#define BT
28b0: 52 45 45 5f 41 50 50 45 4e 44 20 20 20 20 20 20  REE_APPEND      
28c0: 20 30 78 30 38 20 20 2f 2a 20 49 6e 73 65 72 74   0x08  /* Insert
28d0: 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
28e0: 70 65 6e 64 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69  pend */../* An i
28f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 42  nstance of the B
2900: 74 72 65 65 50 61 79 6c 6f 61 64 20 6f 62 6a 65  treePayload obje
2910: 63 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ct describes the
2920: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
2930: 6e 67 6c 65 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  ngle.** entry in
2940: 20 65 69 74 68 65 72 20 61 6e 20 69 6e 64 65 78   either an index
2950: 20 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65 2e   or table btree.
2960: 0a 2a 2a 0a 2a 2a 20 49 6e 64 65 78 20 62 74 72  .**.** Index btr
2970: 65 65 73 20 28 75 73 65 64 20 66 6f 72 20 69 6e  ees (used for in
2980: 64 65 78 65 73 20 61 6e 64 20 61 6c 73 6f 20 57  dexes and also W
2990: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
29a0: 6c 65 73 29 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  les) contain.** 
29b0: 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65 79  an arbitrary key
29c0: 20 61 6e 64 20 6e 6f 20 64 61 74 61 2e 20 20 54   and no data.  T
29d0: 68 65 73 65 20 62 74 72 65 65 73 20 68 61 76 65  hese btrees have
29e0: 20 70 4b 65 79 2c 6e 4b 65 79 20 73 65 74 20 74   pKey,nKey set t
29f0: 6f 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  o the.** key and
2a00: 20 74 68 65 20 70 44 61 74 61 2c 6e 44 61 74 61   the pData,nData
2a10: 2c 6e 5a 65 72 6f 20 66 69 65 6c 64 73 20 61 72  ,nZero fields ar
2a20: 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
2a30: 20 20 54 68 65 20 61 4d 65 6d 2c 6e 4d 65 6d 0a    The aMem,nMem.
2a40: 2a 2a 20 66 69 65 6c 64 73 20 67 69 76 65 20 61  ** fields give a
2a50: 6e 20 61 72 72 61 79 20 6f 66 20 4d 65 6d 20 6f  n array of Mem o
2a60: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
2a70: 61 20 64 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  a decomposition 
2a80: 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 20 54  of the key..** T
2a90: 68 65 20 6e 4d 65 6d 20 66 69 65 6c 64 20 6d 69  he nMem field mi
2aa0: 67 68 74 20 62 65 20 7a 65 72 6f 2c 20 69 6e 64  ght be zero, ind
2ab0: 69 63 61 74 69 6e 67 20 74 68 61 74 20 6e 6f 20  icating that no 
2ac0: 64 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 73  decomposition is
2ad0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
2ae0: 2a 20 54 61 62 6c 65 20 62 74 72 65 65 73 20 28  * Table btrees (
2af0: 75 73 65 64 20 66 6f 72 20 72 6f 77 69 64 20 74  used for rowid t
2b00: 61 62 6c 65 73 29 20 63 6f 6e 74 61 69 6e 20 61  ables) contain a
2b10: 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 20  n integer rowid 
2b20: 75 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6b  used as.** the k
2b30: 65 79 20 61 6e 64 20 70 61 73 73 65 64 20 69 6e  ey and passed in
2b40: 20 74 68 65 20 6e 4b 65 79 20 66 69 65 6c 64 2e   the nKey field.
2b50: 20 20 54 68 65 20 70 4b 65 79 20 66 69 65 6c 64    The pKey field
2b60: 20 69 73 20 7a 65 72 6f 2e 20 20 0a 2a 2a 20 70   is zero.  .** p
2b70: 44 61 74 61 2c 6e 44 61 74 61 20 68 6f 6c 64 20  Data,nData hold 
2b80: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2b90: 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 6e  he new entry.  n
2ba0: 5a 65 72 6f 20 65 78 74 72 61 20 7a 65 72 6f 20  Zero extra zero 
2bb0: 62 79 74 65 73 0a 2a 2a 20 61 72 65 20 61 70 70  bytes.** are app
2bc0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  ended to the end
2bd0: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
2be0: 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
2bf0: 67 20 74 68 65 20 65 6e 74 72 79 2e 0a 2a 2a 20  g the entry..** 
2c00: 54 68 65 20 61 4d 65 6d 2c 6e 4d 65 6d 20 66 69  The aMem,nMem fi
2c10: 65 6c 64 73 20 61 72 65 20 75 6e 69 6e 69 74 69  elds are uniniti
2c20: 61 6c 69 7a 65 64 20 66 6f 72 20 74 61 62 6c 65  alized for table
2c30: 20 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 46   btrees..**.** F
2c40: 69 65 6c 64 20 75 73 61 67 65 20 73 75 6d 6d 61  ield usage summa
2c50: 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
2c60: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 42 54          Table BT
2c70: 72 65 65 73 20 20 20 20 20 20 20 20 20 20 20 20  rees            
2c80: 20 20 20 20 20 20 20 49 6e 64 65 78 20 42 74 72         Index Btr
2c90: 65 65 73 0a 2a 2a 0a 2a 2a 20 20 20 70 4b 65 79  ees.**.**   pKey
2ca0: 20 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 4e          always N
2cb0: 55 4c 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  ULL             
2cc0: 20 20 20 20 20 20 20 65 6e 63 6f 64 65 64 20 6b         encoded k
2cd0: 65 79 0a 2a 2a 20 20 20 6e 4b 65 79 20 20 20 20  ey.**   nKey    
2ce0: 20 20 20 20 74 68 65 20 52 4f 57 49 44 20 20 20      the ROWID   
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 6c 65 6e 67 74 68 20 6f 66 20 70 4b 65     length of pKe
2d10: 79 0a 2a 2a 20 20 20 70 44 61 74 61 20 20 20 20  y.**   pData    
2d20: 20 20 20 64 61 74 61 20 20 20 20 20 20 20 20 20     data         
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 6e 6f 74 20 75 73 65 64 0a 2a 2a 20 20 20    not used.**   
2d50: 61 4d 65 6d 20 20 20 20 20 20 20 20 6e 6f 74 20  aMem        not 
2d60: 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20  used            
2d70: 20 20 20 20 20 20 20 20 20 20 20 64 65 63 6f 6d             decom
2d80: 70 6f 73 65 64 20 6b 65 79 20 76 61 6c 75 65 0a  posed key value.
2d90: 2a 2a 20 20 20 6e 4d 65 6d 20 20 20 20 20 20 20  **   nMem       
2da0: 20 6e 6f 74 20 75 73 65 64 20 20 20 20 20 20 20   not used       
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 65 6e 74 72 69 65 73 20 69 6e 20 61 4d 65 6d 0a  entries in aMem.
2dd0: 2a 2a 20 20 20 6e 44 61 74 61 20 20 20 20 20 20  **   nData      
2de0: 20 6c 65 6e 67 74 68 20 6f 66 20 70 44 61 74 61   length of pData
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 6e 6f 74 20 75 73 65 64 0a 2a 2a 20 20 20 6e 5a  not used.**   nZ
2e10: 65 72 6f 20 20 20 20 20 20 20 65 78 74 72 61 20  ero       extra 
2e20: 7a 65 72 6f 73 20 61 66 74 65 72 20 70 44 61 74  zeros after pDat
2e30: 61 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65  a        not use
2e40: 64 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 62 6a  d.**.** This obj
2e50: 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 70  ect is used to p
2e60: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
2e70: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
2e80: 65 49 6e 73 65 72 74 28 29 2e 20 20 54 68 65 0a  eInsert().  The.
2e90: 2a 2a 20 73 61 6d 65 20 69 6e 66 6f 72 6d 61 74  ** same informat
2ea0: 69 6f 6e 20 75 73 65 64 20 74 6f 20 62 65 20 70  ion used to be p
2eb0: 61 73 73 65 64 20 61 73 20 66 69 76 65 20 73 65  assed as five se
2ec0: 70 61 72 61 74 65 20 70 61 72 61 6d 65 74 65 72  parate parameter
2ed0: 73 2e 20 20 42 75 74 20 70 6c 61 63 69 6e 67 0a  s.  But placing.
2ee0: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
2ef0: 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 6f 62 6a  on into this obj
2f00: 65 63 74 20 68 65 6c 70 73 20 74 6f 20 6b 65 65  ect helps to kee
2f10: 70 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20  p the interface 
2f20: 6d 6f 72 65 20 0a 2a 2a 20 6f 72 67 61 6e 69 7a  more .** organiz
2f30: 65 64 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e  ed and understan
2f40: 64 61 62 6c 65 2c 20 61 6e 64 20 69 74 20 61 6c  dable, and it al
2f50: 73 6f 20 68 65 6c 70 73 20 74 68 65 20 72 65 73  so helps the res
2f60: 75 6c 74 69 6e 67 20 63 6f 64 65 20 74 6f 0a 2a  ulting code to.*
2f70: 2a 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 66  * run a little f
2f80: 61 73 74 65 72 20 62 79 20 75 73 69 6e 67 20 66  aster by using f
2f90: 65 77 65 72 20 72 65 67 69 73 74 65 72 73 20 66  ewer registers f
2fa0: 6f 72 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  or parameter pas
2fb0: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  sing..*/.struct 
2fc0: 42 74 72 65 65 50 61 79 6c 6f 61 64 20 7b 0a 20  BtreePayload {. 
2fd0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
2fe0: 79 3b 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20  y;       /* Key 
2ff0: 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 65  content for inde
3000: 78 65 73 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  xes.  NULL for t
3010: 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ables */.  sqlit
3020: 65 33 5f 69 6e 74 36 34 20 6e 4b 65 79 3b 20 20  e3_int64 nKey;  
3030: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b     /* Size of pK
3040: 65 79 20 66 6f 72 20 69 6e 64 65 78 65 73 2e 20  ey for indexes. 
3050: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
3060: 20 74 61 62 73 20 2a 2f 0a 20 20 63 6f 6e 73 74   tabs */.  const
3070: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20 20 20   void *pData;   
3080: 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
3090: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  ables. */.  sqli
30a0: 74 65 33 5f 76 61 6c 75 65 20 2a 61 4d 65 6d 3b  te3_value *aMem;
30b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
30c0: 6e 4d 65 6d 20 76 61 6c 75 65 20 69 6e 20 74 68  nMem value in th
30d0: 65 20 75 6e 70 61 63 6b 65 64 20 70 4b 65 79 20  e unpacked pKey 
30e0: 2a 2f 0a 20 20 75 31 36 20 6e 4d 65 6d 3b 20 20  */.  u16 nMem;  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 75 6d 62 65 72 20 6f 66 20 61 4d 65 6d 5b 5d  Number of aMem[]
3110: 20 76 61 6c 75 65 2e 20 20 4d 69 67 68 74 20 62   value.  Might b
3120: 65 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  e zero */.  int 
3130: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
3140: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
3150: 44 61 74 61 2e 20 20 30 20 69 66 20 6e 6f 6e 65  Data.  0 if none
3160: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  . */.  int nZero
3170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3180: 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 64 61 74  * Extra zero dat
3190: 61 20 61 70 70 65 6e 64 65 64 20 61 66 74 65 72  a appended after
31a0: 20 70 44 61 74 61 2c 6e 44 61 74 61 20 2a 2f 0a   pData,nData */.
31b0: 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  };..int sqlite3B
31c0: 74 72 65 65 49 6e 73 65 72 74 28 42 74 43 75 72  treeInsert(BtCur
31d0: 73 6f 72 2a 2c 20 63 6f 6e 73 74 20 42 74 72 65  sor*, const Btre
31e0: 65 50 61 79 6c 6f 61 64 20 2a 70 50 61 79 6c 6f  ePayload *pPaylo
31f0: 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ad,.            
3200: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
3210: 6c 61 67 73 2c 20 69 6e 74 20 73 65 65 6b 52 65  lags, int seekRe
3220: 73 75 6c 74 29 3b 0a 69 6e 74 20 73 71 6c 69 74  sult);.int sqlit
3230: 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
3240: 75 72 73 6f 72 2a 2c 20 69 6e 74 20 2a 70 52 65  ursor*, int *pRe
3250: 73 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  s);.int sqlite3B
3260: 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
3270: 72 2a 2c 20 69 6e 74 20 2a 70 52 65 73 29 3b 0a  r*, int *pRes);.
3280: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
3290: 4e 65 78 74 28 42 74 43 75 72 73 6f 72 2a 2c 20  Next(BtCursor*, 
32a0: 69 6e 74 20 66 6c 61 67 73 29 3b 0a 69 6e 74 20  int flags);.int 
32b0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
32c0: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 69 6e 74 20  BtCursor*);.int 
32d0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
32e0: 69 6f 75 73 28 42 74 43 75 72 73 6f 72 2a 2c 20  ious(BtCursor*, 
32f0: 69 6e 74 20 66 6c 61 67 73 29 3b 0a 69 36 34 20  int flags);.i64 
3300: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
3310: 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 2a  gerKey(BtCursor*
3320: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
3330: 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
3340: 51 4c 5f 46 55 4e 43 0a 69 36 34 20 73 71 6c 69  QL_FUNC.i64 sqli
3350: 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42  te3BtreeOffset(B
3360: 74 43 75 72 73 6f 72 2a 29 3b 0a 23 65 6e 64 69  tCursor*);.#endi
3370: 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  f.int sqlite3Btr
3380: 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73  eePayload(BtCurs
3390: 6f 72 2a 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  or*, u32 offset,
33a0: 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 2a 29   u32 amt, void*)
33b0: 3b 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  ;.const void *sq
33c0: 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
33d0: 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 2a  dFetch(BtCursor*
33e0: 2c 20 75 33 32 20 2a 70 41 6d 74 29 3b 0a 75 33  , u32 *pAmt);.u3
33f0: 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
3400: 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
3410: 6f 72 2a 29 3b 0a 0a 63 68 61 72 20 2a 73 71 6c  or*);..char *sql
3420: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69  ite3BtreeIntegri
3430: 74 79 43 68 65 63 6b 28 42 74 72 65 65 2a 2c 20  tyCheck(Btree*, 
3440: 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 69 6e 74 20  int *aRoot, int 
3450: 6e 52 6f 6f 74 2c 20 69 6e 74 2c 20 69 6e 74 2a  nRoot, int, int*
3460: 29 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  );.struct Pager 
3470: 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  *sqlite3BtreePag
3480: 65 72 28 42 74 72 65 65 2a 29 3b 0a 69 36 34 20  er(Btree*);.i64 
3490: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43  sqlite3BtreeRowC
34a0: 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72  ountEst(BtCursor
34b0: 2a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  *);..#ifndef SQL
34c0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
34d0: 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  B.int sqlite3Btr
34e0: 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
34f0: 28 42 74 43 75 72 73 6f 72 2a 2c 20 75 33 32 20  (BtCursor*, u32 
3500: 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
3510: 20 76 6f 69 64 2a 29 3b 0a 69 6e 74 20 73 71 6c   void*);.int sql
3520: 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61  ite3BtreePutData
3530: 28 42 74 43 75 72 73 6f 72 2a 2c 20 75 33 32 20  (BtCursor*, u32 
3540: 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
3550: 20 76 6f 69 64 2a 29 3b 0a 76 6f 69 64 20 73 71   void*);.void sq
3560: 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 62 6c  lite3BtreeIncrbl
3570: 6f 62 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  obCursor(BtCurso
3580: 72 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 76 6f 69  r *);.#endif.voi
3590: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
35a0: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
35b0: 6f 72 20 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  or *);.int sqlit
35c0: 65 33 42 74 72 65 65 53 65 74 56 65 72 73 69 6f  e3BtreeSetVersio
35d0: 6e 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e  n(Btree *pBt, in
35e0: 74 20 69 56 65 72 73 69 6f 6e 29 3b 0a 69 6e 74  t iVersion);.int
35f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
3600: 73 6f 72 48 61 73 48 69 6e 74 28 42 74 43 75 72  sorHasHint(BtCur
3610: 73 6f 72 2a 2c 20 75 6e 73 69 67 6e 65 64 20 69  sor*, unsigned i
3620: 6e 74 20 6d 61 73 6b 29 3b 0a 69 6e 74 20 73 71  nt mask);.int sq
3630: 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
3640: 6f 6e 6c 79 28 42 74 72 65 65 20 2a 70 42 74 29  only(Btree *pBt)
3650: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 48 65 61  ;.int sqlite3Hea
3660: 64 65 72 53 69 7a 65 42 74 72 65 65 28 76 6f 69  derSizeBtree(voi
3670: 64 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  d);..#ifndef NDE
3680: 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  BUG.int sqlite3B
3690: 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
36a0: 64 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a 23 65  d(BtCursor*);.#e
36b0: 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33  ndif.int sqlite3
36c0: 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
36d0: 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 2a 29 3b  idNN(BtCursor*);
36e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
36f0: 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
3700: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
3710: 65 43 6f 75 6e 74 28 42 74 43 75 72 73 6f 72 20  eCount(BtCursor 
3720: 2a 2c 20 69 36 34 20 2a 29 3b 0a 23 65 6e 64 69  *, i64 *);.#endi
3730: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
3740: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
3750: 33 42 74 72 65 65 43 75 72 73 6f 72 49 6e 66 6f  3BtreeCursorInfo
3760: 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 2a  (BtCursor*, int*
3770: 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 73 71 6c  , int);.void sql
3780: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 4c  ite3BtreeCursorL
3790: 69 73 74 28 42 74 72 65 65 2a 29 3b 0a 23 65 6e  ist(Btree*);.#en
37a0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
37b0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69  ITE_OMIT_WAL.  i
37c0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
37d0: 68 65 63 6b 70 6f 69 6e 74 28 42 74 72 65 65 2a  heckpoint(Btree*
37e0: 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 2c 20 69 6e  , int, int *, in
37f0: 74 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t *);.#endif../*
3800: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6e 6f  .** If we are no
3810: 74 20 75 73 69 6e 67 20 73 68 61 72 65 64 20 63  t using shared c
3820: 61 63 68 65 2c 20 74 68 65 6e 20 74 68 65 72 65  ache, then there
3830: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 0a 2a   is no need to.*
3840: 2a 20 75 73 65 20 6d 75 74 65 78 65 73 20 74 6f  * use mutexes to
3850: 20 61 63 63 65 73 73 20 74 68 65 20 42 74 53 68   access the BtSh
3860: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2e  ared structures.
3870: 20 20 53 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a    So make the.**
3880: 20 45 6e 74 65 72 20 61 6e 64 20 4c 65 61 76 65   Enter and Leave
3890: 20 70 72 6f 63 65 64 75 72 65 73 20 6e 6f 2d 6f   procedures no-o
38a0: 70 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ps..*/.#ifndef S
38b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
38c0: 44 5f 43 41 43 48 45 0a 20 20 76 6f 69 64 20 73  D_CACHE.  void s
38d0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
38e0: 28 42 74 72 65 65 2a 29 3b 0a 20 20 76 6f 69 64  (Btree*);.  void
38f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3900: 65 72 41 6c 6c 28 73 71 6c 69 74 65 33 2a 29 3b  erAll(sqlite3*);
3910: 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .  int sqlite3Bt
3920: 72 65 65 53 68 61 72 61 62 6c 65 28 42 74 72 65  reeSharable(Btre
3930: 65 2a 29 3b 0a 20 20 76 6f 69 64 20 73 71 6c 69  e*);.  void sqli
3940: 74 65 33 42 74 72 65 65 45 6e 74 65 72 43 75 72  te3BtreeEnterCur
3950: 73 6f 72 28 42 74 43 75 72 73 6f 72 2a 29 3b 0a  sor(BtCursor*);.
3960: 20 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72    int sqlite3Btr
3970: 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e  eeConnectionCoun
3980: 74 28 42 74 72 65 65 2a 29 3b 0a 23 65 6c 73 65  t(Btree*);.#else
3990: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
39a0: 33 42 74 72 65 65 45 6e 74 65 72 28 58 29 20 0a  3BtreeEnter(X) .
39b0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  # define sqlite3
39c0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 58 29  BtreeEnterAll(X)
39d0: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
39e0: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 58  3BtreeSharable(X
39f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  ) 0.# define sql
3a00: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 43 75  ite3BtreeEnterCu
3a10: 72 73 6f 72 28 58 29 0a 23 20 64 65 66 69 6e 65  rsor(X).# define
3a20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
3a30: 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 58 29 20  nectionCount(X) 
3a40: 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  1.#endif..#if !d
3a50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
3a70: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
3a80: 44 53 41 46 45 0a 20 20 76 6f 69 64 20 73 71 6c  DSAFE.  void sql
3a90: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 42  ite3BtreeLeave(B
3aa0: 74 72 65 65 2a 29 3b 0a 20 20 76 6f 69 64 20 73  tree*);.  void s
3ab0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
3ac0: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 2a  Cursor(BtCursor*
3ad0: 29 3b 0a 20 20 76 6f 69 64 20 73 71 6c 69 74 65  );.  void sqlite
3ae0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 73  3BtreeLeaveAll(s
3af0: 71 6c 69 74 65 33 2a 29 3b 0a 23 69 66 6e 64 65  qlite3*);.#ifnde
3b00: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  f NDEBUG.  /* Th
3b10: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
3b20: 20 75 73 65 64 20 69 6e 73 69 64 65 20 61 73 73   used inside ass
3b30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
3b40: 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 69 6e 74 20   only. */.  int 
3b50: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3b60: 73 4d 75 74 65 78 28 42 74 72 65 65 2a 29 3b 0a  sMutex(Btree*);.
3b70: 20 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72    int sqlite3Btr
3b80: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
3b90: 73 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 69  s(sqlite3*);.  i
3ba0: 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  nt sqlite3Schema
3bb0: 4d 75 74 65 78 48 65 6c 64 28 73 71 6c 69 74 65  MutexHeld(sqlite
3bc0: 33 2a 2c 69 6e 74 2c 53 63 68 65 6d 61 2a 29 3b  3*,int,Schema*);
3bd0: 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 0a 23  .#endif.#else..#
3be0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42   define sqlite3B
3bf0: 74 72 65 65 4c 65 61 76 65 28 58 29 0a 23 20 64  treeLeave(X).# d
3c00: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 42 74 72  efine sqlite3Btr
3c10: 65 65 4c 65 61 76 65 43 75 72 73 6f 72 28 58 29  eeLeaveCursor(X)
3c20: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
3c30: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 58  3BtreeLeaveAll(X
3c40: 29 0a 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  )..# define sqli
3c50: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3c60: 65 78 28 58 29 20 31 0a 23 20 64 65 66 69 6e 65  ex(X) 1.# define
3c70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3c80: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 58 29 20  dsAllMutexes(X) 
3c90: 31 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  1.# define sqlit
3ca0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3cb0: 64 28 58 2c 59 2c 5a 29 20 31 0a 23 65 6e 64 69  d(X,Y,Z) 1.#endi
3cc0: 66 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  f...#endif /* SQ
3cd0: 4c 49 54 45 5f 42 54 52 45 45 5f 48 20 2a 2f 0a  LITE_BTREE_H */.