/ Hex Artifact Content
Login

Artifact 89a77be5ca8bb229f9e230de534098ea5b06c2c1:


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 24 49 64 3a 20 62  ******.** $Id: b
0180: 74 72 65 65 2e 63 2c 76 20 31 2e 39 37 20 32 30  tree.c,v 1.97 20
0190: 30 33 2f 31 32 2f 31 36 20 30 33 3a 34 34 3a 34  03/12/16 03:44:4
01a0: 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2a 0a 2a  8 drh Exp $.**.*
01b0: 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c  * This file impl
01c0: 65 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e 61  ements a externa
01d0: 6c 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20 64  l (disk-based) d
01e0: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 42 54  atabase using BT
01f0: 72 65 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 20 64  rees..** For a d
0200: 65 74 61 69 6c 65 64 20 64 69 73 63 75 73 73 69  etailed discussi
0210: 6f 6e 20 6f 66 20 42 54 72 65 65 73 2c 20 72 65  on of BTrees, re
0220: 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20  fer to.**.**    
0230: 20 44 6f 6e 61 6c 64 20 45 2e 20 4b 6e 75 74 68   Donald E. Knuth
0240: 2c 20 54 48 45 20 41 52 54 20 4f 46 20 43 4f 4d  , THE ART OF COM
0250: 50 55 54 45 52 20 50 52 4f 47 52 41 4d 4d 49 4e  PUTER PROGRAMMIN
0260: 47 2c 20 56 6f 6c 75 6d 65 20 33 3a 0a 2a 2a 20  G, Volume 3:.** 
0270: 20 20 20 20 22 53 6f 72 74 69 6e 67 20 41 6e 64      "Sorting And
0280: 20 53 65 61 72 63 68 69 6e 67 22 2c 20 70 61 67   Searching", pag
0290: 65 73 20 34 37 33 2d 34 38 30 2e 20 41 64 64 69  es 473-480. Addi
02a0: 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a 2a 20 20 20  son-Wesley.**   
02b0: 20 20 50 75 62 6c 69 73 68 69 6e 67 20 43 6f 6d    Publishing Com
02c0: 70 61 6e 79 2c 20 52 65 61 64 69 6e 67 2c 20 4d  pany, Reading, M
02d0: 61 73 73 61 63 68 75 73 65 74 74 73 2e 0a 2a 2a  assachusetts..**
02e0: 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
02f0: 65 61 20 69 73 20 74 68 61 74 20 65 61 63 68 20  ea is that each 
0300: 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
0310: 20 63 6f 6e 74 61 69 6e 73 20 4e 20 64 61 74 61   contains N data
0320: 62 61 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  base.** entries 
0330: 61 6e 64 20 4e 2b 31 20 70 6f 69 6e 74 65 72 73  and N+1 pointers
0340: 20 74 6f 20 73 75 62 70 61 67 65 73 2e 0a 2a 2a   to subpages..**
0350: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 7c 20 20 50  ------.**   |  P
03a0: 74 72 28 30 29 20 7c 20 4b 65 79 28 30 29 20 7c  tr(0) | Key(0) |
03b0: 20 50 74 72 28 31 29 20 7c 20 4b 65 79 28 31 29   Ptr(1) | Key(1)
03c0: 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79 28 4e 29 20   | ... | Key(N) 
03d0: 7c 20 50 74 72 28 4e 2b 31 29 20 7c 0a 2a 2a 20  | Ptr(N+1) |.** 
03e0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  --.**.** All of 
0430: 74 68 65 20 6b 65 79 73 20 6f 6e 20 74 68 65 20  the keys on the 
0440: 70 61 67 65 20 74 68 61 74 20 50 74 72 28 30 29  page that Ptr(0)
0450: 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 76 65 20   points to have 
0460: 76 61 6c 75 65 73 20 6c 65 73 73 0a 2a 2a 20 74  values less.** t
0470: 68 61 6e 20 4b 65 79 28 30 29 2e 20 20 41 6c 6c  han Key(0).  All
0480: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e 20   of the keys on 
0490: 70 61 67 65 20 50 74 72 28 31 29 20 61 6e 64 20  page Ptr(1) and 
04a0: 69 74 73 20 73 75 62 70 61 67 65 73 20 68 61 76  its subpages hav
04b0: 65 0a 2a 2a 20 76 61 6c 75 65 73 20 67 72 65 61  e.** values grea
04c0: 74 65 72 20 74 68 61 6e 20 4b 65 79 28 30 29 20  ter than Key(0) 
04d0: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 4b 65  and less than Ke
04e0: 79 28 31 29 2e 20 20 41 6c 6c 20 6f 66 20 74 68  y(1).  All of th
04f0: 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e 20 50 74 72  e keys.** on Ptr
0500: 28 4e 2b 31 29 20 61 6e 64 20 69 74 73 20 73 75  (N+1) and its su
0510: 62 70 61 67 65 73 20 68 61 76 65 20 76 61 6c 75  bpages have valu
0520: 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
0530: 4b 65 79 28 4e 29 2e 20 20 41 6e 64 0a 2a 2a 20  Key(N).  And.** 
0540: 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20  so forth..**.** 
0550: 46 69 6e 64 69 6e 67 20 61 20 70 61 72 74 69 63  Finding a partic
0560: 75 6c 61 72 20 6b 65 79 20 72 65 71 75 69 72 65  ular key require
0570: 73 20 72 65 61 64 69 6e 67 20 4f 28 6c 6f 67 28  s reading O(log(
0580: 4d 29 29 20 70 61 67 65 73 20 66 72 6f 6d 20 74  M)) pages from t
0590: 68 65 20 0a 2a 2a 20 64 69 73 6b 20 77 68 65 72  he .** disk wher
05a0: 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e M is the numbe
05b0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
05c0: 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
05d0: 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  In this implemen
05e0: 74 61 74 69 6f 6e 2c 20 61 20 73 69 6e 67 6c 65  tation, a single
05f0: 20 66 69 6c 65 20 63 61 6e 20 68 6f 6c 64 20 6f   file can hold o
0600: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  ne or more separ
0610: 61 74 65 20 0a 2a 2a 20 42 54 72 65 65 73 2e 20  ate .** BTrees. 
0620: 20 45 61 63 68 20 42 54 72 65 65 20 69 73 20 69   Each BTree is i
0630: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
0640: 20 69 6e 64 65 78 20 6f 66 20 69 74 73 20 72 6f   index of its ro
0650: 6f 74 20 70 61 67 65 2e 20 20 54 68 65 0a 2a 2a  ot page.  The.**
0660: 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 66 6f   key and data fo
0670: 72 20 61 6e 79 20 65 6e 74 72 79 20 61 72 65 20  r any entry are 
0680: 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72 6d  combined to form
0690: 20 74 68 65 20 22 70 61 79 6c 6f 61 64 22 2e 20   the "payload". 
06a0: 20 55 70 20 74 6f 0a 2a 2a 20 4d 58 5f 4c 4f 43   Up to.** MX_LOC
06b0: 41 4c 5f 50 41 59 4c 4f 41 44 20 62 79 74 65 73  AL_PAYLOAD bytes
06c0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 63 61 6e 20   of payload can 
06d0: 62 65 20 63 61 72 72 69 65 64 20 64 69 72 65 63  be carried direc
06e0: 74 6c 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  tly on the.** da
06f0: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 49 66  tabase page.  If
0700: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 73 20   the payload is 
0710: 6c 61 72 67 65 72 20 74 68 61 6e 20 4d 58 5f 4c  larger than MX_L
0720: 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 20 62 79 74  OCAL_PAYLOAD byt
0730: 65 73 0a 2a 2a 20 74 68 65 6e 20 73 75 72 70 6c  es.** then surpl
0740: 75 73 20 62 79 74 65 73 20 61 72 65 20 73 74 6f  us bytes are sto
0750: 72 65 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  red on overflow 
0760: 70 61 67 65 73 2e 20 20 54 68 65 20 70 61 79 6c  pages.  The payl
0770: 6f 61 64 20 66 6f 72 20 61 6e 0a 2a 2a 20 65 6e  oad for an.** en
0780: 74 72 79 20 61 6e 64 20 74 68 65 20 70 72 65 63  try and the prec
0790: 65 64 69 6e 67 20 70 6f 69 6e 74 65 72 20 61 72  eding pointer ar
07a0: 65 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f  e combined to fo
07b0: 72 6d 20 61 20 22 43 65 6c 6c 22 2e 20 20 45 61  rm a "Cell".  Ea
07c0: 63 68 20 0a 2a 2a 20 70 61 67 65 20 68 61 73 20  ch .** page has 
07d0: 61 20 73 6d 61 6c 6c 20 68 65 61 64 65 72 20 77  a small header w
07e0: 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
07f0: 65 20 50 74 72 28 4e 2b 31 29 20 70 6f 69 6e 74  e Ptr(N+1) point
0800: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  er..**.** The fi
0810: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
0820: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  file contains a 
0830: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 75 73 65  magic string use
0840: 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
0850: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 72 65 61  .** the file rea
0860: 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20 42  lly is a valid B
0870: 54 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 61  Tree database, a
0880: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6c 69   pointer to a li
0890: 73 74 20 6f 66 20 75 6e 75 73 65 64 0a 2a 2a 20  st of unused.** 
08a0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
08b0: 65 2c 20 61 6e 64 20 73 6f 6d 65 20 6d 65 74 61  e, and some meta
08c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 54   information.  T
08d0: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66  he root of the f
08e0: 69 72 73 74 0a 2a 2a 20 42 54 72 65 65 20 62 65  irst.** BTree be
08f0: 67 69 6e 73 20 6f 6e 20 70 61 67 65 20 32 20 6f  gins on page 2 o
0900: 66 20 74 68 65 20 66 69 6c 65 2e 20 20 28 50 61  f the file.  (Pa
0910: 67 65 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64  ges are numbered
0920: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 0a   beginning with.
0930: 2a 2a 20 31 2c 20 6e 6f 74 20 30 2e 29 20 20 54  ** 1, not 0.)  T
0940: 68 75 73 20 61 20 6d 69 6e 69 6d 75 6d 20 64 61  hus a minimum da
0950: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
0960: 32 20 70 61 67 65 73 2e 0a 2a 2f 0a 23 69 6e 63  2 pages..*/.#inc
0970: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0980: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
0990: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  er.h".#include "
09a0: 62 74 72 65 65 2e 68 22 0a 23 69 6e 63 6c 75 64  btree.h".#includ
09b0: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a  e <assert.h>../*
09c0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
09d0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
09e0: 42 74 4f 70 73 20 73 71 6c 69 74 65 42 74 72 65  BtOps sqliteBtre
09f0: 65 4f 70 73 3b 0a 73 74 61 74 69 63 20 42 74 43  eOps;.static BtC
0a00: 75 72 73 6f 72 4f 70 73 20 73 71 6c 69 74 65 42  ursorOps sqliteB
0a10: 74 72 65 65 43 75 72 73 6f 72 4f 70 73 3b 0a 0a  treeCursorOps;..
0a20: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73 65  /*.** Macros use
0a30: 64 20 66 6f 72 20 62 79 74 65 73 77 61 70 70 69  d for byteswappi
0a40: 6e 67 2e 20 20 42 20 69 73 20 61 20 70 6f 69 6e  ng.  B is a poin
0a50: 74 65 72 20 74 6f 20 74 68 65 20 42 74 72 65 65  ter to the Btree
0a60: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
0a70: 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
0a80: 6f 20 61 63 63 65 73 73 20 74 68 65 20 42 74 72  o access the Btr
0a90: 65 65 2e 6e 65 65 64 53 77 61 62 20 62 6f 6f 6c  ee.needSwab bool
0aa0: 65 61 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ean.** in order 
0ab0: 74 6f 20 74 65 6c 6c 20 69 66 20 62 79 74 65 20  to tell if byte 
0ac0: 73 77 61 70 70 69 6e 67 20 69 73 20 6e 65 65 64  swapping is need
0ad0: 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 58 20  ed or not..** X 
0ae0: 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 69  is an unsigned i
0af0: 6e 74 65 67 65 72 2e 20 20 53 57 41 42 31 36 20  nteger.  SWAB16 
0b00: 62 79 74 65 20 73 77 61 70 73 20 61 20 31 36 2d  byte swaps a 16-
0b10: 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20  bit integer..** 
0b20: 53 57 41 42 33 32 20 62 79 74 65 73 77 61 70 73  SWAB32 byteswaps
0b30: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
0b40: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  r..*/.#define SW
0b50: 41 42 31 36 28 42 2c 58 29 20 20 20 28 28 42 29  AB16(B,X)   ((B)
0b60: 2d 3e 6e 65 65 64 53 77 61 62 3f 20 73 77 61 62  ->needSwab? swab
0b70: 31 36 28 28 75 31 36 29 58 29 20 3a 20 28 28 75  16((u16)X) : ((u
0b80: 31 36 29 58 29 29 0a 23 64 65 66 69 6e 65 20 53  16)X)).#define S
0b90: 57 41 42 33 32 28 42 2c 58 29 20 20 20 28 28 42  WAB32(B,X)   ((B
0ba0: 29 2d 3e 6e 65 65 64 53 77 61 62 3f 20 73 77 61  )->needSwab? swa
0bb0: 62 33 32 28 58 29 20 3a 20 28 58 29 29 0a 23 64  b32(X) : (X)).#d
0bc0: 65 66 69 6e 65 20 53 57 41 42 5f 41 44 44 28 42  efine SWAB_ADD(B
0bd0: 2c 58 2c 41 29 20 5c 0a 20 20 20 69 66 28 28 42  ,X,A) \.   if((B
0be0: 29 2d 3e 6e 65 65 64 53 77 61 62 29 7b 20 58 3d  )->needSwab){ X=
0bf0: 73 77 61 62 33 32 28 73 77 61 62 33 32 28 58 29  swab32(swab32(X)
0c00: 2b 41 29 3b 20 7d 65 6c 73 65 7b 20 58 20 2b 3d  +A); }else{ X +=
0c10: 20 28 41 29 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 54   (A); }../*.** T
0c20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
0c30: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 2d 20 61  bal variable - a
0c40: 76 61 69 6c 61 62 6c 65 20 6f 6e 6c 79 20 69 66  vailable only if
0c50: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 0a   SQLITE_TEST is.
0c60: 2a 2a 20 64 65 66 69 6e 65 64 20 2d 20 69 73 20  ** defined - is 
0c70: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
0c80: 65 20 77 68 65 74 68 65 72 20 6e 65 77 20 64 61  e whether new da
0c90: 74 61 62 61 73 65 73 20 61 72 65 20 63 72 65 61  tabases are crea
0ca0: 74 65 64 20 69 6e 0a 2a 2a 20 6e 61 74 69 76 65  ted in.** native
0cb0: 20 62 79 74 65 20 6f 72 64 65 72 20 6f 72 20 69   byte order or i
0cc0: 6e 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 79 74  n non-native byt
0cd0: 65 20 6f 72 64 65 72 2e 20 20 4e 6f 6e 2d 6e 61  e order.  Non-na
0ce0: 74 69 76 65 20 62 79 74 65 20 6f 72 64 65 72 0a  tive byte order.
0cf0: 2a 2a 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ** databases are
0d00: 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 65 73   created for tes
0d10: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
0d20: 6c 79 2e 20 20 55 6e 64 65 72 20 6e 6f 72 6d 61  ly.  Under norma
0d30: 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 0a 2a 2a 20  l operation,.** 
0d40: 6f 6e 6c 79 20 6e 61 74 69 76 65 20 62 79 74 65  only native byte
0d50: 2d 6f 72 64 65 72 20 64 61 74 61 62 61 73 65 73  -order databases
0d60: 20 73 68 6f 75 6c 64 20 62 65 20 63 72 65 61 74   should be creat
0d70: 65 64 2c 20 62 75 74 20 77 65 20 73 68 6f 75 6c  ed, but we shoul
0d80: 64 20 62 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20  d be.** able to 
0d90: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 65 78  read or write ex
0da0: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 73  isting databases
0db0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
0dc0: 68 65 20 62 79 74 65 6f 72 64 65 72 2e 0a 2a 2f  he byteorder..*/
0dd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0de0: 45 53 54 0a 69 6e 74 20 62 74 72 65 65 5f 6e 61  EST.int btree_na
0df0: 74 69 76 65 5f 62 79 74 65 5f 6f 72 64 65 72 20  tive_byte_order 
0e00: 3d 20 31 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  = 1;.#else.# def
0e10: 69 6e 65 20 62 74 72 65 65 5f 6e 61 74 69 76 65  ine btree_native
0e20: 5f 62 79 74 65 5f 6f 72 64 65 72 20 31 0a 23 65  _byte_order 1.#e
0e30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
0e40: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
0e50: 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 20 75   of structures u
0e60: 73 65 64 20 6f 6e 6c 79 20 69 6e 20 74 68 69 73  sed only in this
0e70: 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65   file..*/.typede
0e80: 66 20 73 74 72 75 63 74 20 50 61 67 65 4f 6e 65  f struct PageOne
0e90: 20 50 61 67 65 4f 6e 65 3b 0a 74 79 70 65 64 65   PageOne;.typede
0ea0: 66 20 73 74 72 75 63 74 20 4d 65 6d 50 61 67 65  f struct MemPage
0eb0: 20 4d 65 6d 50 61 67 65 3b 0a 74 79 70 65 64 65   MemPage;.typede
0ec0: 66 20 73 74 72 75 63 74 20 50 61 67 65 48 64 72  f struct PageHdr
0ed0: 20 50 61 67 65 48 64 72 3b 0a 74 79 70 65 64 65   PageHdr;.typede
0ee0: 66 20 73 74 72 75 63 74 20 43 65 6c 6c 20 43 65  f struct Cell Ce
0ef0: 6c 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ll;.typedef stru
0f00: 63 74 20 43 65 6c 6c 48 64 72 20 43 65 6c 6c 48  ct CellHdr CellH
0f10: 64 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  dr;.typedef stru
0f20: 63 74 20 46 72 65 65 42 6c 6b 20 46 72 65 65 42  ct FreeBlk FreeB
0f30: 6c 6b 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  lk;.typedef stru
0f40: 63 74 20 4f 76 65 72 66 6c 6f 77 50 61 67 65 20  ct OverflowPage 
0f50: 4f 76 65 72 66 6c 6f 77 50 61 67 65 3b 0a 74 79  OverflowPage;.ty
0f60: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 72 65  pedef struct Fre
0f70: 65 6c 69 73 74 49 6e 66 6f 20 46 72 65 65 6c 69  elistInfo Freeli
0f80: 73 74 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 41  stInfo;../*.** A
0f90: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ll structures on
0fa0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
0fb0: 20 61 72 65 20 61 6c 69 67 6e 65 64 20 74 6f 20   are aligned to 
0fc0: 34 2d 62 79 74 65 20 62 6f 75 6e 64 72 69 65 73  4-byte boundries
0fd0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
0fe0: 65 20 72 6f 75 6e 64 73 20 75 70 20 61 20 6e 75  e rounds up a nu
0ff0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1000: 20 74 68 65 20 6e 65 78 74 20 6d 75 6c 74 69 70   the next multip
1010: 6c 65 20 6f 66 20 34 2e 0a 2a 2a 0a 2a 2a 20 54  le of 4..**.** T
1020: 68 69 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74  his might need t
1030: 6f 20 63 68 61 6e 67 65 20 66 6f 72 20 63 6f 6d  o change for com
1040: 70 75 74 65 72 20 61 72 63 68 69 74 65 63 74 75  puter architectu
1050: 72 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65  res that require
1060: 0a 2a 2a 20 61 6e 64 20 38 2d 62 79 74 65 20 61  .** and 8-byte a
1070: 6c 69 67 6e 6d 65 6e 74 20 62 6f 75 6e 64 72 79  lignment boundry
1080: 20 66 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e   for structures.
1090: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e  .*/.#define ROUN
10a0: 44 55 50 28 58 29 20 20 28 28 58 2b 33 29 20 26  DUP(X)  ((X+3) &
10b0: 20 7e 33 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   ~3)../*.** This
10c0: 20 69 73 20 61 20 6d 61 67 69 63 20 73 74 72 69   is a magic stri
10d0: 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ng that appears 
10e0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10f0: 20 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c   of every.** SQL
1100: 69 74 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  ite database in 
1110: 6f 72 64 65 72 20 74 6f 20 69 64 65 6e 74 69 66  order to identif
1120: 79 20 74 68 65 20 66 69 6c 65 20 61 73 20 61 20  y the file as a 
1130: 72 65 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a  real database..*
1140: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
1150: 68 61 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72  har zMagicHeader
1160: 5b 5d 20 3d 20 0a 20 20 20 22 2a 2a 20 54 68 69  [] = .   "** Thi
1170: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
1180: 61 6e 20 53 51 4c 69 74 65 20 32 2e 31 20 64 61  an SQLite 2.1 da
1190: 74 61 62 61 73 65 20 2a 2a 22 3b 0a 23 64 65 66  tabase **";.#def
11a0: 69 6e 65 20 4d 41 47 49 43 5f 53 49 5a 45 20 28  ine MAGIC_SIZE (
11b0: 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
11c0: 64 65 72 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  der))../*.** Thi
11d0: 73 20 69 73 20 61 20 6d 61 67 69 63 20 69 6e 74  s is a magic int
11e0: 65 67 65 72 20 61 6c 73 6f 20 75 73 65 64 20 74  eger also used t
11f0: 6f 20 74 65 73 74 20 74 68 65 20 69 6e 74 65 67  o test the integ
1200: 72 69 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  rity of the data
1210: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 20 20 54  base.** file.  T
1220: 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 20 75  his integer is u
1230: 73 65 64 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  sed in addition 
1240: 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 61 62  to the string ab
1250: 6f 76 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 69  ove so that.** i
1260: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 77 72  f the file is wr
1270: 69 74 74 65 6e 20 6f 6e 20 61 20 6c 69 74 74 6c  itten on a littl
1280: 65 2d 65 6e 64 69 61 6e 20 61 72 63 68 69 74 65  e-endian archite
1290: 63 74 75 72 65 20 61 6e 64 20 72 65 61 64 0a 2a  cture and read.*
12a0: 2a 20 6f 6e 20 61 20 62 69 67 2d 65 6e 64 69 61  * on a big-endia
12b0: 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 73 20  n architectures 
12c0: 28 6f 72 20 76 69 63 65 20 76 65 72 73 61 29 20  (or vice versa) 
12d0: 77 65 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  we can detect th
12e0: 65 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2a  e.** problem..**
12f0: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 75  .** The number u
1300: 73 65 64 20 77 61 73 20 6f 62 74 61 69 6e 65 64  sed was obtained
1310: 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 68   at random and h
1320: 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 0a 2a 2a  as no special.**
1330: 20 73 69 67 6e 69 66 69 63 61 6e 63 65 20 6f 74   significance ot
1340: 68 65 72 20 74 68 61 6e 20 74 68 65 20 66 61 63  her than the fac
1350: 74 20 74 68 61 74 20 69 74 20 72 65 70 72 65 73  t that it repres
1360: 65 6e 74 73 20 61 20 64 69 66 66 65 72 65 6e 74  ents a different
1370: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6f 6e 20 6c  .** integer on l
1380: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64  ittle-endian and
1390: 20 62 69 67 2d 65 6e 64 69 61 6e 20 6d 61 63 68   big-endian mach
13a0: 69 6e 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ines..*/.#define
13b0: 20 4d 41 47 49 43 20 30 78 64 61 65 33 37 35 32   MAGIC 0xdae3752
13c0: 38 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  8../*.** The fir
13d0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
13e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 6f 6e  atabase file con
13f0: 74 61 69 6e 73 20 61 20 6d 61 67 69 63 20 68 65  tains a magic he
1400: 61 64 65 72 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ader string.** t
1410: 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 66  o identify the f
1420: 69 6c 65 20 61 73 20 61 6e 20 53 51 4c 69 74 65  ile as an SQLite
1430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1440: 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
1450: 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  s.** a pointer t
1460: 6f 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  o the first free
1470: 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1480: 65 2e 20 20 50 61 67 65 20 32 20 63 6f 6e 74 61  e.  Page 2 conta
1490: 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
14a0: 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
14b0: 20 42 54 72 65 65 2e 20 20 54 68 65 20 66 69 6c   BTree.  The fil
14c0: 65 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  e might contain 
14d0: 6f 74 68 65 72 20 42 54 72 65 65 73 0a 2a 2a 20  other BTrees.** 
14e0: 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 73 20  rooted on pages 
14f0: 61 62 6f 76 65 20 32 2e 0a 2a 2a 0a 2a 2a 20 54  above 2..**.** T
1500: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 6c  he first page al
1510: 73 6f 20 63 6f 6e 74 61 69 6e 73 20 53 51 4c 49  so contains SQLI
1520: 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20  TE_N_BTREE_META 
1530: 69 6e 74 65 67 65 72 73 20 74 68 61 74 0a 2a 2a  integers that.**
1540: 20 63 61 6e 20 62 65 20 75 73 65 64 20 62 79 20   can be used by 
1550: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  higher-level rou
1560: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d  tines..**.** Rem
1570: 65 6d 62 65 72 20 74 68 61 74 20 70 61 67 65 73  ember that pages
1580: 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 62 65   are numbered be
1590: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 31 2e 20  ginning with 1. 
15a0: 20 28 53 65 65 20 70 61 67 65 72 2e 63 0a 2a 2a   (See pager.c.**
15b0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 20 20 50  information.)  P
15d0: 61 67 65 20 30 20 64 6f 65 73 20 6e 6f 74 20 65  age 0 does not e
15e0: 78 69 73 74 20 61 6e 64 20 61 20 70 61 67 65 0a  xist and a page.
15f0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 30 20 69  ** number of 0 i
1600: 73 20 75 73 65 64 20 74 6f 20 6d 65 61 6e 20 22  s used to mean "
1610: 6e 6f 20 73 75 63 68 20 70 61 67 65 22 2e 0a 2a  no such page"..*
1620: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 4f 6e 65  /.struct PageOne
1630: 20 7b 0a 20 20 63 68 61 72 20 7a 4d 61 67 69 63   {.  char zMagic
1640: 5b 4d 41 47 49 43 5f 53 49 5a 45 5d 3b 20 2f 2a  [MAGIC_SIZE]; /*
1650: 20 53 74 72 69 6e 67 20 74 68 61 74 20 69 64 65   String that ide
1660: 6e 74 69 66 69 65 73 20 74 68 65 20 66 69 6c 65  ntifies the file
1670: 20 61 73 20 61 20 64 61 74 61 62 61 73 65 20 2a   as a database *
1680: 2f 0a 20 20 69 6e 74 20 69 4d 61 67 69 63 3b 20  /.  int iMagic; 
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a0: 49 6e 74 65 67 65 72 20 74 6f 20 76 65 72 69 66  Integer to verif
16b0: 79 20 63 6f 72 72 65 63 74 20 62 79 74 65 20 6f  y correct byte o
16c0: 72 64 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 66  rder */.  Pgno f
16d0: 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
16e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
16f0: 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73 74 20   page in a list 
1700: 6f 66 20 61 6c 6c 20 66 72 65 65 20 70 61 67 65  of all free page
1710: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  s */.  int nFree
1720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1740: 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  es on the free l
1750: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 61 4d 65  ist */.  int aMe
1760: 74 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  ta[SQLITE_N_BTRE
1770: 45 5f 4d 45 54 41 2d 31 5d 3b 20 20 2f 2a 20 55  E_META-1];  /* U
1780: 73 65 72 20 64 65 66 69 6e 65 64 20 69 6e 74 65  ser defined inte
1790: 67 65 72 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  gers */.};../*.*
17a0: 2a 20 45 61 63 68 20 64 61 74 61 62 61 73 65 20  * Each database 
17b0: 70 61 67 65 20 68 61 73 20 61 20 68 65 61 64 65  page has a heade
17c0: 72 20 74 68 61 74 20 69 73 20 61 6e 20 69 6e 73  r that is an ins
17d0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  tance of this.**
17e0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
17f0: 2a 20 50 61 67 65 48 64 72 2e 66 69 72 73 74 46  * PageHdr.firstF
1800: 72 65 65 20 69 73 20 30 20 69 66 20 74 68 65 72  ree is 0 if ther
1810: 65 20 69 73 20 6e 6f 20 66 72 65 65 20 73 70 61  e is no free spa
1820: 63 65 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ce on this page.
1830: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 50  .** Otherwise, P
1840: 61 67 65 48 64 72 2e 66 69 72 73 74 46 72 65 65  ageHdr.firstFree
1850: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e   is the index in
1860: 20 4d 65 6d 50 61 67 65 2e 75 2e 61 44 69 73 6b   MemPage.u.aDisk
1870: 5b 5d 20 6f 66 20 61 20 0a 2a 2a 20 46 72 65 65  [] of a .** Free
1880: 42 6c 6b 20 73 74 72 75 63 74 75 72 65 20 74 68  Blk structure th
1890: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
18a0: 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 6f 66 20   first block of 
18b0: 66 72 65 65 20 73 70 61 63 65 2e 20 20 0a 2a 2a  free space.  .**
18c0: 20 41 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   All free space 
18d0: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 61 20  is defined by a 
18e0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 46  linked list of F
18f0: 72 65 65 42 6c 6b 20 73 74 72 75 63 74 75 72 65  reeBlk structure
1900: 73 2e 0a 2a 2a 0a 2a 2a 20 44 61 74 61 20 69 73  s..**.** Data is
1910: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6c 69 6e   stored in a lin
1920: 6b 65 64 20 6c 69 73 74 20 6f 66 20 43 65 6c 6c  ked list of Cell
1930: 20 73 74 72 75 63 74 75 72 65 73 2e 20 20 50 61   structures.  Pa
1940: 67 65 48 64 72 2e 66 69 72 73 74 43 65 6c 6c 0a  geHdr.firstCell.
1950: 2a 2a 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  ** is the index 
1960: 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 75 2e 61  into MemPage.u.a
1970: 44 69 73 6b 5b 5d 20 6f 66 20 74 68 65 20 66 69  Disk[] of the fi
1980: 72 73 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  rst cell on the 
1990: 70 61 67 65 2e 20 20 54 68 65 0a 2a 2a 20 43 65  page.  The.** Ce
19a0: 6c 6c 73 20 61 72 65 20 6b 65 70 74 20 69 6e 20  lls are kept in 
19b0: 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2a  sorted order..**
19c0: 0a 2a 2a 20 41 20 43 65 6c 6c 20 63 6f 6e 74 61  .** A Cell conta
19d0: 69 6e 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ins all informat
19e0: 69 6f 6e 20 61 62 6f 75 74 20 61 20 64 61 74 61  ion about a data
19f0: 62 61 73 65 20 65 6e 74 72 79 20 61 6e 64 20 61  base entry and a
1a00: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
1a10: 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 61 74   child page that
1a20: 20 63 6f 6e 74 61 69 6e 73 20 6f 74 68 65 72 20   contains other 
1a30: 65 6e 74 72 69 65 73 20 6c 65 73 73 20 74 68 61  entries less tha
1a40: 6e 20 69 74 73 65 6c 66 2e 20 20 49 6e 0a 2a 2a  n itself.  In.**
1a50: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1a60: 65 20 69 2d 74 68 20 43 65 6c 6c 20 63 6f 6e 74  e i-th Cell cont
1a70: 61 69 6e 73 20 62 6f 74 68 20 50 74 72 28 69 29  ains both Ptr(i)
1a80: 20 61 6e 64 20 4b 65 79 28 69 29 2e 20 20 54 68   and Key(i).  Th
1a90: 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
1aa0: 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 70  pointer of the p
1ab0: 61 67 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  age is contained
1ac0: 20 69 6e 20 50 61 67 65 48 64 72 2e 72 69 67 68   in PageHdr.righ
1ad0: 74 43 68 69 6c 64 2e 0a 2a 2f 0a 73 74 72 75 63  tChild..*/.struc
1ae0: 74 20 50 61 67 65 48 64 72 20 7b 0a 20 20 50 67  t PageHdr {.  Pg
1af0: 6e 6f 20 72 69 67 68 74 43 68 69 6c 64 3b 20 20  no rightChild;  
1b00: 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 74 68  /* Child page th
1b10: 61 74 20 63 6f 6d 65 73 20 61 66 74 65 72 20 61  at comes after a
1b20: 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73  ll cells on this
1b30: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 66   page */.  u16 f
1b40: 69 72 73 74 43 65 6c 6c 3b 20 20 20 20 2f 2a 20  irstCell;    /* 
1b50: 49 6e 64 65 78 20 69 6e 20 4d 65 6d 50 61 67 65  Index in MemPage
1b60: 2e 75 2e 61 44 69 73 6b 5b 5d 20 6f 66 20 74 68  .u.aDisk[] of th
1b70: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 2a 2f 0a  e first cell */.
1b80: 20 20 75 31 36 20 66 69 72 73 74 46 72 65 65 3b    u16 firstFree;
1b90: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1ba0: 4d 65 6d 50 61 67 65 2e 75 2e 61 44 69 73 6b 5b  MemPage.u.aDisk[
1bb0: 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66  ] of the first f
1bc0: 72 65 65 20 62 6c 6f 63 6b 20 2a 2f 0a 7d 3b 0a  ree block */.};.
1bd0: 0a 2f 2a 0a 2a 2a 20 45 6e 74 72 69 65 73 20 6f  ./*.** Entries o
1be0: 6e 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20  n a page of the 
1bf0: 64 61 74 61 62 61 73 65 20 61 72 65 20 63 61 6c  database are cal
1c00: 6c 65 64 20 22 43 65 6c 6c 73 22 2e 20 20 45 61  led "Cells".  Ea
1c10: 63 68 20 43 65 6c 6c 0a 2a 2a 20 68 61 73 20 61  ch Cell.** has a
1c20: 20 68 65 61 64 65 72 20 61 6e 64 20 64 61 74 61   header and data
1c30: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
1c40: 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 68 65  e defines the he
1c50: 61 64 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6b 65  ader.  The.** ke
1c60: 79 20 61 6e 64 20 64 61 74 61 20 28 63 6f 6c 6c  y and data (coll
1c70: 65 63 74 69 76 65 6c 79 20 74 68 65 20 22 70 61  ectively the "pa
1c80: 79 6c 6f 61 64 22 29 20 66 6f 6c 6c 6f 77 20 74  yload") follow t
1c90: 68 69 73 20 68 65 61 64 65 72 20 6f 6e 0a 2a 2a  his header on.**
1ca0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
1cb0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 65 66 69  ge..**.** A defi
1cc0: 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  nition of the co
1cd0: 6d 70 6c 65 74 65 20 43 65 6c 6c 20 73 74 72 75  mplete Cell stru
1ce0: 63 74 75 72 65 20 69 73 20 67 69 76 65 6e 20 62  cture is given b
1cf0: 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 68 65  elow.  The.** he
1d00: 61 64 65 72 20 66 6f 72 20 74 68 65 20 63 65 6c  ader for the cel
1d10: 6c 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  l must be define
1d20: 64 20 66 69 72 73 74 20 69 6e 20 6f 72 64 65 72  d first in order
1d30: 20 74 6f 20 64 6f 20 73 6f 6d 65 0a 2a 2a 20 6f   to do some.** o
1d40: 66 20 74 68 65 20 73 69 7a 69 6e 67 20 23 64 65  f the sizing #de
1d50: 66 69 6e 65 73 20 74 68 61 74 20 66 6f 6c 6c 6f  fines that follo
1d60: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 43 65 6c  w..*/.struct Cel
1d70: 6c 48 64 72 20 7b 0a 20 20 50 67 6e 6f 20 6c 65  lHdr {.  Pgno le
1d80: 66 74 43 68 69 6c 64 3b 20 2f 2a 20 43 68 69 6c  ftChild; /* Chil
1d90: 64 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  d page that come
1da0: 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 65  s before this ce
1db0: 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79  ll */.  u16 nKey
1dc0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
1dd0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
1de0: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 31 36 20 69  e key */.  u16 i
1df0: 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Next;      /* In
1e00: 64 65 78 20 69 6e 20 4d 65 6d 50 61 67 65 2e 75  dex in MemPage.u
1e10: 2e 61 44 69 73 6b 5b 5d 20 6f 66 20 6e 65 78 74  .aDisk[] of next
1e20: 20 63 65 6c 6c 20 69 6e 20 73 6f 72 74 65 64 20   cell in sorted 
1e30: 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 6e 4b  order */.  u8 nK
1e40: 65 79 48 69 3b 20 20 20 20 20 20 2f 2a 20 55 70  eyHi;      /* Up
1e50: 70 65 72 20 38 20 62 69 74 73 20 6f 66 20 6b 65  per 8 bits of ke
1e60: 79 20 73 69 7a 65 20 66 6f 72 20 6b 65 79 73 20  y size for keys 
1e70: 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b 20  larger than 64K 
1e80: 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 6e 44  bytes */.  u8 nD
1e90: 61 74 61 48 69 3b 20 20 20 20 20 2f 2a 20 55 70  ataHi;     /* Up
1ea0: 70 65 72 20 38 20 62 69 74 73 20 6f 66 20 64 61  per 8 bits of da
1eb0: 74 61 20 73 69 7a 65 20 77 68 65 6e 20 74 68 65  ta size when the
1ec0: 20 73 69 7a 65 20 69 73 20 6d 6f 72 65 20 74 68   size is more th
1ed0: 61 6e 20 36 34 4b 20 2a 2f 0a 20 20 75 31 36 20  an 64K */.  u16 
1ee0: 6e 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e  nData;      /* N
1ef0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1f00: 66 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  f data */.};../*
1f10: 0a 2a 2a 20 54 68 65 20 6b 65 79 20 61 6e 64 20  .** The key and 
1f20: 64 61 74 61 20 73 69 7a 65 20 61 72 65 20 73 70  data size are sp
1f30: 6c 69 74 20 69 6e 74 6f 20 61 20 6c 6f 77 65 72  lit into a lower
1f40: 20 31 36 2d 62 69 74 20 73 65 67 6d 65 6e 74 20   16-bit segment 
1f50: 61 6e 64 20 61 6e 0a 2a 2a 20 75 70 70 65 72 20  and an.** upper 
1f60: 38 2d 62 69 74 20 73 65 67 6d 65 6e 74 20 69 6e  8-bit segment in
1f70: 20 6f 72 64 65 72 20 74 6f 20 70 61 63 6b 20 74   order to pack t
1f80: 68 65 6d 20 74 6f 67 65 74 68 65 72 20 69 6e 74  hem together int
1f90: 6f 20 61 20 73 6d 61 6c 6c 65 72 0a 2a 2a 20 73  o a smaller.** s
1fa0: 70 61 63 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  pace.  The follo
1fb0: 77 69 6e 67 20 6d 61 63 72 6f 73 20 72 65 61 73  wing macros reas
1fc0: 73 65 6d 62 6c 79 20 61 20 6b 65 79 20 6f 72 20  sembly a key or 
1fd0: 64 61 74 61 20 73 69 7a 65 20 62 61 63 6b 0a 2a  data size back.*
1fe0: 2a 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  * into an intege
1ff0: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4b  r..*/.#define NK
2000: 45 59 28 62 2c 68 29 20 20 28 53 57 41 42 31 36  EY(b,h)  (SWAB16
2010: 28 62 2c 68 2e 6e 4b 65 79 29 20 2b 20 68 2e 6e  (b,h.nKey) + h.n
2020: 4b 65 79 48 69 2a 36 35 35 33 36 29 0a 23 64 65  KeyHi*65536).#de
2030: 66 69 6e 65 20 4e 44 41 54 41 28 62 2c 68 29 20  fine NDATA(b,h) 
2040: 28 53 57 41 42 31 36 28 62 2c 68 2e 6e 44 61 74  (SWAB16(b,h.nDat
2050: 61 29 20 2b 20 68 2e 6e 44 61 74 61 48 69 2a 36  a) + h.nDataHi*6
2060: 35 35 33 36 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  5536)../*.** The
2070: 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
2080: 20 61 20 63 6f 6d 70 6c 65 74 65 20 43 65 6c 6c   a complete Cell
2090: 2e 20 20 54 68 65 20 43 65 6c 6c 20 6d 75 73 74  .  The Cell must
20a0: 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65   contain a heade
20b0: 72 0a 2a 2a 20 61 6e 64 20 61 74 20 6c 65 61 73  r.** and at leas
20c0: 74 20 34 20 62 79 74 65 73 20 6f 66 20 70 61 79  t 4 bytes of pay
20d0: 6c 6f 61 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  load..*/.#define
20e0: 20 4d 49 4e 5f 43 45 4c 4c 5f 53 49 5a 45 20 20   MIN_CELL_SIZE  
20f0: 28 73 69 7a 65 6f 66 28 43 65 6c 6c 48 64 72 29  (sizeof(CellHdr)
2100: 2b 34 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  +4)../*.** The m
2110: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2120: 20 64 61 74 61 62 61 73 65 20 65 6e 74 72 69 65   database entrie
2130: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 68 65  s that can be he
2140: 6c 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ld in a single.*
2150: 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
2160: 74 61 62 61 73 65 2e 20 0a 2a 2f 0a 23 64 65 66  tabase. .*/.#def
2170: 69 6e 65 20 4d 58 5f 43 45 4c 4c 20 28 28 53 51  ine MX_CELL ((SQ
2180: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2d 73  LITE_PAGE_SIZE-s
2190: 69 7a 65 6f 66 28 50 61 67 65 48 64 72 29 29 2f  izeof(PageHdr))/
21a0: 4d 49 4e 5f 43 45 4c 4c 5f 53 49 5a 45 29 0a 0a  MIN_CELL_SIZE)..
21b0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 6d 6f 75 6e 74  /*.** The amount
21c0: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
21d0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
21e0: 65 20 6f 66 20 74 68 65 20 42 54 72 65 65 2e 20  e of the BTree. 
21f0: 20 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20   This is the.** 
2200: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
2210: 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
2220: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  the page header.
2230: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 53 41 42  .*/.#define USAB
2240: 4c 45 5f 53 50 41 43 45 20 20 28 53 51 4c 49 54  LE_SPACE  (SQLIT
2250: 45 5f 50 41 47 45 5f 53 49 5a 45 20 2d 20 73 69  E_PAGE_SIZE - si
2260: 7a 65 6f 66 28 50 61 67 65 48 64 72 29 29 0a 0a  zeof(PageHdr))..
2270: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
2280: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
2290: 6f 61 64 20 28 69 6e 20 62 79 74 65 73 29 20 74  oad (in bytes) t
22a0: 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  hat can be store
22b0: 64 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 2a 2a  d locally for.**
22c0: 20 61 20 64 61 74 61 62 61 73 65 20 65 6e 74 72   a database entr
22d0: 79 2e 20 20 49 66 20 74 68 65 20 65 6e 74 72 79  y.  If the entry
22e0: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 64   contains more d
22f0: 61 74 61 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ata than this, t
2300: 68 65 0a 2a 2a 20 65 78 74 72 61 20 67 6f 65 73  he.** extra goes
2310: 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
2320: 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ages..**.** This
2330: 20 6e 75 6d 62 65 72 20 69 73 20 63 68 6f 73 65   number is chose
2340: 6e 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  n so that at lea
2350: 73 74 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20  st 4 cells will 
2360: 66 69 74 20 6f 6e 20 65 76 65 72 79 20 70 61 67  fit on every pag
2370: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  e..*/.#define MX
2380: 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 20 28  _LOCAL_PAYLOAD (
2390: 28 55 53 41 42 4c 45 5f 53 50 41 43 45 2f 34 2d  (USABLE_SPACE/4-
23a0: 28 73 69 7a 65 6f 66 28 43 65 6c 6c 48 64 72 29  (sizeof(CellHdr)
23b0: 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 29 26  +sizeof(Pgno)))&
23c0: 7e 33 29 0a 0a 2f 2a 0a 2a 2a 20 44 61 74 61 20  ~3)../*.** Data 
23d0: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 70 61  on a database pa
23e0: 67 65 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  ge is stored as 
23f0: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
2400: 20 43 65 6c 6c 20 73 74 72 75 63 74 75 72 65 73   Cell structures
2410: 2e 0a 2a 2a 20 42 6f 74 68 20 74 68 65 20 6b 65  ..** Both the ke
2420: 79 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 61  y and the data a
2430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 50 61  re stored in aPa
2440: 79 6c 6f 61 64 5b 5d 2e 20 20 54 68 65 20 6b 65  yload[].  The ke
2450: 79 20 61 6c 77 61 79 73 20 63 6f 6d 65 73 0a 2a  y always comes.*
2460: 2a 20 66 69 72 73 74 2e 20 20 54 68 65 20 61 50  * first.  The aP
2470: 61 79 6c 6f 61 64 5b 5d 20 66 69 65 6c 64 20 67  ayload[] field g
2480: 72 6f 77 73 20 61 73 20 6e 65 63 65 73 73 61 72  rows as necessar
2490: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6b 65  y to hold the ke
24a0: 79 20 61 6e 64 20 64 61 74 61 2c 0a 2a 2a 20 75  y and data,.** u
24b0: 70 20 74 6f 20 61 20 6d 61 78 69 6d 75 6d 20 6f  p to a maximum o
24c0: 66 20 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f  f MX_LOCAL_PAYLO
24d0: 41 44 20 62 79 74 65 73 2e 20 20 49 66 20 74 68  AD bytes.  If th
24e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65  e size of the ke
24f0: 79 20 61 6e 64 0a 2a 2a 20 64 61 74 61 20 63 6f  y and.** data co
2500: 6d 62 69 6e 65 64 20 65 78 63 65 65 64 73 20 4d  mbined exceeds M
2510: 58 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 20  X_LOCAL_PAYLOAD 
2520: 62 79 74 65 73 2c 20 74 68 65 6e 20 43 65 6c 6c  bytes, then Cell
2530: 2e 6f 76 66 6c 20 69 73 20 74 68 65 0a 2a 2a 20  .ovfl is the.** 
2540: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2550: 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
2560: 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  w page..**.** Th
2570: 6f 75 67 68 20 74 68 69 73 20 73 74 72 75 63 74  ough this struct
2580: 75 72 65 20 69 73 20 66 69 78 65 64 20 69 6e 20  ure is fixed in 
2590: 73 69 7a 65 2c 20 74 68 65 20 43 65 6c 6c 20 6f  size, the Cell o
25a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
25b0: 2a 20 70 61 67 65 20 76 61 72 69 65 73 20 69 6e  * page varies in
25c0: 20 73 69 7a 65 2e 20 20 45 76 65 72 79 20 63 65   size.  Every ce
25d0: 6c 6c 20 68 61 73 20 61 20 43 65 6c 6c 48 64 72  ll has a CellHdr
25e0: 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20 34 20   and at least 4 
25f0: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 70 61 79 6c  bytes.** of payl
2600: 6f 61 64 20 73 70 61 63 65 2e 20 20 41 64 64 69  oad space.  Addi
2610: 74 69 6f 6e 61 6c 20 70 61 79 6c 6f 61 64 20 62  tional payload b
2620: 79 74 65 73 20 28 75 70 20 74 6f 20 74 68 65 20  ytes (up to the 
2630: 6d 61 78 69 6d 75 6d 20 6f 66 0a 2a 2a 20 4d 58  maximum of.** MX
2640: 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 29 20  _LOCAL_PAYLOAD) 
2650: 61 6e 64 20 74 68 65 20 43 65 6c 6c 2e 6f 76 66  and the Cell.ovf
2660: 6c 20 76 61 6c 75 65 20 61 72 65 20 61 6c 6c 6f  l value are allo
2670: 63 61 74 65 64 20 6f 6e 6c 79 20 61 73 0a 2a 2a  cated only as.**
2680: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 72 75   needed..*/.stru
2690: 63 74 20 43 65 6c 6c 20 7b 0a 20 20 43 65 6c 6c  ct Cell {.  Cell
26a0: 48 64 72 20 68 3b 20 20 20 20 20 20 20 20 20 20  Hdr h;          
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 54 68 65 20 63 65 6c 6c 20 68 65 61 64 65 72   The cell header
26d0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 79 6c   */.  char aPayl
26e0: 6f 61 64 5b 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59  oad[MX_LOCAL_PAY
26f0: 4c 4f 41 44 5d 3b 20 20 2f 2a 20 4b 65 79 20 61  LOAD];  /* Key a
2700: 6e 64 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  nd data */.  Pgn
2710: 6f 20 6f 76 66 6c 3b 20 20 20 20 20 20 20 20 20  o ovfl;         
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 54 68 65 20 66 69 72 73 74 20 6f 76 65 72  * The first over
2740: 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a  flow page */.};.
2750: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 73 70 61 63  ./*.** Free spac
2760: 65 20 6f 6e 20 61 20 70 61 67 65 20 69 73 20 72  e on a page is r
2770: 65 6d 65 6d 62 65 72 65 64 20 75 73 69 6e 67 20  emembered using 
2780: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
2790: 20 74 68 65 20 46 72 65 65 42 6c 6b 0a 2a 2a 20   the FreeBlk.** 
27a0: 73 74 72 75 63 74 75 72 65 73 2e 20 20 53 70 61  structures.  Spa
27b0: 63 65 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ce on a database
27c0: 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
27d0: 65 64 20 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ed in increments
27e0: 20 6f 66 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20   of.** at least 
27f0: 34 20 62 79 74 65 73 20 61 6e 64 20 69 73 20 61  4 bytes and is a
2800: 6c 77 61 79 73 20 61 6c 69 67 6e 65 64 20 74 6f  lways aligned to
2810: 20 61 20 34 2d 62 79 74 65 20 62 6f 75 6e 64 72   a 4-byte boundr
2820: 79 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6e 6b 65  y.  The.** linke
2830: 64 20 6c 69 73 74 20 6f 66 20 46 72 65 65 42 6c  d list of FreeBl
2840: 6b 73 20 69 73 20 61 6c 77 61 79 73 20 6b 65 70  ks is always kep
2850: 74 20 69 6e 20 6f 72 64 65 72 20 62 79 20 61 64  t in order by ad
2860: 64 72 65 73 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  dress..*/.struct
2870: 20 46 72 65 65 42 6c 6b 20 7b 0a 20 20 75 31 36   FreeBlk {.  u16
2880: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 2f 2a 20   iSize;      /* 
2890: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
28a0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 6f 66  in this block of
28b0: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
28c0: 20 75 31 36 20 69 4e 65 78 74 3b 20 20 20 20 20   u16 iNext;     
28d0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 4d 65 6d   /* Index in Mem
28e0: 50 61 67 65 2e 75 2e 61 44 69 73 6b 5b 5d 20 6f  Page.u.aDisk[] o
28f0: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 20  f the next free 
2900: 62 6c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  block */.};../*.
2910: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2920: 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
2930: 64 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  d that will fit 
2940: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  on a single over
2950: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 23 64  flow page..*/.#d
2960: 65 66 69 6e 65 20 4f 56 45 52 46 4c 4f 57 5f 53  efine OVERFLOW_S
2970: 49 5a 45 20 28 53 51 4c 49 54 45 5f 50 41 47 45  IZE (SQLITE_PAGE
2980: 5f 53 49 5a 45 2d 73 69 7a 65 6f 66 28 50 67 6e  _SIZE-sizeof(Pgn
2990: 6f 29 29 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  o))../*.** When 
29a0: 74 68 65 20 6b 65 79 20 61 6e 64 20 64 61 74 61  the key and data
29b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 6e   for a single en
29c0: 74 72 79 20 69 6e 20 74 68 65 20 42 54 72 65 65  try in the BTree
29d0: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 69 6e   will not fit in
29e0: 0a 2a 2a 20 74 68 65 20 4d 58 5f 4c 4f 43 41 4c  .** the MX_LOCAL
29f0: 5f 50 41 59 4c 4f 41 44 20 62 79 74 65 73 20 6f  _PAYLOAD bytes o
2a00: 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
2a10: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
2a20: 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  e page,.** then 
2a30: 61 6c 6c 20 65 78 74 72 61 20 62 79 74 65 73 20  all extra bytes 
2a40: 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61  are written to a
2a50: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
2a60: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
2a70: 2a 2a 20 45 61 63 68 20 6f 76 65 72 66 6c 6f 77  ** Each overflow
2a80: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 73 74   page is an inst
2a90: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2aa0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
2ab0: 0a 2a 2a 0a 2a 2a 20 55 6e 75 73 65 64 20 70 61  .**.** Unused pa
2ac0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
2ad0: 61 73 65 20 61 72 65 20 61 6c 73 6f 20 72 65 70  ase are also rep
2ae0: 72 65 73 65 6e 74 65 64 20 62 79 20 69 6e 73 74  resented by inst
2af0: 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  ances of.** the 
2b00: 4f 76 65 72 66 6c 6f 77 50 61 67 65 20 73 74 72  OverflowPage str
2b10: 75 63 74 75 72 65 2e 20 20 54 68 65 20 50 61 67  ucture.  The Pag
2b20: 65 4f 6e 65 2e 66 72 65 65 4c 69 73 74 20 66 69  eOne.freeList fi
2b30: 65 6c 64 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  eld is the.** pa
2b40: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2b50: 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 61   first page in a
2b60: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
2b70: 75 6e 75 73 65 64 20 64 61 74 61 62 61 73 65 0a  unused database.
2b80: 2a 2a 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 72  ** pages..*/.str
2b90: 75 63 74 20 4f 76 65 72 66 6c 6f 77 50 61 67 65  uct OverflowPage
2ba0: 20 7b 0a 20 20 50 67 6e 6f 20 69 4e 65 78 74 3b   {.  Pgno iNext;
2bb0: 0a 20 20 63 68 61 72 20 61 50 61 79 6c 6f 61 64  .  char aPayload
2bc0: 5b 4f 56 45 52 46 4c 4f 57 5f 53 49 5a 45 5d 3b  [OVERFLOW_SIZE];
2bd0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50  .};../*.** The P
2be0: 61 67 65 4f 6e 65 2e 66 72 65 65 4c 69 73 74 20  ageOne.freeList 
2bf0: 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20  field points to 
2c00: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
2c10: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
2c20: 2a 2a 20 68 6f 6c 64 20 69 6e 66 6f 72 6d 61 74  ** hold informat
2c30: 69 6f 6e 20 61 62 6f 75 74 20 66 72 65 65 20 70  ion about free p
2c40: 61 67 65 73 2e 20 20 54 68 65 20 61 50 61 79 6c  ages.  The aPayl
2c50: 6f 61 64 20 73 65 63 74 69 6f 6e 20 6f 66 20 65  oad section of e
2c60: 61 63 68 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  ach.** overflow 
2c70: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  page contains an
2c80: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2c90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2ca0: 74 75 72 65 2e 20 20 54 68 65 0a 2a 2a 20 61 46  ture.  The.** aF
2cb0: 72 65 65 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64  ree[] array hold
2cc0: 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
2cd0: 72 20 6f 66 20 6e 46 72 65 65 20 75 6e 75 73 65  r of nFree unuse
2ce0: 64 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  d pages in the d
2cf0: 69 73 6b 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  isk.** file..*/.
2d00: 73 74 72 75 63 74 20 46 72 65 65 6c 69 73 74 49  struct FreelistI
2d10: 6e 66 6f 20 7b 0a 20 20 69 6e 74 20 6e 46 72 65  nfo {.  int nFre
2d20: 65 3b 0a 20 20 50 67 6e 6f 20 61 46 72 65 65 5b  e;.  Pgno aFree[
2d30: 28 4f 56 45 52 46 4c 4f 57 5f 53 49 5a 45 2d 73  (OVERFLOW_SIZE-s
2d40: 69 7a 65 6f 66 28 69 6e 74 29 29 2f 73 69 7a 65  izeof(int))/size
2d50: 6f 66 28 50 67 6e 6f 29 5d 3b 0a 7d 3b 0a 0a 2f  of(Pgno)];.};../
2d60: 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 70  *.** For every p
2d70: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2d80: 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 69 6e 73  ase file, an ins
2d90: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2da0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2db0: 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
2dc0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 65 20 75 2e   memory.  The u.
2dd0: 61 44 69 73 6b 5b 5d 20 61 72 72 61 79 20 63 6f  aDisk[] array co
2de0: 6e 74 61 69 6e 73 20 74 68 65 20 72 61 77 20 62  ntains the raw b
2df0: 69 74 73 20 72 65 61 64 20 66 72 6f 6d 0a 2a 2a  its read from.**
2e00: 20 74 68 65 20 64 69 73 6b 2e 20 20 54 68 65 20   the disk.  The 
2e10: 72 65 73 74 20 69 73 20 61 75 78 69 6c 69 61 72  rest is auxiliar
2e20: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65  y information he
2e30: 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 6e 6c  ld in memory onl
2e40: 79 2e 20 54 68 65 0a 2a 2a 20 61 75 78 69 6c 69  y. The.** auxili
2e50: 61 72 79 20 69 6e 66 6f 20 69 73 20 6f 6e 6c 79  ary info is only
2e60: 20 76 61 6c 69 64 20 66 6f 72 20 72 65 67 75 6c   valid for regul
2e70: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
2e80: 73 20 2d 20 69 74 20 69 73 20 6e 6f 74 0a 2a 2a  s - it is not.**
2e90: 20 75 73 65 64 20 66 6f 72 20 6f 76 65 72 66 6c   used for overfl
2ea0: 6f 77 20 70 61 67 65 73 20 61 6e 64 20 70 61 67  ow pages and pag
2eb0: 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2ec0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f 66 20 70 61 72  st..**.** Of par
2ed0: 74 69 63 75 6c 61 72 20 69 6e 74 65 72 65 73 74  ticular interest
2ee0: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
2ef0: 79 20 69 6e 66 6f 20 69 73 20 74 68 65 20 61 70  y info is the ap
2f00: 43 65 6c 6c 5b 5d 20 65 6e 74 72 79 2e 20 20 45  Cell[] entry.  E
2f10: 61 63 68 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  ach.** apCell[] 
2f20: 65 6e 74 72 79 20 69 73 20 61 20 70 6f 69 6e 74  entry is a point
2f30: 65 72 20 74 6f 20 61 20 43 65 6c 6c 20 73 74 72  er to a Cell str
2f40: 75 63 74 75 72 65 20 69 6e 20 75 2e 61 44 69 73  ucture in u.aDis
2f50: 6b 5b 5d 2e 20 20 54 68 65 20 63 65 6c 6c 73 20  k[].  The cells 
2f60: 61 72 65 0a 2a 2a 20 70 75 74 20 69 6e 20 74 68  are.** put in th
2f70: 69 73 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  is array so that
2f80: 20 74 68 65 79 20 63 61 6e 20 62 65 20 61 63 63   they can be acc
2f90: 65 73 73 65 64 20 69 6e 20 63 6f 6e 73 74 61 6e  essed in constan
2fa0: 74 20 74 69 6d 65 2c 20 72 61 74 68 65 72 0a 2a  t time, rather.*
2fb0: 2a 20 74 68 61 6e 20 69 6e 20 6c 69 6e 65 61 72  * than in linear
2fc0: 20 74 69 6d 65 20 77 68 69 63 68 20 77 6f 75 6c   time which woul
2fd0: 64 20 62 65 20 6e 65 65 64 65 64 20 69 66 20 77  d be needed if w
2fe0: 65 20 68 61 64 20 74 6f 20 77 61 6c 6b 20 74 68  e had to walk th
2ff0: 65 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  e linked .** lis
3000: 74 20 6f 6e 20 65 76 65 72 79 20 61 63 63 65 73  t on every acces
3010: 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  s..**.** Note th
3020: 61 74 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  at apCell[] cont
3030: 61 69 6e 73 20 65 6e 6f 75 67 68 20 73 70 61 63  ains enough spac
3040: 65 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 6f 20  e to hold up to 
3050: 74 77 6f 20 6d 6f 72 65 20 43 65 6c 6c 73 0a 2a  two more Cells.*
3060: 2a 20 74 68 61 6e 20 63 61 6e 20 70 6f 73 73 69  * than can possi
3070: 62 6c 79 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  bly fit on one p
3080: 61 67 65 2e 20 20 49 6e 20 74 68 65 20 73 74 65  age.  In the ste
3090: 61 64 79 20 73 74 61 74 65 2c 20 65 76 65 72 79  ady state, every
30a0: 20 61 70 43 65 6c 6c 5b 5d 0a 2a 2a 20 70 6f 69   apCell[].** poi
30b0: 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 69 6e  nts to memory in
30c0: 73 69 64 65 20 75 2e 61 44 69 73 6b 5b 5d 2e 20  side u.aDisk[]. 
30d0: 20 42 75 74 20 69 6e 20 74 68 65 20 6d 69 64 64   But in the midd
30e0: 6c 65 20 6f 66 20 61 6e 20 69 6e 73 65 72 74 0a  le of an insert.
30f0: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ** operation, so
3100: 6d 65 20 61 70 43 65 6c 6c 5b 5d 20 65 6e 74 72  me apCell[] entr
3110: 69 65 73 20 6d 61 79 20 74 65 6d 70 6f 72 61 72  ies may temporar
3120: 69 6c 79 20 70 6f 69 6e 74 20 74 6f 20 64 61 74  ily point to dat
3130: 61 20 73 70 61 63 65 0a 2a 2a 20 6f 75 74 73 69  a space.** outsi
3140: 64 65 20 6f 66 20 75 2e 61 44 69 73 6b 5b 5d 2e  de of u.aDisk[].
3150: 20 20 54 68 69 73 20 69 73 20 61 20 74 72 61 6e    This is a tran
3160: 73 69 65 6e 74 20 73 69 74 75 61 74 69 6f 6e 20  sient situation 
3170: 74 68 61 74 20 69 73 20 71 75 69 63 6b 6c 79 0a  that is quickly.
3180: 2a 2a 20 72 65 73 6f 6c 76 65 64 2e 20 20 42 75  ** resolved.  Bu
3190: 74 20 77 68 69 6c 65 20 69 74 20 69 73 20 68 61  t while it is ha
31a0: 70 70 65 6e 69 6e 67 2c 20 69 74 20 69 73 20 70  ppening, it is p
31b0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 64 61  ossible for a da
31c0: 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 20 74  tabase.** page t
31d0: 6f 20 68 6f 6c 64 20 61 73 20 6d 61 6e 79 20 61  o hold as many a
31e0: 73 20 74 77 6f 20 6d 6f 72 65 20 63 65 6c 6c 73  s two more cells
31f0: 20 74 68 61 6e 20 69 74 20 6d 69 67 68 74 20 6f   than it might o
3200: 74 68 65 72 77 69 73 65 20 68 6f 6c 64 2e 0a 2a  therwise hold..*
3210: 2a 20 54 68 65 20 65 78 74 72 61 20 74 77 6f 20  * The extra two 
3220: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 43 65 6c  entries in apCel
3230: 6c 5b 5d 20 61 72 65 20 61 6e 20 61 6c 6c 6f 77  l[] are an allow
3240: 61 6e 63 65 20 66 6f 72 20 74 68 69 73 20 73 69  ance for this si
3250: 74 75 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  tuation..**.** T
3260: 68 65 20 70 50 61 72 65 6e 74 20 66 69 65 6c 64  he pParent field
3270: 20 70 6f 69 6e 74 73 20 62 61 63 6b 20 74 6f 20   points back to 
3280: 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
3290: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 75 73    This allows us
32a0: 20 74 6f 0a 2a 2a 20 77 61 6c 6b 20 75 70 20 74   to.** walk up t
32b0: 68 65 20 42 54 72 65 65 20 66 72 6f 6d 20 61 6e  he BTree from an
32c0: 79 20 6c 65 61 66 20 74 6f 20 74 68 65 20 72 6f  y leaf to the ro
32d0: 6f 74 2e 20 20 43 61 72 65 20 6d 75 73 74 20 62  ot.  Care must b
32e0: 65 20 74 61 6b 65 6e 20 74 6f 0a 2a 2a 20 75 6e  e taken to.** un
32f0: 72 65 66 28 29 20 74 68 65 20 70 61 72 65 6e 74  ref() the parent
3300: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 77 68   page pointer wh
3310: 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
3320: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 66 65 72 65  no longer refere
3330: 6e 63 65 64 2e 0a 2a 2a 20 54 68 65 20 70 61 67  nced..** The pag
3340: 65 44 65 73 74 72 75 63 74 6f 72 28 29 20 72 6f  eDestructor() ro
3350: 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 74 68  utine handles th
3360: 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 73 74 72  at chore..*/.str
3370: 75 63 74 20 4d 65 6d 50 61 67 65 20 7b 0a 20 20  uct MemPage {.  
3380: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 63 68 61 72  union {.    char
3390: 20 61 44 69 73 6b 5b 53 51 4c 49 54 45 5f 50 41   aDisk[SQLITE_PA
33a0: 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 50 61  GE_SIZE];  /* Pa
33b0: 67 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  ge data stored o
33c0: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 50 61  n disk */.    Pa
33d0: 67 65 48 64 72 20 68 64 72 3b 20 20 20 20 20 20  geHdr hdr;      
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f0: 4f 76 65 72 6c 61 79 20 70 61 67 65 20 68 65 61  Overlay page hea
3400: 64 65 72 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20  der */.  } u;.  
3410: 75 38 20 69 73 49 6e 69 74 3b 20 20 20 20 20 20  u8 isInit;      
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3430: 2a 20 54 72 75 65 20 69 66 20 61 75 78 69 6c 69  * True if auxili
3440: 61 72 79 20 64 61 74 61 20 69 73 20 69 6e 69 74  ary data is init
3450: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 75 38 20  ialized */.  u8 
3460: 69 64 78 53 68 69 66 74 3b 20 20 20 20 20 20 20  idxShift;       
3470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3480: 72 75 65 20 69 66 20 61 70 43 65 6c 6c 5b 5d 20  rue if apCell[] 
3490: 69 6e 64 69 63 65 73 20 68 61 76 65 20 63 68 61  indices have cha
34a0: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 4f  nged */.  u8 isO
34b0: 76 65 72 66 75 6c 6c 3b 20 20 20 20 20 20 20 20  verfull;        
34c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65           /* Some
34d0: 20 61 70 43 65 6c 6c 5b 5d 20 70 6f 69 6e 74 73   apCell[] points
34e0: 20 6f 75 74 73 69 64 65 20 75 2e 61 44 69 73 6b   outside u.aDisk
34f0: 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
3500: 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
3510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
3520: 72 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  rent of this pag
3530: 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f  e.  NULL for roo
3540: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 50 61  t */.  int idxPa
3550: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
3560: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
3570: 6e 20 70 50 61 72 65 6e 74 2d 3e 61 70 43 65 6c  n pParent->apCel
3580: 6c 5b 5d 20 6f 66 20 74 68 69 73 20 6e 6f 64 65  l[] of this node
3590: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35c0: 66 20 66 72 65 65 20 62 79 74 65 73 20 69 6e 20  f free bytes in 
35d0: 75 2e 61 44 69 73 6b 5b 5d 20 2a 2f 0a 20 20 69  u.aDisk[] */.  i
35e0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3600: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
3610: 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  es on this page 
3620: 2a 2f 0a 20 20 43 65 6c 6c 20 2a 61 70 43 65 6c  */.  Cell *apCel
3630: 6c 5b 4d 58 5f 43 45 4c 4c 2b 32 5d 3b 20 20 20  l[MX_CELL+2];   
3640: 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20      /* All data 
3650: 65 6e 74 69 72 65 73 20 69 6e 20 73 6f 72 74 65  entires in sorte
3660: 64 20 6f 72 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f  d order */.};../
3670: 2a 0a 2a 2a 20 54 68 65 20 69 6e 2d 6d 65 6d 6f  *.** The in-memo
3680: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 64 69  ry image of a di
3690: 73 6b 20 70 61 67 65 20 68 61 73 20 74 68 65 20  sk page has the 
36a0: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
36b0: 61 74 69 6f 6e 20 61 70 70 65 6e 64 65 64 0a 2a  ation appended.*
36c0: 2a 20 74 6f 20 74 68 65 20 65 6e 64 2e 20 20 45  * to the end.  E
36d0: 58 54 52 41 5f 53 49 5a 45 20 69 73 20 74 68 65  XTRA_SIZE is the
36e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
36f0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
3700: 20 74 6f 20 68 6f 6c 64 0a 2a 2a 20 74 68 61 74   to hold.** that
3710: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
3720: 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 45  on..*/.#define E
3730: 58 54 52 41 5f 53 49 5a 45 20 28 73 69 7a 65 6f  XTRA_SIZE (sizeo
3740: 66 28 4d 65 6d 50 61 67 65 29 2d 53 51 4c 49 54  f(MemPage)-SQLIT
3750: 45 5f 50 41 47 45 5f 53 49 5a 45 29 0a 0a 2f 2a  E_PAGE_SIZE)../*
3760: 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77  .** Everything w
3770: 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 61  e need to know a
3780: 62 6f 75 74 20 61 6e 20 6f 70 65 6e 20 64 61 74  bout an open dat
3790: 61 62 61 73 65 0a 2a 2f 0a 73 74 72 75 63 74 20  abase.*/.struct 
37a0: 42 74 72 65 65 20 7b 0a 20 20 42 74 4f 70 73 20  Btree {.  BtOps 
37b0: 2a 70 4f 70 73 3b 20 20 20 20 20 20 20 20 20 20  *pOps;          
37c0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 61 62 6c  /* Function tabl
37d0: 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  e */.  Pager *pP
37e0: 61 67 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ager;        /* 
37f0: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 2a  The page cache *
3800: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
3810: 75 72 73 6f 72 3b 20 20 20 20 2f 2a 20 41 20 6c  ursor;    /* A l
3820: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
3830: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 50 61 67  cursors */.  Pag
3840: 65 4f 6e 65 20 2a 70 61 67 65 31 3b 20 20 20 20  eOne *page1;    
3850: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
3860: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3870: 20 2a 2f 0a 20 20 75 38 20 69 6e 54 72 61 6e 73   */.  u8 inTrans
3880: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
3890: 72 75 65 20 69 66 20 61 20 74 72 61 6e 73 61 63  rue if a transac
38a0: 74 69 6f 6e 20 69 73 20 69 6e 20 70 72 6f 67 72  tion is in progr
38b0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b  ess */.  u8 inCk
38c0: 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pt;            /
38d0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
38e0: 69 73 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  is a checkpoint 
38f0: 6f 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  on the transacti
3900: 6f 6e 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  on */.  u8 readO
3910: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nly;          /*
3920: 20 54 72 75 65 20 69 66 20 74 68 65 20 75 6e 64   True if the und
3930: 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 73 20  erlying file is 
3940: 72 65 61 64 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38  readonly */.  u8
3950: 20 6e 65 65 64 53 77 61 62 3b 20 20 20 20 20 20   needSwab;      
3960: 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 62      /* Need to b
3970: 79 74 65 2d 73 77 61 70 70 69 6e 67 20 2a 2f 0a  yte-swapping */.
3980: 7d 3b 0a 74 79 70 65 64 65 66 20 42 74 72 65 65  };.typedef Btree
3990: 20 42 74 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75   Bt;../*.** A cu
39a0: 72 73 6f 72 20 69 73 20 61 20 70 6f 69 6e 74 65  rsor is a pointe
39b0: 72 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  r to a particula
39c0: 72 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 42  r entry in the B
39d0: 54 72 65 65 2e 0a 2a 2a 20 54 68 65 20 65 6e 74  Tree..** The ent
39e0: 72 79 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  ry is identified
39f0: 20 62 79 20 69 74 73 20 4d 65 6d 50 61 67 65 20   by its MemPage 
3a00: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
3a10: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 43 65  .** MemPage.apCe
3a20: 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 65 6e 74 72  ll[] of the entr
3a30: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74 43  y..*/.struct BtC
3a40: 75 72 73 6f 72 20 7b 0a 20 20 42 74 43 75 72 73  ursor {.  BtCurs
3a50: 6f 72 4f 70 73 20 2a 70 4f 70 73 3b 20 20 20 20  orOps *pOps;    
3a60: 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
3a70: 74 61 62 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  table */.  Btree
3a80: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
3a90: 20 20 20 20 20 2f 2a 20 54 68 65 20 42 74 72 65       /* The Btre
3aa0: 65 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  e to which this 
3ab0: 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a  cursor belongs *
3ac0: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 4e  /.  BtCursor *pN
3ad0: 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f 2a  ext, *pPrev;  /*
3ae0: 20 46 6f 72 6d 73 20 61 20 6c 69 6e 6b 65 64 20   Forms a linked 
3af0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 75 72 73  list of all curs
3b00: 6f 72 73 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ors */.  BtCurso
3b10: 72 20 2a 70 53 68 61 72 65 64 3b 20 20 20 20 20  r *pShared;     
3b20: 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 66 20 63 75     /* Loop of cu
3b30: 72 73 6f 72 73 20 77 69 74 68 20 74 68 65 20 73  rsors with the s
3b40: 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f  ame root page */
3b50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
3b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3b70: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
3b80: 20 74 68 69 73 20 74 72 65 65 20 2a 2f 0a 20 20   this tree */.  
3b90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
3ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3bb0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
3bc0: 74 68 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  the entry */.  i
3bd0: 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
3be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
3bf0: 78 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 69  x of the entry i
3c00: 6e 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b  n pPage->apCell[
3c10: 5d 20 2a 2f 0a 20 20 75 38 20 77 72 46 6c 61 67  ] */.  u8 wrFlag
3c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c30: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 69 74   /* True if writ
3c40: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 65 53 6b  able */.  u8 eSk
3c50: 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
3c60: 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
3c70: 73 20 69 66 20 6e 65 78 74 20 73 74 65 70 20 6f  s if next step o
3c80: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 6e 6f  peration is a no
3c90: 2d 6f 70 20 2a 2f 0a 20 20 75 38 20 69 4d 61 74  -op */.  u8 iMat
3ca0: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
3cb0: 20 20 20 2f 2a 20 63 6f 6d 70 61 72 65 20 72 65     /* compare re
3cc0: 73 75 6c 74 20 66 72 6f 6d 20 6c 61 73 74 20 73  sult from last s
3cd0: 71 6c 69 74 65 42 74 72 65 65 4d 6f 76 65 74 6f  qliteBtreeMoveto
3ce0: 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  () */.};../*.** 
3cf0: 4c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  Legal values for
3d00: 20 42 74 43 75 72 73 6f 72 2e 65 53 6b 69 70 2e   BtCursor.eSkip.
3d10: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 4b 49 50  .*/.#define SKIP
3d20: 5f 4e 4f 4e 45 20 20 20 20 20 30 20 20 20 2f 2a  _NONE     0   /*
3d30: 20 41 6c 77 61 79 73 20 73 74 65 70 20 74 68 65   Always step the
3d40: 20 63 75 72 73 6f 72 20 2a 2f 0a 23 64 65 66 69   cursor */.#defi
3d50: 6e 65 20 53 4b 49 50 5f 4e 45 58 54 20 20 20 20  ne SKIP_NEXT    
3d60: 20 31 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74   1   /* The next
3d70: 20 73 71 6c 69 74 65 42 74 72 65 65 4e 65 78 74   sqliteBtreeNext
3d80: 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f  () is a no-op */
3d90: 0a 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 50 52  .#define SKIP_PR
3da0: 45 56 20 20 20 20 20 32 20 20 20 2f 2a 20 54 68  EV     2   /* Th
3db0: 65 20 6e 65 78 74 20 73 71 6c 69 74 65 42 74 72  e next sqliteBtr
3dc0: 65 65 50 72 65 76 69 6f 75 73 28 29 20 69 73 20  eePrevious() is 
3dd0: 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 64 65 66 69  a no-op */.#defi
3de0: 6e 65 20 53 4b 49 50 5f 49 4e 56 41 4c 49 44 20  ne SKIP_INVALID 
3df0: 20 33 20 20 20 2f 2a 20 43 61 6c 6c 73 20 74 6f   3   /* Calls to
3e00: 20 4e 65 78 74 28 29 20 61 6e 64 20 50 72 65 76   Next() and Prev
3e10: 69 6f 75 73 28 29 20 61 72 65 20 69 6e 76 61 6c  ious() are inval
3e20: 69 64 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  id */../* Forwar
3e30: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d declarations *
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
3e50: 65 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  eBtreeCloseCurso
3e60: 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
3e70: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  );../*.** Routin
3e80: 65 73 20 66 6f 72 20 62 79 74 65 20 73 77 61 70  es for byte swap
3e90: 70 69 6e 67 2e 0a 2a 2f 0a 75 31 36 20 73 77 61  ping..*/.u16 swa
3ea0: 62 31 36 28 75 31 36 20 78 29 7b 0a 20 20 72 65  b16(u16 x){.  re
3eb0: 74 75 72 6e 20 28 28 78 20 26 20 30 78 66 66 29  turn ((x & 0xff)
3ec0: 3c 3c 38 29 20 7c 20 28 28 78 3e 3e 38 29 26 30  <<8) | ((x>>8)&0
3ed0: 78 66 66 29 3b 0a 7d 0a 75 33 32 20 73 77 61 62  xff);.}.u32 swab
3ee0: 33 32 28 75 33 32 20 78 29 7b 0a 20 20 72 65 74  32(u32 x){.  ret
3ef0: 75 72 6e 20 28 28 78 20 26 20 30 78 66 66 29 3c  urn ((x & 0xff)<
3f00: 3c 32 34 29 20 7c 20 28 28 78 20 26 20 30 78 66  <24) | ((x & 0xf
3f10: 66 30 30 29 3c 3c 38 29 20 7c 0a 20 20 20 20 20  f00)<<8) |.     
3f20: 20 20 20 20 28 28 78 3e 3e 38 29 20 26 20 30 78      ((x>>8) & 0x
3f30: 66 66 30 30 29 20 7c 20 28 28 78 3e 3e 32 34 29  ff00) | ((x>>24)
3f40: 26 30 78 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &0xff);.}../*.**
3f50: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
3f60: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
3f70: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
3f80: 65 65 64 73 20 6f 6e 20 74 68 65 20 6d 61 69 6e  eeds on the main
3f90: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67  .** database pag
3fa0: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  e.  The number r
3fb0: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
3fc0: 20 74 68 65 20 43 65 6c 6c 20 68 65 61 64 65 72   the Cell header
3fd0: 2c 0a 2a 2a 20 6c 6f 63 61 6c 20 70 61 79 6c 6f  ,.** local paylo
3fe0: 61 64 20 73 74 6f 72 61 67 65 2c 20 61 6e 64 20  ad storage, and 
3ff0: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 6f  the pointer to o
4000: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 28 69  verflow pages (i
4010: 66 0a 2a 2a 20 61 70 70 6c 69 63 61 62 6c 65 29  f.** applicable)
4020: 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 73 70  .  Additional sp
4030: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  ace allocated on
4040: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
4050: 2a 2a 20 69 73 20 4e 4f 54 20 69 6e 63 6c 75 64  ** is NOT includ
4060: 65 64 20 69 6e 20 74 68 65 20 76 61 6c 75 65 20  ed in the value 
4070: 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
4080: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
4090: 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69  tatic int cellSi
40a0: 7a 65 28 42 74 72 65 65 20 2a 70 42 74 2c 20 43  ze(Btree *pBt, C
40b0: 65 6c 6c 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69  ell *pCell){.  i
40c0: 6e 74 20 6e 20 3d 20 4e 4b 45 59 28 70 42 74 2c  nt n = NKEY(pBt,
40d0: 20 70 43 65 6c 6c 2d 3e 68 29 20 2b 20 4e 44 41   pCell->h) + NDA
40e0: 54 41 28 70 42 74 2c 20 70 43 65 6c 6c 2d 3e 68  TA(pBt, pCell->h
40f0: 29 3b 0a 20 20 69 66 28 20 6e 3e 4d 58 5f 4c 4f  );.  if( n>MX_LO
4100: 43 41 4c 5f 50 41 59 4c 4f 41 44 20 29 7b 0a 20  CAL_PAYLOAD ){. 
4110: 20 20 20 6e 20 3d 20 4d 58 5f 4c 4f 43 41 4c 5f     n = MX_LOCAL_
4120: 50 41 59 4c 4f 41 44 20 2b 20 73 69 7a 65 6f 66  PAYLOAD + sizeof
4130: 28 50 67 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  (Pgno);.  }else{
4140: 0a 20 20 20 20 6e 20 3d 20 52 4f 55 4e 44 55 50  .    n = ROUNDUP
4150: 28 6e 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  (n);.  }.  n += 
4160: 73 69 7a 65 6f 66 28 43 65 6c 6c 48 64 72 29 3b  sizeof(CellHdr);
4170: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
4180: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
4190: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
41a0: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
41b0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
41c0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
41d0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
41e0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
41f0: 65 63 74 65 64 20 0a 2a 2a 20 69 6e 74 6f 20 6f  ected .** into o
4200: 6e 65 20 62 69 67 20 46 72 65 65 42 6c 6b 20 61  ne big FreeBlk a
4210: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4220: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
4230: 20 76 6f 69 64 20 64 65 66 72 61 67 6d 65 6e 74   void defragment
4240: 50 61 67 65 28 42 74 72 65 65 20 2a 70 42 74 2c  Page(Btree *pBt,
4250: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29   MemPage *pPage)
4260: 7b 0a 20 20 69 6e 74 20 70 63 2c 20 69 2c 20 6e  {.  int pc, i, n
4270: 3b 0a 20 20 46 72 65 65 42 6c 6b 20 2a 70 46 42  ;.  FreeBlk *pFB
4280: 6c 6b 3b 0a 20 20 63 68 61 72 20 6e 65 77 50 61  lk;.  char newPa
4290: 67 65 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ge[SQLITE_PAGE_S
42a0: 49 5a 45 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  IZE];..  assert(
42b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77   sqlitepager_isw
42c0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 29 20  riteable(pPage) 
42d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
42e0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
42f0: 70 63 20 3d 20 73 69 7a 65 6f 66 28 50 61 67 65  pc = sizeof(Page
4300: 48 64 72 29 3b 0a 20 20 70 50 61 67 65 2d 3e 75  Hdr);.  pPage->u
4310: 2e 68 64 72 2e 66 69 72 73 74 43 65 6c 6c 20 3d  .hdr.firstCell =
4320: 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 63 29   SWAB16(pBt, pc)
4330: 3b 0a 20 20 6d 65 6d 63 70 79 28 6e 65 77 50 61  ;.  memcpy(newPa
4340: 67 65 2c 20 70 50 61 67 65 2d 3e 75 2e 61 44 69  ge, pPage->u.aDi
4350: 73 6b 2c 20 70 63 29 3b 0a 20 20 66 6f 72 28 69  sk, pc);.  for(i
4360: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
4370: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 65  ll; i++){.    Ce
4380: 6c 6c 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  ll *pCell = pPag
4390: 65 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 0a 20  e->apCell[i];.. 
43a0: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
43b0: 6e 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ne should never 
43c0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
43d0: 6f 76 65 72 66 75 6c 6c 20 70 61 67 65 2e 20 20  overfull page.  
43e0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
43f0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
4400: 69 66 79 20 74 68 61 74 20 63 6f 6e 73 74 72 61  ify that constra
4410: 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  int. */.    asse
4420: 72 74 28 20 41 64 64 72 28 70 43 65 6c 6c 29 20  rt( Addr(pCell) 
4430: 3e 20 41 64 64 72 28 70 50 61 67 65 29 20 29 3b  > Addr(pPage) );
4440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 41 64 64  .    assert( Add
4450: 72 28 70 43 65 6c 6c 29 20 3c 20 41 64 64 72 28  r(pCell) < Addr(
4460: 70 50 61 67 65 29 20 2b 20 53 51 4c 49 54 45 5f  pPage) + SQLITE_
4470: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 0a 20 20  PAGE_SIZE );..  
4480: 20 20 6e 20 3d 20 63 65 6c 6c 53 69 7a 65 28 70    n = cellSize(p
4490: 42 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  Bt, pCell);.    
44a0: 70 43 65 6c 6c 2d 3e 68 2e 69 4e 65 78 74 20 3d  pCell->h.iNext =
44b0: 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 63 20   SWAB16(pBt, pc 
44c0: 2b 20 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  + n);.    memcpy
44d0: 28 26 6e 65 77 50 61 67 65 5b 70 63 5d 2c 20 70  (&newPage[pc], p
44e0: 43 65 6c 6c 2c 20 6e 29 3b 0a 20 20 20 20 70 50  Cell, n);.    pP
44f0: 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20 3d  age->apCell[i] =
4500: 20 28 43 65 6c 6c 2a 29 26 70 50 61 67 65 2d 3e   (Cell*)&pPage->
4510: 75 2e 61 44 69 73 6b 5b 70 63 5d 3b 0a 20 20 20  u.aDisk[pc];.   
4520: 20 70 63 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20   pc += n;.  }.  
4530: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
4540: 46 72 65 65 3d 3d 53 51 4c 49 54 45 5f 50 41 47  Free==SQLITE_PAG
4550: 45 5f 53 49 5a 45 2d 70 63 20 29 3b 0a 20 20 6d  E_SIZE-pc );.  m
4560: 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 75 2e 61  emcpy(pPage->u.a
4570: 44 69 73 6b 2c 20 6e 65 77 50 61 67 65 2c 20 70  Disk, newPage, p
4580: 63 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  c);.  if( pPage-
4590: 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
45a0: 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 70 50  pPage->apCell[pP
45b0: 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 5d 2d 3e 68  age->nCell-1]->h
45c0: 2e 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  .iNext = 0;.  }.
45d0: 20 20 70 46 42 6c 6b 20 3d 20 28 46 72 65 65 42    pFBlk = (FreeB
45e0: 6c 6b 2a 29 26 70 50 61 67 65 2d 3e 75 2e 61 44  lk*)&pPage->u.aD
45f0: 69 73 6b 5b 70 63 5d 3b 0a 20 20 70 46 42 6c 6b  isk[pc];.  pFBlk
4600: 2d 3e 69 53 69 7a 65 20 3d 20 53 57 41 42 31 36  ->iSize = SWAB16
4610: 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 50 41 47  (pBt, SQLITE_PAG
4620: 45 5f 53 49 5a 45 20 2d 20 70 63 29 3b 0a 20 20  E_SIZE - pc);.  
4630: 70 46 42 6c 6b 2d 3e 69 4e 65 78 74 20 3d 20 30  pFBlk->iNext = 0
4640: 3b 0a 20 20 70 50 61 67 65 2d 3e 75 2e 68 64 72  ;.  pPage->u.hdr
4650: 2e 66 69 72 73 74 46 72 65 65 20 3d 20 53 57 41  .firstFree = SWA
4660: 42 31 36 28 70 42 74 2c 20 70 63 29 3b 0a 20 20  B16(pBt, pc);.  
4670: 6d 65 6d 73 65 74 28 26 70 46 42 6c 6b 5b 31 5d  memset(&pFBlk[1]
4680: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  , 0, SQLITE_PAGE
4690: 5f 53 49 5a 45 20 2d 20 70 63 20 2d 20 73 69 7a  _SIZE - pc - siz
46a0: 65 6f 66 28 46 72 65 65 42 6c 6b 29 29 3b 0a 7d  eof(FreeBlk));.}
46b0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
46c0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
46d0: 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e  space on a page.
46e0: 20 20 6e 42 79 74 65 20 6d 75 73 74 20 62 65 20    nByte must be 
46f0: 61 20 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 6f  a .** multiple o
4700: 66 20 34 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  f 4..**.** Retur
4710: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  n the index into
4720: 20 70 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b 5b   pPage->u.aDisk[
4730: 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  ] of the first b
4740: 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  yte of.** the ne
4750: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72  w allocation. Or
4760: 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
4770: 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
4780: 20 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f   free.** space o
4790: 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61  n the page to sa
47a0: 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61  tisfy the alloca
47b0: 74 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a  tion request..**
47c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
47d0: 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20  contains nBytes 
47e0: 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75  of free space bu
47f0: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
4800: 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20  in.** nBytes of 
4810: 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20  contiguous free 
4820: 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73  space, then this
4830: 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74   routine automat
4840: 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20  ically.** calls 
4850: 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28  defragementPage(
4860: 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65  ) to consolidate
4870: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
4880: 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63  before .** alloc
4890: 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68  ating the new ch
48a0: 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  unk..*/.static i
48b0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
48c0: 28 42 74 72 65 65 20 2a 70 42 74 2c 20 4d 65 6d  (Btree *pBt, Mem
48d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
48e0: 20 6e 42 79 74 65 29 7b 0a 20 20 46 72 65 65 42   nByte){.  FreeB
48f0: 6c 6b 20 2a 70 3b 0a 20 20 75 31 36 20 2a 70 49  lk *p;.  u16 *pI
4900: 64 78 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 3b  dx;.  int start;
4910: 0a 20 20 69 6e 74 20 69 53 69 7a 65 3b 0a 23 69  .  int iSize;.#i
4920: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
4930: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  nt cnt = 0;.#end
4940: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  if..  assert( sq
4950: 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69 74  litepager_iswrit
4960: 65 61 62 6c 65 28 70 50 61 67 65 29 20 29 3b 0a  eable(pPage) );.
4970: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3d    assert( nByte=
4980: 3d 52 4f 55 4e 44 55 50 28 6e 42 79 74 65 29 20  =ROUNDUP(nByte) 
4990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
49a0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
49b0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  if( pPage->nFree
49c0: 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67 65 2d  <nByte || pPage-
49d0: 3e 69 73 4f 76 65 72 66 75 6c 6c 20 29 20 72 65  >isOverfull ) re
49e0: 74 75 72 6e 20 30 3b 0a 20 20 70 49 64 78 20 3d  turn 0;.  pIdx =
49f0: 20 26 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 66   &pPage->u.hdr.f
4a00: 69 72 73 74 46 72 65 65 3b 0a 20 20 70 20 3d 20  irstFree;.  p = 
4a10: 28 46 72 65 65 42 6c 6b 2a 29 26 70 50 61 67 65  (FreeBlk*)&pPage
4a20: 2d 3e 75 2e 61 44 69 73 6b 5b 53 57 41 42 31 36  ->u.aDisk[SWAB16
4a30: 28 70 42 74 2c 20 2a 70 49 64 78 29 5d 3b 0a 20  (pBt, *pIdx)];. 
4a40: 20 77 68 69 6c 65 28 20 28 69 53 69 7a 65 20 3d   while( (iSize =
4a50: 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 2d 3e   SWAB16(pBt, p->
4a60: 69 53 69 7a 65 29 29 3c 6e 42 79 74 65 20 29 7b  iSize))<nByte ){
4a70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
4a80: 2b 2b 20 3c 20 53 51 4c 49 54 45 5f 50 41 47 45  ++ < SQLITE_PAGE
4a90: 5f 53 49 5a 45 2f 34 20 29 3b 0a 20 20 20 20 69  _SIZE/4 );.    i
4aa0: 66 28 20 70 2d 3e 69 4e 65 78 74 3d 3d 30 20 29  f( p->iNext==0 )
4ab0: 7b 0a 20 20 20 20 20 20 64 65 66 72 61 67 6d 65  {.      defragme
4ac0: 6e 74 50 61 67 65 28 70 42 74 2c 20 70 50 61 67  ntPage(pBt, pPag
4ad0: 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d  e);.      pIdx =
4ae0: 20 26 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 66   &pPage->u.hdr.f
4af0: 69 72 73 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  irstFree;.    }e
4b00: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78 20  lse{.      pIdx 
4b10: 3d 20 26 70 2d 3e 69 4e 65 78 74 3b 0a 20 20 20  = &p->iNext;.   
4b20: 20 7d 0a 20 20 20 20 70 20 3d 20 28 46 72 65 65   }.    p = (Free
4b30: 42 6c 6b 2a 29 26 70 50 61 67 65 2d 3e 75 2e 61  Blk*)&pPage->u.a
4b40: 44 69 73 6b 5b 53 57 41 42 31 36 28 70 42 74 2c  Disk[SWAB16(pBt,
4b50: 20 2a 70 49 64 78 29 5d 3b 0a 20 20 7d 0a 20 20   *pIdx)];.  }.  
4b60: 69 66 28 20 69 53 69 7a 65 3d 3d 6e 42 79 74 65  if( iSize==nByte
4b70: 20 29 7b 0a 20 20 20 20 73 74 61 72 74 20 3d 20   ){.    start = 
4b80: 53 57 41 42 31 36 28 70 42 74 2c 20 2a 70 49 64  SWAB16(pBt, *pId
4b90: 78 29 3b 0a 20 20 20 20 2a 70 49 64 78 20 3d 20  x);.    *pIdx = 
4ba0: 70 2d 3e 69 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->iNext;.  }els
4bb0: 65 7b 0a 20 20 20 20 46 72 65 65 42 6c 6b 20 2a  e{.    FreeBlk *
4bc0: 70 4e 65 77 3b 0a 20 20 20 20 73 74 61 72 74 20  pNew;.    start 
4bd0: 3d 20 53 57 41 42 31 36 28 70 42 74 2c 20 2a 70  = SWAB16(pBt, *p
4be0: 49 64 78 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Idx);.    pNew =
4bf0: 20 28 46 72 65 65 42 6c 6b 2a 29 26 70 50 61 67   (FreeBlk*)&pPag
4c00: 65 2d 3e 75 2e 61 44 69 73 6b 5b 73 74 61 72 74  e->u.aDisk[start
4c10: 20 2b 20 6e 42 79 74 65 5d 3b 0a 20 20 20 20 70   + nByte];.    p
4c20: 4e 65 77 2d 3e 69 4e 65 78 74 20 3d 20 70 2d 3e  New->iNext = p->
4c30: 69 4e 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d  iNext;.    pNew-
4c40: 3e 69 53 69 7a 65 20 3d 20 53 57 41 42 31 36 28  >iSize = SWAB16(
4c50: 70 42 74 2c 20 69 53 69 7a 65 20 2d 20 6e 42 79  pBt, iSize - nBy
4c60: 74 65 29 3b 0a 20 20 20 20 2a 70 49 64 78 20 3d  te);.    *pIdx =
4c70: 20 53 57 41 42 31 36 28 70 42 74 2c 20 73 74 61   SWAB16(pBt, sta
4c80: 72 74 20 2b 20 6e 42 79 74 65 29 3b 0a 20 20 7d  rt + nByte);.  }
4c90: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
4ca0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75  -= nByte;.  retu
4cb0: 72 6e 20 73 74 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a  rn start;.}../*.
4cc0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
4cd0: 69 6f 6e 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ion of the MemPa
4ce0: 67 65 2e 75 2e 61 44 69 73 6b 5b 5d 20 74 6f 20  ge.u.aDisk[] to 
4cf0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
4d00: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
4d10: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
4d20: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
4d30: 75 2e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  u.aDisk[start].*
4d40: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
4d50: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
4d60: 73 69 7a 65 22 20 62 79 74 65 73 2e 20 20 53 69  size" bytes.  Si
4d70: 7a 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20 61 20  ze must be.** a 
4d80: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 2e 0a 2a  multiple of 4..*
4d90: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
4da0: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
4db0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
4dc0: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
4dd0: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
4de0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
4df0: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
4e00: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
4e10: 70 61 63 65 28 42 74 72 65 65 20 2a 70 42 74 2c  pace(Btree *pBt,
4e20: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
4e30: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
4e40: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 65 6e 64  size){.  int end
4e50: 20 3d 20 73 74 61 72 74 20 2b 20 73 69 7a 65 3b   = start + size;
4e60: 0a 20 20 75 31 36 20 2a 70 49 64 78 2c 20 69 64  .  u16 *pIdx, id
4e70: 78 3b 0a 20 20 46 72 65 65 42 6c 6b 20 2a 70 46  x;.  FreeBlk *pF
4e80: 42 6c 6b 3b 0a 20 20 46 72 65 65 42 6c 6b 20 2a  Blk;.  FreeBlk *
4e90: 70 4e 65 77 3b 0a 20 20 46 72 65 65 42 6c 6b 20  pNew;.  FreeBlk 
4ea0: 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 53  *pNext;.  int iS
4eb0: 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
4ec0: 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72  sqlitepager_iswr
4ed0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 29 20 29  iteable(pPage) )
4ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
4ef0: 20 3d 3d 20 52 4f 55 4e 44 55 50 28 73 69 7a 65   == ROUNDUP(size
4f00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
4f10: 74 61 72 74 20 3d 3d 20 52 4f 55 4e 44 55 50 28  tart == ROUNDUP(
4f20: 73 74 61 72 74 29 20 29 3b 0a 20 20 61 73 73 65  start) );.  asse
4f30: 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
4f40: 74 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 26 70  t );.  pIdx = &p
4f50: 50 61 67 65 2d 3e 75 2e 68 64 72 2e 66 69 72 73  Page->u.hdr.firs
4f60: 74 46 72 65 65 3b 0a 20 20 69 64 78 20 3d 20 53  tFree;.  idx = S
4f70: 57 41 42 31 36 28 70 42 74 2c 20 2a 70 49 64 78  WAB16(pBt, *pIdx
4f80: 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 21  );.  while( idx!
4f90: 3d 30 20 26 26 20 69 64 78 3c 73 74 61 72 74 20  =0 && idx<start 
4fa0: 29 7b 0a 20 20 20 20 70 46 42 6c 6b 20 3d 20 28  ){.    pFBlk = (
4fb0: 46 72 65 65 42 6c 6b 2a 29 26 70 50 61 67 65 2d  FreeBlk*)&pPage-
4fc0: 3e 75 2e 61 44 69 73 6b 5b 69 64 78 5d 3b 0a 20  >u.aDisk[idx];. 
4fd0: 20 20 20 69 53 69 7a 65 20 3d 20 53 57 41 42 31     iSize = SWAB1
4fe0: 36 28 70 42 74 2c 20 70 46 42 6c 6b 2d 3e 69 53  6(pBt, pFBlk->iS
4ff0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 69 64  ize);.    if( id
5000: 78 20 2b 20 69 53 69 7a 65 20 3d 3d 20 73 74 61  x + iSize == sta
5010: 72 74 20 29 7b 0a 20 20 20 20 20 20 70 46 42 6c  rt ){.      pFBl
5020: 6b 2d 3e 69 53 69 7a 65 20 3d 20 53 57 41 42 31  k->iSize = SWAB1
5030: 36 28 70 42 74 2c 20 69 53 69 7a 65 20 2b 20 73  6(pBt, iSize + s
5040: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
5050: 69 64 78 20 2b 20 69 53 69 7a 65 20 2b 20 73 69  idx + iSize + si
5060: 7a 65 20 3d 3d 20 53 57 41 42 31 36 28 70 42 74  ze == SWAB16(pBt
5070: 2c 20 70 46 42 6c 6b 2d 3e 69 4e 65 78 74 29 20  , pFBlk->iNext) 
5080: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  ){.        pNext
5090: 20 3d 20 28 46 72 65 65 42 6c 6b 2a 29 26 70 50   = (FreeBlk*)&pP
50a0: 61 67 65 2d 3e 75 2e 61 44 69 73 6b 5b 69 64 78  age->u.aDisk[idx
50b0: 20 2b 20 69 53 69 7a 65 20 2b 20 73 69 7a 65 5d   + iSize + size]
50c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
50d0: 74 2d 3e 6e 65 65 64 53 77 61 62 20 29 7b 0a 20  t->needSwab ){. 
50e0: 20 20 20 20 20 20 20 20 20 70 46 42 6c 6b 2d 3e           pFBlk->
50f0: 69 53 69 7a 65 20 3d 20 73 77 61 62 31 36 28 28  iSize = swab16((
5100: 75 31 36 29 73 77 61 62 31 36 28 70 4e 65 78 74  u16)swab16(pNext
5110: 2d 3e 69 53 69 7a 65 29 2b 69 53 69 7a 65 2b 73  ->iSize)+iSize+s
5120: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ize);.        }e
5130: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
5140: 46 42 6c 6b 2d 3e 69 53 69 7a 65 20 2b 3d 20 70  FBlk->iSize += p
5150: 4e 65 78 74 2d 3e 69 53 69 7a 65 3b 0a 20 20 20  Next->iSize;.   
5160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
5170: 46 42 6c 6b 2d 3e 69 4e 65 78 74 20 3d 20 70 4e  FBlk->iNext = pN
5180: 65 78 74 2d 3e 69 4e 65 78 74 3b 0a 20 20 20 20  ext->iNext;.    
5190: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 2d    }.      pPage-
51a0: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
51b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
51c0: 20 20 7d 0a 20 20 20 20 70 49 64 78 20 3d 20 26    }.    pIdx = &
51d0: 70 46 42 6c 6b 2d 3e 69 4e 65 78 74 3b 0a 20 20  pFBlk->iNext;.  
51e0: 20 20 69 64 78 20 3d 20 53 57 41 42 31 36 28 70    idx = SWAB16(p
51f0: 42 74 2c 20 2a 70 49 64 78 29 3b 0a 20 20 7d 0a  Bt, *pIdx);.  }.
5200: 20 20 70 4e 65 77 20 3d 20 28 46 72 65 65 42 6c    pNew = (FreeBl
5210: 6b 2a 29 26 70 50 61 67 65 2d 3e 75 2e 61 44 69  k*)&pPage->u.aDi
5220: 73 6b 5b 73 74 61 72 74 5d 3b 0a 20 20 69 66 28  sk[start];.  if(
5230: 20 69 64 78 20 21 3d 20 65 6e 64 20 29 7b 0a 20   idx != end ){. 
5240: 20 20 20 70 4e 65 77 2d 3e 69 53 69 7a 65 20 3d     pNew->iSize =
5250: 20 53 57 41 42 31 36 28 70 42 74 2c 20 73 69 7a   SWAB16(pBt, siz
5260: 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4e  e);.    pNew->iN
5270: 65 78 74 20 3d 20 53 57 41 42 31 36 28 70 42 74  ext = SWAB16(pBt
5280: 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  , idx);.  }else{
5290: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 28 46 72  .    pNext = (Fr
52a0: 65 65 42 6c 6b 2a 29 26 70 50 61 67 65 2d 3e 75  eeBlk*)&pPage->u
52b0: 2e 61 44 69 73 6b 5b 69 64 78 5d 3b 0a 20 20 20  .aDisk[idx];.   
52c0: 20 70 4e 65 77 2d 3e 69 53 69 7a 65 20 3d 20 53   pNew->iSize = S
52d0: 57 41 42 31 36 28 70 42 74 2c 20 73 69 7a 65 20  WAB16(pBt, size 
52e0: 2b 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 4e  + SWAB16(pBt, pN
52f0: 65 78 74 2d 3e 69 53 69 7a 65 29 29 3b 0a 20 20  ext->iSize));.  
5300: 20 20 70 4e 65 77 2d 3e 69 4e 65 78 74 20 3d 20    pNew->iNext = 
5310: 70 4e 65 78 74 2d 3e 69 4e 65 78 74 3b 0a 20 20  pNext->iNext;.  
5320: 7d 0a 20 20 2a 70 49 64 78 20 3d 20 53 57 41 42  }.  *pIdx = SWAB
5330: 31 36 28 70 42 74 2c 20 73 74 61 72 74 29 3b 0a  16(pBt, start);.
5340: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
5350: 3d 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = size;.}../*.**
5360: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
5370: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
5380: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
5390: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   block..**.** Th
53a0: 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
53b0: 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ter must be a po
53c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
53d0: 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  Page which.** is
53e0: 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
53f0: 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e  he page being in
5400: 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
5410: 72 6f 6f 74 20 6f 66 20 74 68 65 0a 2a 2a 20 42  root of the.** B
5420: 54 72 65 65 20 28 75 73 75 61 6c 6c 79 20 70 61  Tree (usually pa
5430: 67 65 20 32 29 20 68 61 73 20 6e 6f 20 70 61 72  ge 2) has no par
5440: 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74  ent and so for t
5450: 68 61 74 20 70 61 67 65 2c 20 0a 2a 2a 20 70 50  hat page, .** pP
5460: 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a  arent==NULL..**.
5470: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
5480: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
5490: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
54a0: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
54b0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
54c0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
54d0: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
54e0: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
54f0: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
5500: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
5510: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
5520: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
5530: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
5540: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
5550: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
5560: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
5570: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
5580: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
5590: 74 69 63 20 69 6e 74 20 69 6e 69 74 50 61 67 65  tic int initPage
55a0: 28 42 74 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  (Bt *pBt, MemPag
55b0: 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 70  e *pPage, Pgno p
55c0: 67 6e 6f 54 68 69 73 2c 20 4d 65 6d 50 61 67 65  gnoThis, MemPage
55d0: 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e   *pParent){.  in
55e0: 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
55f0: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 69 6e 74   /* An index int
5600: 6f 20 70 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b  o pPage->u.aDisk
5610: 5b 5d 20 2a 2f 0a 20 20 43 65 6c 6c 20 2a 70 43  [] */.  Cell *pC
5620: 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  ell;       /* A 
5630: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43 65 6c  pointer to a Cel
5640: 6c 20 69 6e 20 70 50 61 67 65 2d 3e 75 2e 61 44  l in pPage->u.aD
5650: 69 73 6b 5b 5d 20 2a 2f 0a 20 20 46 72 65 65 42  isk[] */.  FreeB
5660: 6c 6b 20 2a 70 46 42 6c 6b 3b 20 20 20 20 2f 2a  lk *pFBlk;    /*
5670: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   A pointer to a 
5680: 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 70 50  free block in pP
5690: 61 67 65 2d 3e 75 2e 61 44 69 73 6b 5b 5d 20 2a  age->u.aDisk[] *
56a0: 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20  /.  int sz;     
56b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 69         /* The si
56c0: 7a 65 20 6f 66 20 61 20 43 65 6c 6c 20 69 6e 20  ze of a Cell in 
56d0: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66  bytes */.  int f
56e0: 72 65 65 53 70 61 63 65 3b 20 20 20 20 20 2f 2a  reeSpace;     /*
56f0: 20 41 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   Amount of free 
5700: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
5710: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  e */..  if( pPag
5720: 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  e->pParent ){.  
5730: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5740: 3e 70 50 61 72 65 6e 74 3d 3d 70 50 61 72 65 6e  >pParent==pParen
5750: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
5760: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
5770: 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
5780: 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
5790: 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  nt = pParent;.  
57a0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65    sqlitepager_re
57b0: 66 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  f(pParent);.  }.
57c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
57d0: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
57e0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 2d  ITE_OK;.  pPage-
57f0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 70  >isInit = 1;.  p
5800: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
5810: 0a 20 20 66 72 65 65 53 70 61 63 65 20 3d 20 55  .  freeSpace = U
5820: 53 41 42 4c 45 5f 53 50 41 43 45 3b 0a 20 20 69  SABLE_SPACE;.  i
5830: 64 78 20 3d 20 53 57 41 42 31 36 28 70 42 74 2c  dx = SWAB16(pBt,
5840: 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 66 69   pPage->u.hdr.fi
5850: 72 73 74 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c  rstCell);.  whil
5860: 65 28 20 69 64 78 21 3d 30 20 29 7b 0a 20 20 20  e( idx!=0 ){.   
5870: 20 69 66 28 20 69 64 78 3e 53 51 4c 49 54 45 5f   if( idx>SQLITE_
5880: 50 41 47 45 5f 53 49 5a 45 2d 4d 49 4e 5f 43 45  PAGE_SIZE-MIN_CE
5890: 4c 4c 5f 53 49 5a 45 20 29 20 67 6f 74 6f 20 70  LL_SIZE ) goto p
58a0: 61 67 65 5f 66 6f 72 6d 61 74 5f 65 72 72 6f 72  age_format_error
58b0: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 3c 73 69  ;.    if( idx<si
58c0: 7a 65 6f 66 28 50 61 67 65 48 64 72 29 20 29 20  zeof(PageHdr) ) 
58d0: 67 6f 74 6f 20 70 61 67 65 5f 66 6f 72 6d 61 74  goto page_format
58e0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
58f0: 69 64 78 21 3d 52 4f 55 4e 44 55 50 28 69 64 78  idx!=ROUNDUP(idx
5900: 29 20 29 20 67 6f 74 6f 20 70 61 67 65 5f 66 6f  ) ) goto page_fo
5910: 72 6d 61 74 5f 65 72 72 6f 72 3b 0a 20 20 20 20  rmat_error;.    
5920: 70 43 65 6c 6c 20 3d 20 28 43 65 6c 6c 2a 29 26  pCell = (Cell*)&
5930: 70 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b 5b 69  pPage->u.aDisk[i
5940: 64 78 5d 3b 0a 20 20 20 20 73 7a 20 3d 20 63 65  dx];.    sz = ce
5950: 6c 6c 53 69 7a 65 28 70 42 74 2c 20 70 43 65 6c  llSize(pBt, pCel
5960: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 2b  l);.    if( idx+
5970: 73 7a 20 3e 20 53 51 4c 49 54 45 5f 50 41 47 45  sz > SQLITE_PAGE
5980: 5f 53 49 5a 45 20 29 20 67 6f 74 6f 20 70 61 67  _SIZE ) goto pag
5990: 65 5f 66 6f 72 6d 61 74 5f 65 72 72 6f 72 3b 0a  e_format_error;.
59a0: 20 20 20 20 66 72 65 65 53 70 61 63 65 20 2d 3d      freeSpace -=
59b0: 20 73 7a 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   sz;.    pPage->
59c0: 61 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 6e 43  apCell[pPage->nC
59d0: 65 6c 6c 2b 2b 5d 20 3d 20 70 43 65 6c 6c 3b 0a  ell++] = pCell;.
59e0: 20 20 20 20 69 64 78 20 3d 20 53 57 41 42 31 36      idx = SWAB16
59f0: 28 70 42 74 2c 20 70 43 65 6c 6c 2d 3e 68 2e 69  (pBt, pCell->h.i
5a00: 4e 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Next);.  }.  pPa
5a10: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
5a20: 20 69 64 78 20 3d 20 53 57 41 42 31 36 28 70 42   idx = SWAB16(pB
5a30: 74 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e  t, pPage->u.hdr.
5a40: 66 69 72 73 74 46 72 65 65 29 3b 0a 20 20 77 68  firstFree);.  wh
5a50: 69 6c 65 28 20 69 64 78 21 3d 30 20 29 7b 0a 20  ile( idx!=0 ){. 
5a60: 20 20 20 69 6e 74 20 69 4e 65 78 74 3b 0a 20 20     int iNext;.  
5a70: 20 20 69 66 28 20 69 64 78 3e 53 51 4c 49 54 45    if( idx>SQLITE
5a80: 5f 50 41 47 45 5f 53 49 5a 45 2d 73 69 7a 65 6f  _PAGE_SIZE-sizeo
5a90: 66 28 46 72 65 65 42 6c 6b 29 20 29 20 67 6f 74  f(FreeBlk) ) got
5aa0: 6f 20 70 61 67 65 5f 66 6f 72 6d 61 74 5f 65 72  o page_format_er
5ab0: 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 69 64 78  ror;.    if( idx
5ac0: 3c 73 69 7a 65 6f 66 28 50 61 67 65 48 64 72 29  <sizeof(PageHdr)
5ad0: 20 29 20 67 6f 74 6f 20 70 61 67 65 5f 66 6f 72   ) goto page_for
5ae0: 6d 61 74 5f 65 72 72 6f 72 3b 0a 20 20 20 20 70  mat_error;.    p
5af0: 46 42 6c 6b 20 3d 20 28 46 72 65 65 42 6c 6b 2a  FBlk = (FreeBlk*
5b00: 29 26 70 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b  )&pPage->u.aDisk
5b10: 5b 69 64 78 5d 3b 0a 20 20 20 20 70 50 61 67 65  [idx];.    pPage
5b20: 2d 3e 6e 46 72 65 65 20 2b 3d 20 53 57 41 42 31  ->nFree += SWAB1
5b30: 36 28 70 42 74 2c 20 70 46 42 6c 6b 2d 3e 69 53  6(pBt, pFBlk->iS
5b40: 69 7a 65 29 3b 0a 20 20 20 20 69 4e 65 78 74 20  ize);.    iNext 
5b50: 3d 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 46  = SWAB16(pBt, pF
5b60: 42 6c 6b 2d 3e 69 4e 65 78 74 29 3b 0a 20 20 20  Blk->iNext);.   
5b70: 20 69 66 28 20 69 4e 65 78 74 3e 30 20 26 26 20   if( iNext>0 && 
5b80: 69 4e 65 78 74 20 3c 3d 20 69 64 78 20 29 20 67  iNext <= idx ) g
5b90: 6f 74 6f 20 70 61 67 65 5f 66 6f 72 6d 61 74 5f  oto page_format_
5ba0: 65 72 72 6f 72 3b 0a 20 20 20 20 69 64 78 20 3d  error;.    idx =
5bb0: 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66   iNext;.  }.  if
5bc0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
5bd0: 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
5be0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  e==0 ){.    /* A
5bf0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
5c00: 2c 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  , an uninitializ
5c10: 65 64 20 72 6f 6f 74 20 70 61 67 65 20 61 70 70  ed root page app
5c20: 65 61 72 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  ears to be.    *
5c30: 2a 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62  * an empty datab
5c40: 61 73 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ase */.    retur
5c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5c60: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46  .  if( pPage->nF
5c70: 72 65 65 21 3d 66 72 65 65 53 70 61 63 65 20 29  ree!=freeSpace )
5c80: 20 67 6f 74 6f 20 70 61 67 65 5f 66 6f 72 6d 61   goto page_forma
5c90: 74 5f 65 72 72 6f 72 3b 0a 20 20 72 65 74 75 72  t_error;.  retur
5ca0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
5cb0: 67 65 5f 66 6f 72 6d 61 74 5f 65 72 72 6f 72 3a  ge_format_error:
5cc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5cd0: 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 2f 2a 0a  _CORRUPT;.}../*.
5ce0: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
5cf0: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
5d00: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
5d10: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
5d20: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
5d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5d40: 20 7a 65 72 6f 50 61 67 65 28 42 74 72 65 65 20   zeroPage(Btree 
5d50: 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
5d60: 50 61 67 65 29 7b 0a 20 20 50 61 67 65 48 64 72  Page){.  PageHdr
5d70: 20 2a 70 48 64 72 3b 0a 20 20 46 72 65 65 42 6c   *pHdr;.  FreeBl
5d80: 6b 20 2a 70 46 42 6c 6b 3b 0a 20 20 61 73 73 65  k *pFBlk;.  asse
5d90: 72 74 28 20 73 71 6c 69 74 65 70 61 67 65 72 5f  rt( sqlitepager_
5da0: 69 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  iswriteable(pPag
5db0: 65 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  e) );.  memset(p
5dc0: 50 61 67 65 2c 20 30 2c 20 53 51 4c 49 54 45 5f  Page, 0, SQLITE_
5dd0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 70 48  PAGE_SIZE);.  pH
5de0: 64 72 20 3d 20 26 70 50 61 67 65 2d 3e 75 2e 68  dr = &pPage->u.h
5df0: 64 72 3b 0a 20 20 70 48 64 72 2d 3e 66 69 72 73  dr;.  pHdr->firs
5e00: 74 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 48 64  tCell = 0;.  pHd
5e10: 72 2d 3e 66 69 72 73 74 46 72 65 65 20 3d 20 53  r->firstFree = S
5e20: 57 41 42 31 36 28 70 42 74 2c 20 73 69 7a 65 6f  WAB16(pBt, sizeo
5e30: 66 28 2a 70 48 64 72 29 29 3b 0a 20 20 70 46 42  f(*pHdr));.  pFB
5e40: 6c 6b 20 3d 20 28 46 72 65 65 42 6c 6b 2a 29 26  lk = (FreeBlk*)&
5e50: 70 48 64 72 5b 31 5d 3b 0a 20 20 70 46 42 6c 6b  pHdr[1];.  pFBlk
5e60: 2d 3e 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->iNext = 0;.  p
5e70: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 53 51  Page->nFree = SQ
5e80: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 2d  LITE_PAGE_SIZE -
5e90: 20 73 69 7a 65 6f 66 28 2a 70 48 64 72 29 3b 0a   sizeof(*pHdr);.
5ea0: 20 20 70 46 42 6c 6b 2d 3e 69 53 69 7a 65 20 3d    pFBlk->iSize =
5eb0: 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 50 61   SWAB16(pBt, pPa
5ec0: 67 65 2d 3e 6e 46 72 65 65 29 3b 0a 20 20 70 50  ge->nFree);.  pP
5ed0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
5ee0: 20 20 70 50 61 67 65 2d 3e 69 73 4f 76 65 72 66    pPage->isOverf
5ef0: 75 6c 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ull = 0;.}../*.*
5f00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5f10: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
5f20: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
5f30: 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  t for a page.** 
5f40: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 57  reaches zero.  W
5f50: 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66 20  e need to unref 
5f60: 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e  the pParent poin
5f70: 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a  ter when that.**
5f80: 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61   happens..*/.sta
5f90: 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65 73  tic void pageDes
5fa0: 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 44  tructor(void *pD
5fb0: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
5fc0: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
5fd0: 65 2a 29 70 44 61 74 61 3b 0a 20 20 69 66 28 20  e*)pData;.  if( 
5fe0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29  pPage->pParent )
5ff0: 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
6000: 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
6010: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50 61  pParent;.    pPa
6020: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
6030: 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72  .    sqlitepager
6040: 5f 75 6e 72 65 66 28 70 50 61 72 65 6e 74 29 3b  _unref(pParent);
6050: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
6060: 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
6070: 65 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c  e..**.** Actuall
6080: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
6090: 6a 75 73 74 20 73 65 74 73 20 75 70 20 74 68 65  just sets up the
60a0: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
60b0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 66 6f 72  tructures.** for
60c0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
60d0: 61 74 61 62 61 73 65 2e 20 20 57 65 20 64 6f 20  atabase.  We do 
60e0: 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 64 61 74  not open the dat
60f0: 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 75  abase file .** u
6100: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 70  ntil the first p
6110: 61 67 65 20 69 73 20 6c 6f 61 64 65 64 2e 0a 2a  age is loaded..*
6120: 2a 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69  *.** zFilename i
6130: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
6140: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6150: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
6160: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
6170: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
6180: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
6190: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
61a0: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
61b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
61c0: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
61d0: 65 6e 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c  en sqliteBtreeCl
61e0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
61f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 42 74  .*/.int sqliteBt
6200: 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  reeOpen(.  const
6210: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
6220: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
6230: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
6240: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
6250: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
6260: 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20 20 20 20  omitJournal,    
6270: 20 20 20 20 20 20 2f 2a 20 69 66 20 54 52 55 45        /* if TRUE
6280: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 6f 75   then do not jou
6290: 72 6e 61 6c 20 74 68 69 73 20 66 69 6c 65 20 2a  rnal this file *
62a0: 2f 0a 20 20 69 6e 74 20 6e 43 61 63 68 65 2c 20  /.  int nCache, 
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
62c0: 20 48 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20   How many pages 
62d0: 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
62e0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
62f0: 70 42 74 72 65 65 20 20 20 20 20 20 20 20 20 20  pBtree          
6300: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
6310: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
6320: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
6330: 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
6340: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
6350: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
6360: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
6370: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
6380: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
6390: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 2a 2a  e btree are.  **
63a0: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
63b0: 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
63c0: 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
63d0: 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
63e0: 75 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f  ult.  ** when co
63f0: 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
6400: 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
6410: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ure..  */.  asse
6420: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
6430: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
6440: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
6460: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
6470: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
6480: 50 61 67 65 48 64 72 29 3d 3d 38 20 29 3b 0a 20  PageHdr)==8 );. 
6490: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
64a0: 43 65 6c 6c 48 64 72 29 3d 3d 31 32 20 29 3b 0a  CellHdr)==12 );.
64b0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
64c0: 28 46 72 65 65 42 6c 6b 29 3d 3d 34 20 29 3b 0a  (FreeBlk)==4 );.
64d0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
64e0: 28 4f 76 65 72 66 6c 6f 77 50 61 67 65 29 3d 3d  (OverflowPage)==
64f0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
6510: 7a 65 6f 66 28 46 72 65 65 6c 69 73 74 49 6e 66  zeof(FreelistInf
6520: 6f 29 3d 3d 4f 56 45 52 46 4c 4f 57 5f 53 49 5a  o)==OVERFLOW_SIZ
6530: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
6540: 69 7a 65 6f 66 28 70 74 72 29 3d 3d 73 69 7a 65  izeof(ptr)==size
6550: 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 61  of(char*) );.  a
6560: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 70  ssert( sizeof(up
6570: 74 72 29 3d 3d 73 69 7a 65 6f 66 28 70 74 72 29  tr)==sizeof(ptr)
6580: 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 73 71 6c   );..  pBt = sql
6590: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
65a0: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 69 66 28  f(*pBt) );.  if(
65b0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   pBt==0 ){.    *
65c0: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 20  ppBtree = 0;.   
65d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
65e0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
65f0: 6e 43 61 63 68 65 3c 31 30 20 29 20 6e 43 61 63  nCache<10 ) nCac
6600: 68 65 20 3d 20 31 30 3b 0a 20 20 72 63 20 3d 20  he = 10;.  rc = 
6610: 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e  sqlitepager_open
6620: 28 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  (&pBt->pPager, z
6630: 46 69 6c 65 6e 61 6d 65 2c 20 6e 43 61 63 68 65  Filename, nCache
6640: 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c 0a 20 20  , EXTRA_SIZE,.  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 20 21 6f 6d 69 74 4a 6f 75 72 6e        !omitJourn
6670: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
6680: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6690: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 72 20  if( pBt->pPager 
66a0: 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c  ) sqlitepager_cl
66b0: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
66c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
66d0: 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 70 42 74  (pBt);.    *ppBt
66e0: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ree = 0;.    ret
66f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71  urn rc;.  }.  sq
6700: 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 64 65  litepager_set_de
6710: 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50  structor(pBt->pP
6720: 61 67 65 72 2c 20 70 61 67 65 44 65 73 74 72 75  ager, pageDestru
6730: 63 74 6f 72 29 3b 0a 20 20 70 42 74 2d 3e 70 43  ctor);.  pBt->pC
6740: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74  ursor = 0;.  pBt
6750: 2d 3e 70 61 67 65 31 20 3d 20 30 3b 0a 20 20 70  ->page1 = 0;.  p
6760: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
6770: 71 6c 69 74 65 70 61 67 65 72 5f 69 73 72 65 61  qlitepager_isrea
6780: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
6790: 72 29 3b 0a 20 20 70 42 74 2d 3e 70 4f 70 73 20  r);.  pBt->pOps 
67a0: 3d 20 26 73 71 6c 69 74 65 42 74 72 65 65 4f 70  = &sqliteBtreeOp
67b0: 73 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  s;.  *ppBtree = 
67c0: 70 42 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pBt;.  return SQ
67d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
67e0: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
67f0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
6800: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
6810: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ors..*/.static i
6820: 6e 74 20 66 69 6c 65 42 74 72 65 65 43 6c 6f 73  nt fileBtreeClos
6830: 65 28 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 20  e(Btree *pBt){. 
6840: 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 43 75   while( pBt->pCu
6850: 72 73 6f 72 20 29 7b 0a 20 20 20 20 66 69 6c 65  rsor ){.    file
6860: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
6870: 28 70 42 74 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pBt->pCursor);.
6880: 20 20 7d 0a 20 20 73 71 6c 69 74 65 70 61 67 65    }.  sqlitepage
6890: 72 5f 63 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  r_close(pBt->pPa
68a0: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ger);.  sqliteFr
68b0: 65 65 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ee(pBt);.  retur
68c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
68d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
68e0: 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
68f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
6900: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
6910: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
6920: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
6930: 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
6940: 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
6950: 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
6960: 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
6970: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
6980: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
6990: 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
69a0: 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
69b0: 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
69c0: 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
69d0: 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
69e0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
69f0: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
6a00: 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
6a10: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
6a20: 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
6a30: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
6a40: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
6a50: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
6a60: 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
6a70: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
6a80: 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
6a90: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
6aa0: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
6ab0: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
6ac0: 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
6ad0: 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
6ae0: 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
6af0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
6b00: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
6b10: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
6b20: 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
6b30: 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
6b40: 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
6b50: 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
6b60: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
6b70: 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
6b80: 77 6f 72 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  worry..*/.static
6b90: 20 69 6e 74 20 66 69 6c 65 42 74 72 65 65 53 65   int fileBtreeSe
6ba0: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
6bb0: 20 2a 70 42 74 2c 20 69 6e 74 20 6d 78 50 61 67   *pBt, int mxPag
6bc0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 70 61 67 65  e){.  sqlitepage
6bd0: 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28  r_set_cachesize(
6be0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
6bf0: 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  age);.  return S
6c00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6c10: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
6c20: 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
6c30: 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
6c40: 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
6c50: 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
6c60: 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
6c70: 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
6c80: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
6c90: 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
6ca0: 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
6cb0: 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
6cc0: 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
6cd0: 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
6ce0: 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
6cf0: 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
6d00: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
6d10: 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
6d20: 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
6d30: 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
6d40: 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
6d50: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
6d60: 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
6d70: 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
6d80: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
6d90: 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
6da0: 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
6db0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
6dc0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
6dd0: 63 20 69 6e 74 20 66 69 6c 65 42 74 72 65 65 53  c int fileBtreeS
6de0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
6df0: 72 65 65 20 2a 70 42 74 2c 20 69 6e 74 20 6c 65  ree *pBt, int le
6e00: 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 70 61  vel){.  sqlitepa
6e10: 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c  ger_set_safety_l
6e20: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
6e30: 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 72 65 74 75  , level);.  retu
6e40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6e50: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
6e60: 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 31 20  erence to page1 
6e70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6e80: 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
6e90: 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
6ea0: 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
6eb0: 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
6ec0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
6ed0: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
6ee0: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
6ef0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
6f00: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
6f10: 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
6f20: 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
6f30: 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
6f40: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
6f50: 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
6f60: 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
6f70: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
6f80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
6f90: 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
6fa0: 79 2e 20 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  y.  SQLITE_PROTO
6fb0: 43 4f 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  COL is returned.
6fc0: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
6fd0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
6fe0: 6c 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  l violation..*/.
6ff0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
7000: 74 72 65 65 28 42 74 72 65 65 20 2a 70 42 74 29  tree(Btree *pBt)
7010: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
7020: 28 20 70 42 74 2d 3e 70 61 67 65 31 20 29 20 72  ( pBt->page1 ) r
7030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7040: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61  .  rc = sqlitepa
7050: 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61  ger_get(pBt->pPa
7060: 67 65 72 2c 20 31 2c 20 28 76 6f 69 64 2a 2a 29  ger, 1, (void**)
7070: 26 70 42 74 2d 3e 70 61 67 65 31 29 3b 0a 20 20  &pBt->page1);.  
7080: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7090: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
70a0: 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
70b0: 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
70c0: 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
70d0: 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
70e0: 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
70f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
7100: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
7110: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
7120: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
7130: 7b 0a 20 20 20 20 50 61 67 65 4f 6e 65 20 2a 70  {.    PageOne *p
7140: 50 31 20 3d 20 70 42 74 2d 3e 70 61 67 65 31 3b  P1 = pBt->page1;
7150: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
7160: 70 50 31 2d 3e 7a 4d 61 67 69 63 2c 7a 4d 61 67  pP1->zMagic,zMag
7170: 69 63 48 65 61 64 65 72 29 21 3d 30 20 7c 7c 0a  icHeader)!=0 ||.
7180: 20 20 20 20 20 20 20 20 20 20 28 70 50 31 2d 3e            (pP1->
7190: 69 4d 61 67 69 63 21 3d 4d 41 47 49 43 20 26 26  iMagic!=MAGIC &&
71a0: 20 73 77 61 62 33 32 28 70 50 31 2d 3e 69 4d 61   swab32(pP1->iMa
71b0: 67 69 63 29 21 3d 4d 41 47 49 43 29 20 29 7b 0a  gic)!=MAGIC) ){.
71c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
71d0: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
71e0: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
71f0: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
7200: 20 20 20 70 42 74 2d 3e 6e 65 65 64 53 77 61 62     pBt->needSwab
7210: 20 3d 20 70 50 31 2d 3e 69 4d 61 67 69 63 21 3d   = pP1->iMagic!=
7220: 4d 41 47 49 43 3b 0a 20 20 7d 0a 20 20 72 65 74  MAGIC;.  }.  ret
7230: 75 72 6e 20 72 63 3b 0a 0a 70 61 67 65 31 5f 69  urn rc;..page1_i
7240: 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 73 71  nit_failed:.  sq
7250: 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28  litepager_unref(
7260: 70 42 74 2d 3e 70 61 67 65 31 29 3b 0a 20 20 70  pBt->page1);.  p
7270: 42 74 2d 3e 70 61 67 65 31 20 3d 20 30 3b 0a 20  Bt->page1 = 0;. 
7280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7290: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
72a0: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
72b0: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
72c0: 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
72d0: 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
72e0: 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
72f0: 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
7300: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7310: 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
7320: 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
7330: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
7340: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7350: 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
7360: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
7370: 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
7380: 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
7390: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
73a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
73b0: 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
73c0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
73d0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
73e0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
73f0: 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
7400: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
7410: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
7420: 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
7430: 55 6e 75 73 65 64 28 42 74 72 65 65 20 2a 70 42  Unused(Btree *pB
7440: 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  t){.  if( pBt->i
7450: 6e 54 72 61 6e 73 3d 3d 30 20 26 26 20 70 42 74  nTrans==0 && pBt
7460: 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20  ->pCursor==0 && 
7470: 70 42 74 2d 3e 70 61 67 65 31 21 3d 30 20 29 7b  pBt->page1!=0 ){
7480: 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72  .    sqlitepager
7490: 5f 75 6e 72 65 66 28 70 42 74 2d 3e 70 61 67 65  _unref(pBt->page
74a0: 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  1);.    pBt->pag
74b0: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
74c0: 3e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20  >inTrans = 0;.  
74d0: 20 20 70 42 74 2d 3e 69 6e 43 6b 70 74 20 3d 20    pBt->inCkpt = 
74e0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
74f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
7500: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
7510: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
7520: 74 77 6f 20 70 61 67 65 73 20 6f 66 20 74 68 65  two pages of the
7530: 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
7540: 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
7550: 61 73 65 28 42 74 72 65 65 20 2a 70 42 74 29 7b  ase(Btree *pBt){
7560: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
7570: 74 3b 0a 20 20 50 61 67 65 4f 6e 65 20 2a 70 50  t;.  PageOne *pP
7580: 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
7590: 66 28 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  f( sqlitepager_p
75a0: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
75b0: 61 67 65 72 29 3e 31 20 29 20 72 65 74 75 72 6e  ager)>1 ) return
75c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
75d0: 31 20 3d 20 70 42 74 2d 3e 70 61 67 65 31 3b 0a  1 = pBt->page1;.
75e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
75f0: 65 72 5f 77 72 69 74 65 28 70 42 74 2d 3e 70 61  er_write(pBt->pa
7600: 67 65 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ge1);.  if( rc )
7610: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
7620: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67   = sqlitepager_g
7630: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
7640: 32 2c 20 28 76 6f 69 64 2a 2a 29 26 70 52 6f 6f  2, (void**)&pRoo
7650: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
7660: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
7670: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
7680: 74 65 28 70 52 6f 6f 74 29 3b 0a 20 20 69 66 28  te(pRoot);.  if(
7690: 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
76a0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70 52 6f  epager_unref(pRo
76b0: 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
76c0: 72 63 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79  rc;.  }.  strcpy
76d0: 28 70 50 31 2d 3e 7a 4d 61 67 69 63 2c 20 7a 4d  (pP1->zMagic, zM
76e0: 61 67 69 63 48 65 61 64 65 72 29 3b 0a 20 20 69  agicHeader);.  i
76f0: 66 28 20 62 74 72 65 65 5f 6e 61 74 69 76 65 5f  f( btree_native_
7700: 62 79 74 65 5f 6f 72 64 65 72 20 29 7b 0a 20 20  byte_order ){.  
7710: 20 20 70 50 31 2d 3e 69 4d 61 67 69 63 20 3d 20    pP1->iMagic = 
7720: 4d 41 47 49 43 3b 0a 20 20 20 20 70 42 74 2d 3e  MAGIC;.    pBt->
7730: 6e 65 65 64 53 77 61 62 20 3d 20 30 3b 0a 20 20  needSwab = 0;.  
7740: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 31 2d 3e  }else{.    pP1->
7750: 69 4d 61 67 69 63 20 3d 20 73 77 61 62 33 32 28  iMagic = swab32(
7760: 4d 41 47 49 43 29 3b 0a 20 20 20 20 70 42 74 2d  MAGIC);.    pBt-
7770: 3e 6e 65 65 64 53 77 61 62 20 3d 20 31 3b 0a 20  >needSwab = 1;. 
7780: 20 7d 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 42   }.  zeroPage(pB
7790: 74 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 73 71 6c  t, pRoot);.  sql
77a0: 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70  itepager_unref(p
77b0: 52 6f 6f 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Root);.  return 
77c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
77d0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
77e0: 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
77f0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
7800: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
7810: 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
7820: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
7830: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 6f 20  y changes.** to 
7840: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
7850: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
7860: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69  wing routines wi
7870: 6c 6c 20 77 6f 72 6b 0a 2a 2a 20 75 6e 6c 65 73  ll work.** unles
7880: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
7890: 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
78a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
78b0: 69 74 65 42 74 72 65 65 43 72 65 61 74 65 54 61  iteBtreeCreateTa
78c0: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
78d0: 6c 69 74 65 42 74 72 65 65 43 72 65 61 74 65 49  liteBtreeCreateI
78e0: 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
78f0: 71 6c 69 74 65 42 74 72 65 65 43 6c 65 61 72 54  qliteBtreeClearT
7900: 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
7910: 71 6c 69 74 65 42 74 72 65 65 44 72 6f 70 54 61  qliteBtreeDropTa
7920: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
7930: 6c 69 74 65 42 74 72 65 65 49 6e 73 65 72 74 28  liteBtreeInsert(
7940: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
7950: 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
7960: 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
7970: 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2f  eUpdateMeta().*/
7980: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
7990: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
79a0: 42 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 69  Btree *pBt){.  i
79b0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 42 74  nt rc;.  if( pBt
79c0: 2d 3e 69 6e 54 72 61 6e 73 20 29 20 72 65 74 75  ->inTrans ) retu
79d0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
79e0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
79f0: 4f 6e 6c 79 20 29 20 72 65 74 75 72 6e 20 53 51  Only ) return SQ
7a00: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
7a10: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 31 3d   if( pBt->page1=
7a20: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
7a30: 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20  ockBtree(pBt);. 
7a40: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7a50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
7a60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
7a70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
7a80: 70 61 67 65 72 5f 62 65 67 69 6e 28 70 42 74 2d  pager_begin(pBt-
7a90: 3e 70 61 67 65 31 29 3b 0a 20 20 69 66 28 20 72  >page1);.  if( r
7aa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7ab0: 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
7ac0: 62 61 73 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  base(pBt);.  }. 
7ad0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7ae0: 4f 4b 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 69  OK ){.    pBt->i
7af0: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
7b00: 70 42 74 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b  pBt->inCkpt = 0;
7b10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
7b20: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
7b30: 64 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  d(pBt);.  }.  re
7b40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7b50: 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
7b60: 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
7b70: 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
7b80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
7b90: 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
7ba0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
7bb0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
7bc0: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
7bd0: 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
7be0: 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
7bf0: 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
7c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7c10: 69 6c 65 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  ileBtreeCommit(B
7c20: 74 72 65 65 20 2a 70 42 74 29 7b 0a 20 20 69 6e  tree *pBt){.  in
7c30: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 70 42 74  t rc;.  rc = pBt
7c40: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
7c50: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 70  ITE_OK : sqlitep
7c60: 61 67 65 72 5f 63 6f 6d 6d 69 74 28 70 42 74 2d  ager_commit(pBt-
7c70: 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d  >pPager);.  pBt-
7c80: 3e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20  >inTrans = 0;.  
7c90: 70 42 74 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b  pBt->inCkpt = 0;
7ca0: 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
7cb0: 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72  Unused(pBt);.  r
7cc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7cd0: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
7ce0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
7cf0: 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
7d00: 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
7d10: 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
7d20: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
7d30: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
7d40: 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
7d50: 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
7d60: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
7d70: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
7d80: 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
7d90: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
7da0: 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
7db0: 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
7dc0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
7dd0: 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
7de0: 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
7df0: 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
7e00: 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
7e10: 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73   read lock..*/.s
7e20: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 42 74  tatic int fileBt
7e30: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
7e40: 65 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  e *pBt){.  int r
7e50: 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
7e60: 43 75 72 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Cur;.  if( pBt->
7e70: 69 6e 54 72 61 6e 73 3d 3d 30 20 29 20 72 65 74  inTrans==0 ) ret
7e80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7e90: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 20 3d 20   pBt->inTrans = 
7ea0: 30 3b 0a 20 20 70 42 74 2d 3e 69 6e 43 6b 70 74  0;.  pBt->inCkpt
7eb0: 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 70 42 74   = 0;.  rc = pBt
7ec0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
7ed0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 70  ITE_OK : sqlitep
7ee0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 42  ager_rollback(pB
7ef0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 66 6f  t->pPager);.  fo
7f00: 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
7f10: 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
7f20: 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
7f30: 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67    if( pCur->pPag
7f40: 65 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  e && pCur->pPage
7f50: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
7f60: 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72       sqlitepager
7f70: 5f 75 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61  _unref(pCur->pPa
7f80: 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ge);.      pCur-
7f90: 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >pPage = 0;.    
7fa0: 7d 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74  }.  }.  unlockBt
7fb0: 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
7fc0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7fd0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7fe0: 63 68 65 63 6b 70 6f 69 6e 74 20 66 6f 72 20 74  checkpoint for t
7ff0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
8000: 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 63 68 65  action.  The che
8010: 63 6b 70 6f 69 6e 74 20 73 65 72 76 65 73 0a 2a  ckpoint serves.*
8020: 2a 20 61 73 20 61 20 73 75 62 2d 74 72 61 6e 73  * as a sub-trans
8030: 61 63 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  action that can 
8040: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
8050: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
8060: 74 68 65 0a 2a 2a 20 6d 61 69 6e 20 74 72 61 6e  the.** main tran
8070: 73 61 63 74 69 6f 6e 2e 20 20 59 6f 75 20 6d 75  saction.  You mu
8080: 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
8090: 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74  action before st
80a0: 61 72 74 69 6e 67 20 61 0a 2a 2a 20 63 68 65 63  arting a.** chec
80b0: 6b 70 6f 69 6e 74 2e 20 20 54 68 65 20 63 68 65  kpoint.  The che
80c0: 63 6b 70 6f 69 6e 74 20 69 73 20 65 6e 64 65 64  ckpoint is ended
80d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69   automatically i
80e0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
80f0: 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20  n.** commits or 
8100: 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
8110: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 63 68 65 63 6b  * Only one check
8120: 70 6f 69 6e 74 20 6d 61 79 20 62 65 20 61 63 74  point may be act
8130: 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ive at a time.  
8140: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74  It is an error t
8150: 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72  o try.** to star
8160: 74 20 61 20 6e 65 77 20 63 68 65 63 6b 70 6f 69  t a new checkpoi
8170: 6e 74 20 69 66 20 61 6e 6f 74 68 65 72 20 63 68  nt if another ch
8180: 65 63 6b 70 6f 69 6e 74 20 69 73 20 61 6c 72 65  eckpoint is alre
8190: 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 73  ady active..*/.s
81a0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 42 74  tatic int fileBt
81b0: 72 65 65 42 65 67 69 6e 43 6b 70 74 28 42 74 72  reeBeginCkpt(Btr
81c0: 65 65 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ee *pBt){.  int 
81d0: 72 63 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  rc;.  if( !pBt->
81e0: 69 6e 54 72 61 6e 73 20 7c 7c 20 70 42 74 2d 3e  inTrans || pBt->
81f0: 69 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20 72 65  inCkpt ){.    re
8200: 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
8210: 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
8220: 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
8230: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
8240: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
8250: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
8260: 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 62 65 67  tepager_ckpt_beg
8270: 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  in(pBt->pPager);
8280: 0a 20 20 70 42 74 2d 3e 69 6e 43 6b 70 74 20 3d  .  pBt->inCkpt =
8290: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   1;.  return rc;
82a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
82b0: 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 74  t a checkpoint t
82c0: 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  o transaction cu
82d0: 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
82e0: 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 63  ess.  If no.** c
82f0: 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 61 63 74  heckpoint is act
8300: 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ive, this is a n
8310: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
8320: 69 6e 74 20 66 69 6c 65 42 74 72 65 65 43 6f 6d  int fileBtreeCom
8330: 6d 69 74 43 6b 70 74 28 42 74 72 65 65 20 2a 70  mitCkpt(Btree *p
8340: 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Bt){.  int rc;. 
8350: 20 69 66 28 20 70 42 74 2d 3e 69 6e 43 6b 70 74   if( pBt->inCkpt
8360: 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e   && !pBt->readOn
8370: 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ly ){.    rc = s
8380: 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
8390: 63 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  commit(pBt->pPag
83a0: 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
83b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
83c0: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 43  ;.  }.  pBt->inC
83d0: 6b 70 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  kpt = 0;.  retur
83e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
83f0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63 68 65 63  ollback the chec
8400: 6b 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 75  kpoint to the cu
8410: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
8420: 6e 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  n.  If there.** 
8430: 69 73 20 6e 6f 20 61 63 74 69 76 65 20 63 68 65  is no active che
8440: 63 6b 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  ckpoint or trans
8450: 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 72 6f 75  action, this rou
8460: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
8470: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  .**.** All curso
8480: 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
8490: 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
84a0: 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
84b0: 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61  empt.** to use a
84c0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73   cursor that was
84d0: 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
84e0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
84f0: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  peration.** will
8500: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
8510: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
8520: 6e 74 20 66 69 6c 65 42 74 72 65 65 52 6f 6c 6c  nt fileBtreeRoll
8530: 62 61 63 6b 43 6b 70 74 28 42 74 72 65 65 20 2a  backCkpt(Btree *
8540: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
8550: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8560: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 43  ;.  if( pBt->inC
8570: 6b 70 74 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 72  kpt==0 || pBt->r
8580: 65 61 64 4f 6e 6c 79 20 29 20 72 65 74 75 72 6e  eadOnly ) return
8590: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63   SQLITE_OK;.  rc
85a0: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63   = sqlitepager_c
85b0: 6b 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 70 42 74  kpt_rollback(pBt
85c0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 66 6f 72  ->pPager);.  for
85d0: 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
85e0: 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
85f0: 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
8600: 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65   if( pCur->pPage
8610: 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   && pCur->pPage-
8620: 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
8630: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
8640: 75 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67  unref(pCur->pPag
8650: 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  e);.      pCur->
8660: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
8670: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 43 6b  .  }.  pBt->inCk
8680: 70 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  pt = 0;.  return
8690: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
86a0: 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
86b0: 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
86c0: 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
86d0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
86e0: 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
86f0: 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
8700: 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
8710: 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
8720: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
8730: 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
8740: 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
8750: 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
8760: 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
8770: 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
8780: 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
8790: 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
87a0: 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
87b0: 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
87c0: 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
87d0: 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
87e0: 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
87f0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
8800: 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
8810: 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
8820: 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
8830: 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
8840: 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
8850: 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
8860: 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
8870: 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
8880: 3a 20 20 4e 6f 20 6f 74 68 65 72 20 63 75 72 73  :  No other curs
8890: 6f 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20  ors may be open 
88a0: 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
88b0: 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
88c0: 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
88d0: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
88e0: 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
88f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
8900: 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
8910: 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
8920: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
8930: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e  .**.** Condition
8940: 20 32 20 77 61 72 72 61 6e 74 73 20 66 75 72 74   2 warrants furt
8950: 68 65 72 20 64 69 73 63 75 73 73 69 6f 6e 2e 20  her discussion. 
8960: 20 49 66 20 61 6e 79 20 63 75 72 73 6f 72 20 69   If any cursor i
8970: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 61  s opened.** on a
8980: 20 74 61 62 6c 65 20 77 69 74 68 20 77 72 46 6c   table with wrFl
8990: 61 67 3d 3d 30 2c 20 74 68 61 74 20 70 72 65 76  ag==0, that prev
89a0: 65 6e 74 73 20 61 6c 6c 20 6f 74 68 65 72 20 63  ents all other c
89b0: 75 72 73 6f 72 73 20 66 72 6f 6d 0a 2a 2a 20 77  ursors from.** w
89c0: 72 69 74 69 6e 67 20 74 6f 20 74 68 61 74 20 74  riting to that t
89d0: 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  able.  This is a
89e0: 20 6b 69 6e 64 20 6f 66 20 22 72 65 61 64 2d 6c   kind of "read-l
89f0: 6f 63 6b 22 2e 20 20 57 68 65 6e 20 61 20 63 75  ock".  When a cu
8a00: 72 73 6f 72 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  rsor.** is opene
8a10: 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
8a20: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
8a30: 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  d that the table
8a40: 20 77 69 6c 6c 20 6e 6f 74 0a 2a 2a 20 63 68 61   will not.** cha
8a50: 6e 67 65 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  nge as long as t
8a60: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
8a70: 6e 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  n.  This allows 
8a80: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 0a 2a 2a  the cursor to.**
8a90: 20 64 6f 20 61 20 73 65 71 75 65 6e 74 69 61 6c   do a sequential
8aa0: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62   scan of the tab
8ab0: 6c 65 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  le without havin
8ac0: 67 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  g to worry about
8ad0: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 62 65 69 6e  .** entries bein
8ae0: 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  g inserted or de
8af0: 6c 65 74 65 64 20 64 75 72 69 6e 67 20 74 68 65  leted during the
8b00: 20 73 63 61 6e 2e 20 20 43 75 72 73 6f 72 73 20   scan.  Cursors 
8b10: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 6f 70 65  should.** be ope
8b20: 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
8b30: 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68 69 73 20  =0 only if this 
8b40: 72 65 61 64 2d 6c 6f 63 6b 20 70 72 6f 70 65 72  read-lock proper
8b50: 74 79 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2a  ty is needed..**
8b60: 20 54 68 61 74 20 69 73 20 74 6f 20 73 61 79 2c   That is to say,
8b70: 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20   cursors should 
8b80: 62 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  be opened with w
8b90: 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66  rFlag==0 only if
8ba0: 20 74 68 65 79 0a 2a 2a 20 69 6e 74 65 6e 64 20   they.** intend 
8bb0: 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
8bc0: 65 42 74 72 65 65 4e 65 78 74 28 29 20 73 79 73  eBtreeNext() sys
8bd0: 74 65 6d 20 63 61 6c 6c 2e 20 20 41 6c 6c 20 6f  tem call.  All o
8be0: 74 68 65 72 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ther cursors.** 
8bf0: 73 68 6f 75 6c 64 20 62 65 20 6f 70 65 6e 65 64  should be opened
8c00: 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20   with wrFlag==1 
8c10: 65 76 65 6e 20 69 66 20 74 68 65 79 20 6e 65 76  even if they nev
8c20: 65 72 20 72 65 61 6c 6c 79 20 69 6e 74 65 6e 64  er really intend
8c30: 0a 2a 2a 20 74 6f 20 77 72 69 74 65 2e 0a 2a 2a  .** to write..**
8c40: 20 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67   .** No checking
8c50: 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
8c60: 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
8c70: 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
8c80: 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
8c90: 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
8ca0: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
8cb0: 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
8cc0: 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
8cd0: 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
8ce0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
8cf0: 20 66 69 6c 65 42 74 72 65 65 43 75 72 73 6f 72   fileBtreeCursor
8d00: 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e 74  (Btree *pBt, int
8d10: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 77 72 46   iTable, int wrF
8d20: 6c 61 67 2c 20 42 74 43 75 72 73 6f 72 20 2a 2a  lag, BtCursor **
8d30: 70 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  ppCur){.  int rc
8d40: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
8d50: 75 72 2c 20 2a 70 52 69 6e 67 3b 0a 0a 20 20 69  ur, *pRing;..  i
8d60: 66 28 20 70 42 74 2d 3e 70 61 67 65 31 3d 3d 30  f( pBt->page1==0
8d70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63   ){.    rc = loc
8d80: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
8d90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8da0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 43  OK ){.      *ppC
8db0: 75 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ur = 0;.      re
8dc0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8dd0: 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
8de0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
8df0: 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  (*pCur) );.  if(
8e00: 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20   pCur==0 ){.    
8e10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8e20: 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  M;.    goto crea
8e30: 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
8e40: 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ion;.  }.  pCur-
8e50: 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
8e60: 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d  o)iTable;.  rc =
8e70: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74   sqlitepager_get
8e80: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 43  (pBt->pPager, pC
8e90: 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 28 76  ur->pgnoRoot, (v
8ea0: 6f 69 64 2a 2a 29 26 70 43 75 72 2d 3e 70 50 61  oid**)&pCur->pPa
8eb0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
8ec0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8ed0: 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
8ee0: 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
8ef0: 7d 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67  }.  rc = initPag
8f00: 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 50 61  e(pBt, pCur->pPa
8f10: 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ge, pCur->pgnoRo
8f20: 6f 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ot, 0);.  if( rc
8f30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8f40: 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
8f50: 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
8f60: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4f 70  .  }.  pCur->pOp
8f70: 73 20 3d 20 26 73 71 6c 69 74 65 42 74 72 65 65  s = &sqliteBtree
8f80: 43 75 72 73 6f 72 4f 70 73 3b 0a 20 20 70 43 75  CursorOps;.  pCu
8f90: 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
8fa0: 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77  pCur->wrFlag = w
8fb0: 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 69  rFlag;.  pCur->i
8fc0: 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
8fd0: 65 53 6b 69 70 20 3d 20 53 4b 49 50 5f 49 4e 56  eSkip = SKIP_INV
8fe0: 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  ALID;.  pCur->pN
8ff0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
9000: 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
9010: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
9020: 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
9030: 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 43  = pCur;.  }.  pC
9040: 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  ur->pPrev = 0;. 
9050: 20 70 52 69 6e 67 20 3d 20 70 42 74 2d 3e 70 43   pRing = pBt->pC
9060: 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
9070: 70 52 69 6e 67 20 26 26 20 70 52 69 6e 67 2d 3e  pRing && pRing->
9080: 70 67 6e 6f 52 6f 6f 74 21 3d 70 43 75 72 2d 3e  pgnoRoot!=pCur->
9090: 70 67 6e 6f 52 6f 6f 74 20 29 7b 20 70 52 69 6e  pgnoRoot ){ pRin
90a0: 67 20 3d 20 70 52 69 6e 67 2d 3e 70 4e 65 78 74  g = pRing->pNext
90b0: 3b 20 7d 0a 20 20 69 66 28 20 70 52 69 6e 67 20  ; }.  if( pRing 
90c0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 53 68  ){.    pCur->pSh
90d0: 61 72 65 64 20 3d 20 70 52 69 6e 67 2d 3e 70 53  ared = pRing->pS
90e0: 68 61 72 65 64 3b 0a 20 20 20 20 70 52 69 6e 67  hared;.    pRing
90f0: 2d 3e 70 53 68 61 72 65 64 20 3d 20 70 43 75 72  ->pShared = pCur
9100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9110: 43 75 72 2d 3e 70 53 68 61 72 65 64 20 3d 20 70  Cur->pShared = p
9120: 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
9130: 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
9140: 20 20 2a 70 70 43 75 72 20 3d 20 70 43 75 72 3b    *ppCur = pCur;
9150: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9160: 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72  _OK;..create_cur
9170: 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20  sor_exception:. 
9180: 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20 20 69   *ppCur = 0;.  i
9190: 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 69  f( pCur ){.    i
91a0: 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
91b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
91c0: 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ef(pCur->pPage);
91d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
91e0: 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c  pCur);.  }.  unl
91f0: 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
9200: 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
9210: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
9220: 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
9230: 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
9240: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9250: 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
9260: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
9270: 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
9280: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
9290: 6c 65 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  leBtreeCloseCurs
92a0: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
92b0: 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
92c0: 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
92d0: 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
92e0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72  ){.    pCur->pPr
92f0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
9300: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
9310: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  {.    pBt->pCurs
9320: 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
9330: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
9340: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
9350: 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
9360: 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
9370: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
9380: 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71  >pPage ){.    sq
9390: 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28  litepager_unref(
93a0: 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
93b0: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 53  }.  if( pCur->pS
93c0: 68 61 72 65 64 21 3d 70 43 75 72 20 29 7b 0a 20  hared!=pCur ){. 
93d0: 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 52 69     BtCursor *pRi
93e0: 6e 67 20 3d 20 70 43 75 72 2d 3e 70 53 68 61 72  ng = pCur->pShar
93f0: 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ed;.    while( p
9400: 52 69 6e 67 2d 3e 70 53 68 61 72 65 64 21 3d 70  Ring->pShared!=p
9410: 43 75 72 20 29 7b 20 70 52 69 6e 67 20 3d 20 70  Cur ){ pRing = p
9420: 52 69 6e 67 2d 3e 70 53 68 61 72 65 64 3b 20 7d  Ring->pShared; }
9430: 0a 20 20 20 20 70 52 69 6e 67 2d 3e 70 53 68 61  .    pRing->pSha
9440: 72 65 64 20 3d 20 70 43 75 72 2d 3e 70 53 68 61  red = pCur->pSha
9450: 72 65 64 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63  red;.  }.  unloc
9460: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
9470: 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Bt);.  sqliteFre
9480: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
9490: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
94a0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d  /*.** Make a tem
94b0: 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79  porary cursor by
94c0: 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
94d0: 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43  fields of pTempC
94e0: 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f  ur..** The tempo
94f0: 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e  rary cursor is n
9500: 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ot on the cursor
9510: 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74   list for the Bt
9520: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ree..*/.static v
9530: 6f 69 64 20 67 65 74 54 65 6d 70 43 75 72 73 6f  oid getTempCurso
9540: 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
9550: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
9560: 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70 79 28  pCur){.  memcpy(
9570: 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
9580: 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
9590: 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
95a0: 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
95b0: 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
95c0: 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  if( pTempCur->pP
95d0: 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
95e0: 65 70 61 67 65 72 5f 72 65 66 28 70 54 65 6d 70  epager_ref(pTemp
95f0: 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d  Cur->pPage);.  }
9600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
9610: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
9620: 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
9630: 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
9640: 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
9650: 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
9660: 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
9670: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65 6d   void releaseTem
9680: 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
9690: 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
96a0: 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
96b0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e    sqlitepager_un
96c0: 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 29  ref(pCur->pPage)
96d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
96e0: 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
96f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9700: 20 6f 66 20 6b 65 79 20 69 6e 20 74 68 65 20 65   of key in the e
9710: 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
9720: 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
9730: 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20  nts to.  Always 
9740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9750: 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  ..** Failure is 
9760: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  not possible.  I
9770: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
9780: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  not currently.**
9790: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20   pointing to an 
97a0: 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e  entry (which can
97b0: 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
97c0: 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20  mple, if.** the 
97d0: 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
97e0: 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69  y) then *pSize i
97f0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
9800: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 42 74  tatic int fileBt
9810: 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
9820: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
9830: 70 53 69 7a 65 29 7b 0a 20 20 43 65 6c 6c 20 2a  pSize){.  Cell *
9840: 70 43 65 6c 6c 3b 0a 20 20 4d 65 6d 50 61 67 65  pCell;.  MemPage
9850: 20 2a 70 50 61 67 65 3b 0a 0a 20 20 70 50 61 67   *pPage;..  pPag
9860: 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
9870: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9880: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  !=0 );.  if( pCu
9890: 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d  r->idx >= pPage-
98a0: 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 2a 70  >nCell ){.    *p
98b0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Size = 0;.  }els
98c0: 65 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  e{.    pCell = p
98d0: 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 70 43 75  Page->apCell[pCu
98e0: 72 2d 3e 69 64 78 5d 3b 0a 20 20 20 20 2a 70 53  r->idx];.    *pS
98f0: 69 7a 65 20 3d 20 4e 4b 45 59 28 70 43 75 72 2d  ize = NKEY(pCur-
9900: 3e 70 42 74 2c 20 70 43 65 6c 6c 2d 3e 68 29 3b  >pBt, pCell->h);
9910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9920: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9930: 2a 20 52 65 61 64 20 70 61 79 6c 6f 61 64 20 69  * Read payload i
9940: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
9950: 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
9960: 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
9970: 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  s.** pointing to
9980: 2e 20 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  .  Begin reading
9990: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 74 20   the payload at 
99a0: 22 6f 66 66 73 65 74 22 20 61 6e 64 20 72 65 61  "offset" and rea
99b0: 64 0a 2a 2a 20 61 20 74 6f 74 61 6c 20 6f 66 20  d.** a total of 
99c0: 22 61 6d 74 22 20 62 79 74 65 73 2e 20 20 50 75  "amt" bytes.  Pu
99d0: 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  t the result in 
99e0: 7a 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zBuf..**.** This
99f0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
9a00: 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
9a10: 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
9a20: 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
9a30: 20 6a 75 73 74 20 72 65 61 64 73 20 62 79 74 65   just reads byte
9a40: 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
9a50: 61 64 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  ad area..*/.stat
9a60: 69 63 20 69 6e 74 20 67 65 74 50 61 79 6c 6f 61  ic int getPayloa
9a70: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
9a80: 2c 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e  , int offset, in
9a90: 74 20 61 6d 74 2c 20 63 68 61 72 20 2a 7a 42 75  t amt, char *zBu
9aa0: 66 29 7b 0a 20 20 63 68 61 72 20 2a 61 50 61 79  f){.  char *aPay
9ab0: 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f 20 6e 65 78  load;.  Pgno nex
9ac0: 74 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  tPage;.  int rc;
9ad0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20  .  Btree *pBt = 
9ae0: 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 61 73 73  pCur->pBt;.  ass
9af0: 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
9b00: 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
9b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
9b20: 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
9b30: 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
9b40: 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 50  e->nCell );.  aP
9b50: 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 70  ayload = pCur->p
9b60: 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 70 43 75  Page->apCell[pCu
9b70: 72 2d 3e 69 64 78 5d 2d 3e 61 50 61 79 6c 6f 61  r->idx]->aPayloa
9b80: 64 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  d;.  if( offset<
9b90: 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44  MX_LOCAL_PAYLOAD
9ba0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
9bb0: 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
9bc0: 66 66 73 65 74 3e 4d 58 5f 4c 4f 43 41 4c 5f 50  ffset>MX_LOCAL_P
9bd0: 41 59 4c 4f 41 44 20 29 7b 0a 20 20 20 20 20 20  AYLOAD ){.      
9be0: 61 20 3d 20 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59  a = MX_LOCAL_PAY
9bf0: 4c 4f 41 44 20 2d 20 6f 66 66 73 65 74 3b 0a 20  LOAD - offset;. 
9c00: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
9c10: 7a 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b  zBuf, &aPayload[
9c20: 6f 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20 20  offset], a);.   
9c30: 20 69 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a 20   if( a==amt ){. 
9c40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9c50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
9c60: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
9c70: 20 7a 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   zBuf += a;.    
9c80: 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
9c90: 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
9ca0: 20 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41   MX_LOCAL_PAYLOA
9cb0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 6d 74  D;.  }.  if( amt
9cc0: 3e 30 20 29 7b 0a 20 20 20 20 6e 65 78 74 50 61  >0 ){.    nextPa
9cd0: 67 65 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c  ge = SWAB32(pBt,
9ce0: 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 70   pCur->pPage->ap
9cf0: 43 65 6c 6c 5b 70 43 75 72 2d 3e 69 64 78 5d 2d  Cell[pCur->idx]-
9d00: 3e 6f 76 66 6c 29 3b 0a 20 20 7d 0a 20 20 77 68  >ovfl);.  }.  wh
9d10: 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 6e 65  ile( amt>0 && ne
9d20: 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 4f 76  xtPage ){.    Ov
9d30: 65 72 66 6c 6f 77 50 61 67 65 20 2a 70 4f 76 66  erflowPage *pOvf
9d40: 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  l;.    rc = sqli
9d50: 74 65 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d  tepager_get(pBt-
9d60: 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
9d70: 65 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66  e, (void**)&pOvf
9d80: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
9d90: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
9da0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
9db0: 6e 65 78 74 50 61 67 65 20 3d 20 53 57 41 42 33  nextPage = SWAB3
9dc0: 32 28 70 42 74 2c 20 70 4f 76 66 6c 2d 3e 69 4e  2(pBt, pOvfl->iN
9dd0: 65 78 74 29 3b 0a 20 20 20 20 69 66 28 20 6f 66  ext);.    if( of
9de0: 66 73 65 74 3c 4f 56 45 52 46 4c 4f 57 5f 53 49  fset<OVERFLOW_SI
9df0: 5a 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ZE ){.      int 
9e00: 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 69  a = amt;.      i
9e10: 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
9e20: 4f 56 45 52 46 4c 4f 57 5f 53 49 5a 45 20 29 7b  OVERFLOW_SIZE ){
9e30: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4f 56 45  .        a = OVE
9e40: 52 46 4c 4f 57 5f 53 49 5a 45 20 2d 20 6f 66 66  RFLOW_SIZE - off
9e50: 73 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  set;.      }.   
9e60: 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
9e70: 26 70 4f 76 66 6c 2d 3e 61 50 61 79 6c 6f 61 64  &pOvfl->aPayload
9e80: 5b 6f 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20  [offset], a);.  
9e90: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
9ea0: 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
9eb0: 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 61 3b        zBuf += a;
9ec0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9ed0: 20 20 6f 66 66 73 65 74 20 2d 3d 20 4f 56 45 52    offset -= OVER
9ee0: 46 4c 4f 57 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  FLOW_SIZE;.    }
9ef0: 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72  .    sqlitepager
9f00: 5f 75 6e 72 65 66 28 70 4f 76 66 6c 29 3b 0a 20  _unref(pOvfl);. 
9f10: 20 7d 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29   }.  if( amt>0 )
9f20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9f30: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
9f40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9f50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
9f60: 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
9f70: 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
9f80: 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
9f90: 20 41 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 6f 66   A maximum.** of
9fa0: 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
9fb0: 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
9fc0: 69 6e 74 6f 20 7a 42 75 66 5b 5d 2e 20 20 54 68  into zBuf[].  Th
9fd0: 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
9fe0: 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
9ff0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
a000: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
a010: 72 65 61 64 20 69 73 0a 2a 2a 20 72 65 74 75 72  read is.** retur
a020: 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ned. .**.** Chan
a030: 67 65 3a 20 20 49 74 20 75 73 65 64 20 74 6f 20  ge:  It used to 
a040: 62 65 20 74 68 61 74 20 74 68 65 20 61 6d 6f 75  be that the amou
a050: 6e 74 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  nt returned will
a060: 20 62 65 20 73 6d 61 6c 6c 65 72 0a 2a 2a 20 74   be smaller.** t
a070: 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 72  han the amount r
a080: 65 71 75 65 73 74 65 64 20 69 66 20 74 68 65 72  equested if ther
a090: 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68  e are not enough
a0a0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
a0b0: 79 0a 2a 2a 20 74 6f 20 73 61 74 69 73 66 79 20  y.** to satisfy 
a0c0: 74 68 65 20 72 65 71 75 65 73 74 2e 20 20 42 75  the request.  Bu
a0d0: 74 20 6e 6f 77 2c 20 69 74 20 6d 75 73 74 20 62  t now, it must b
a0e0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
a0f0: 74 68 65 72 65 0a 2a 2a 20 69 73 20 65 6e 6f 75  there.** is enou
a100: 67 68 20 64 61 74 61 20 61 76 61 69 6c 61 62 6c  gh data availabl
a110: 65 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  e to satisfy the
a120: 20 72 65 71 75 65 73 74 2e 20 20 49 66 20 6e 6f   request.  If no
a130: 74 2c 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 0a  t, an exception.
a140: 2a 2a 20 69 73 20 72 61 69 73 65 64 2e 20 20 54  ** is raised.  T
a150: 68 65 20 63 68 61 6e 67 65 20 77 61 73 20 6d 61  he change was ma
a160: 64 65 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  de in an effort 
a170: 74 6f 20 62 6f 6f 73 74 20 70 65 72 66 6f 72 6d  to boost perform
a180: 61 6e 63 65 0a 2a 2a 20 62 79 20 65 6c 69 6d 69  ance.** by elimi
a190: 6e 61 74 69 6e 67 20 75 6e 6e 65 65 64 65 64 20  nating unneeded 
a1a0: 74 65 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tests..*/.static
a1b0: 20 69 6e 74 20 66 69 6c 65 42 74 72 65 65 4b 65   int fileBtreeKe
a1c0: 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
a1d0: 2c 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e  , int offset, in
a1e0: 74 20 61 6d 74 2c 20 63 68 61 72 20 2a 7a 42 75  t amt, char *zBu
a1f0: 66 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  f){.  MemPage *p
a200: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
a210: 20 61 6d 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73   amt>=0 );.  ass
a220: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29  ert( offset>=0 )
a230: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
a240: 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
a250: 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
a260: 61 67 65 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  age;.  if( pCur-
a270: 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e  >idx >= pPage->n
a280: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Cell ){.    retu
a290: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
a2a0: 72 74 28 20 61 6d 74 2b 6f 66 66 73 65 74 20 3c  rt( amt+offset <
a2b0: 3d 20 4e 4b 45 59 28 70 43 75 72 2d 3e 70 42 74  = NKEY(pCur->pBt
a2c0: 2c 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b  , pPage->apCell[
a2d0: 70 43 75 72 2d 3e 69 64 78 5d 2d 3e 68 29 20 29  pCur->idx]->h) )
a2e0: 3b 0a 20 20 67 65 74 50 61 79 6c 6f 61 64 28 70  ;.  getPayload(p
a2f0: 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
a300: 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72  , zBuf);.  retur
a310: 6e 20 61 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n amt;.}../*.** 
a320: 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
a330: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
a340: 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
a350: 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
a360: 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
a370: 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
a380: 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
a390: 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
a3a0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
a3b0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
a3c0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
a3d0: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
a3e0: 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
a3f0: 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
a400: 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
a410: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
a420: 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
a430: 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
a440: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
a450: 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
a460: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
a470: 74 20 2a 70 53 69 7a 65 29 7b 0a 20 20 43 65 6c  t *pSize){.  Cel
a480: 6c 20 2a 70 43 65 6c 6c 3b 0a 20 20 4d 65 6d 50  l *pCell;.  MemP
a490: 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 70  age *pPage;..  p
a4a0: 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
a4b0: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
a4c0: 61 67 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  age!=0 );.  if( 
a4d0: 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61  pCur->idx >= pPa
a4e0: 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
a4f0: 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d   *pSize = 0;.  }
a500: 65 6c 73 65 7b 0a 20 20 20 20 70 43 65 6c 6c 20  else{.    pCell 
a510: 3d 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b  = pPage->apCell[
a520: 70 43 75 72 2d 3e 69 64 78 5d 3b 0a 20 20 20 20  pCur->idx];.    
a530: 2a 70 53 69 7a 65 20 3d 20 4e 44 41 54 41 28 70  *pSize = NDATA(p
a540: 43 75 72 2d 3e 70 42 74 2c 20 70 43 65 6c 6c 2d  Cur->pBt, pCell-
a550: 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  >h);.  }.  retur
a560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a570: 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
a580: 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
a590: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
a5a0: 6f 72 20 70 43 75 72 2e 20 20 41 20 6d 61 78 69  or pCur.  A maxi
a5b0: 6d 75 6d 0a 2a 2a 20 6f 66 20 22 61 6d 74 22 20  mum.** of "amt" 
a5c0: 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
a5d0: 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 7a 42  ansfered into zB
a5e0: 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
a5f0: 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
a600: 20 22 6f 66 66 73 65 74 22 2e 20 20 54 68 65 20   "offset".  The 
a610: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a620: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 69 73  actually read is
a630: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 20 54  .** returned.  T
a640: 68 65 20 61 6d 6f 75 6e 74 20 72 65 74 75 72 6e  he amount return
a650: 65 64 20 77 69 6c 6c 20 62 65 20 73 6d 61 6c 6c  ed will be small
a660: 65 72 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 61  er than the.** a
a670: 6d 6f 75 6e 74 20 72 65 71 75 65 73 74 65 64 20  mount requested 
a680: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 74  if there are not
a690: 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 69 6e   enough bytes in
a6a0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 6f 20   the data.** to 
a6b0: 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75  satisfy the requ
a6c0: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  est..*/.static i
a6d0: 6e 74 20 66 69 6c 65 42 74 72 65 65 44 61 74 61  nt fileBtreeData
a6e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
a6f0: 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74   int offset, int
a700: 20 61 6d 74 2c 20 63 68 61 72 20 2a 7a 42 75 66   amt, char *zBuf
a710: 29 7b 0a 20 20 43 65 6c 6c 20 2a 70 43 65 6c 6c  ){.  Cell *pCell
a720: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
a730: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ge;..  assert( a
a740: 6d 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  mt>=0 );.  asser
a750: 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
a760: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
a770: 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 70 50  pPage!=0 );.  pP
a780: 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
a790: 65 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  e;.  if( pCur->i
a7a0: 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65  dx >= pPage->nCe
a7b0: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
a7c0: 20 30 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20   0;.  }.  pCell 
a7d0: 3d 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b  = pPage->apCell[
a7e0: 70 43 75 72 2d 3e 69 64 78 5d 3b 0a 20 20 61 73  pCur->idx];.  as
a7f0: 73 65 72 74 28 20 61 6d 74 2b 6f 66 66 73 65 74  sert( amt+offset
a800: 20 3c 3d 20 4e 44 41 54 41 28 70 43 75 72 2d 3e   <= NDATA(pCur->
a810: 70 42 74 2c 20 70 43 65 6c 6c 2d 3e 68 29 20 29  pBt, pCell->h) )
a820: 3b 0a 20 20 67 65 74 50 61 79 6c 6f 61 64 28 70  ;.  getPayload(p
a830: 43 75 72 2c 20 6f 66 66 73 65 74 20 2b 20 4e 4b  Cur, offset + NK
a840: 45 59 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43  EY(pCur->pBt, pC
a850: 65 6c 6c 2d 3e 68 29 2c 20 61 6d 74 2c 20 7a 42  ell->h), amt, zB
a860: 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6d  uf);.  return am
a870: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  t;.}../*.** Comp
a880: 61 72 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  are an external 
a890: 6b 65 79 20 61 67 61 69 6e 73 74 20 74 68 65 20  key against the 
a8a0: 6b 65 79 20 6f 6e 20 74 68 65 20 65 6e 74 72 79  key on the entry
a8b0: 20 74 68 61 74 20 70 43 75 72 20 70 6f 69 6e 74   that pCur point
a8c0: 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s to..**.** The 
a8d0: 65 78 74 65 72 6e 61 6c 20 6b 65 79 20 69 73 20  external key is 
a8e0: 70 4b 65 79 20 61 6e 64 20 69 73 20 6e 4b 65 79  pKey and is nKey
a8f0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 54 68   bytes long.  Th
a900: 65 20 6c 61 73 74 20 6e 49 67 6e 6f 72 65 20 62  e last nIgnore b
a910: 79 74 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  ytes.** of the k
a920: 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
a930: 74 68 20 70 43 75 72 20 61 72 65 20 69 67 6e 6f  th pCur are igno
a940: 72 65 64 2c 20 61 73 20 69 66 20 74 68 65 79 20  red, as if they 
a950: 64 6f 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a  do not exist..**
a960: 20 28 54 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73   (The normal cas
a970: 65 20 69 73 20 66 6f 72 20 6e 49 67 6e 6f 72 65  e is for nIgnore
a980: 20 74 6f 20 62 65 20 7a 65 72 6f 20 69 6e 20 77   to be zero in w
a990: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 65 6e  hich case the en
a9a0: 74 69 72 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c  tire.** internal
a9b0: 20 6b 65 79 20 69 73 20 75 73 65 64 20 69 6e 20   key is used in 
a9c0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 29  the comparison.)
a9d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61  .**.** The compa
a9e0: 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 69 73 20  rison result is 
a9f0: 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73  written to *pRes
aa00: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
aa10: 2a 2a 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  **    *pRes<0   
aa20: 20 54 68 69 73 20 6d 65 61 6e 73 20 70 43 75 72   This means pCur
aa30: 3c 70 4b 65 79 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  <pKey.**.**    *
aa40: 70 52 65 73 3d 3d 30 20 20 20 54 68 69 73 20 6d  pRes==0   This m
aa50: 65 61 6e 73 20 70 43 75 72 3d 3d 70 4b 65 79 20  eans pCur==pKey 
aa60: 66 6f 72 20 61 6c 6c 20 6e 4b 65 79 20 62 79 74  for all nKey byt
aa70: 65 73 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 70 52 65  es.**.**    *pRe
aa80: 73 3e 30 20 20 20 20 54 68 69 73 20 6d 65 61 6e  s>0    This mean
aa90: 73 20 70 43 75 72 3e 70 4b 65 79 0a 2a 2a 0a 2a  s pCur>pKey.**.*
aaa0: 2a 20 57 68 65 6e 20 6f 6e 65 20 6b 65 79 20 69  * When one key i
aab0: 73 20 61 6e 20 65 78 61 63 74 20 70 72 65 66 69  s an exact prefi
aac0: 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
aad0: 74 68 65 20 73 68 6f 72 74 65 72 20 6b 65 79 20  the shorter key 
aae0: 69 73 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  is.** considered
aaf0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
ab00: 6f 6e 67 65 72 20 6f 6e 65 2e 20 20 49 6e 20 6f  onger one.  In o
ab10: 72 64 65 72 20 74 6f 20 62 65 20 65 71 75 61 6c  rder to be equal
ab20: 20 74 68 65 0a 2a 2a 20 6b 65 79 73 20 6d 75 73   the.** keys mus
ab30: 74 20 62 65 20 65 78 61 63 74 6c 79 20 74 68 65  t be exactly the
ab40: 20 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20 28 54   same length. (T
ab50: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
ab60: 20 70 43 75 72 20 6b 65 79 0a 2a 2a 20 69 73 20   pCur key.** is 
ab70: 74 68 65 20 61 63 74 75 61 6c 20 6b 65 79 20 6c  the actual key l
ab80: 65 6e 67 74 68 20 6d 69 6e 75 73 20 6e 49 67 6e  ength minus nIgn
ab90: 6f 72 65 20 62 79 74 65 73 2e 29 0a 2a 2f 0a 73  ore bytes.).*/.s
aba0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 42 74  tatic int fileBt
abb0: 72 65 65 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  reeKeyCompare(. 
abc0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
abd0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
abe0: 72 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 63 6f  r to entry to co
abf0: 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
ac00: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
ac10: 4b 65 79 2c 20 20 20 20 20 2f 2a 20 4b 65 79 20  Key,     /* Key 
ac20: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
ac30: 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 70 43  st entry that pC
ac40: 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ur points to */.
ac50: 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
ac60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ac70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70 4b  r of bytes in pK
ac80: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 67 6e  ey */.  int nIgn
ac90: 6f 72 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ore,          /*
aca0: 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6d 61 6e   Ignore this man
acb0: 79 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  y bytes at the e
acc0: 6e 64 20 6f 66 20 70 43 75 72 20 2a 2f 0a 20 20  nd of pCur */.  
acd0: 69 6e 74 20 2a 70 52 65 73 75 6c 74 20 20 20 20  int *pResult    
ace0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
acf0: 68 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  he result here *
ad00: 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
ad10: 50 61 67 65 3b 0a 20 20 69 6e 74 20 6e 2c 20 63  Page;.  int n, c
ad20: 2c 20 72 63 2c 20 6e 4c 6f 63 61 6c 3b 0a 20 20  , rc, nLocal;.  
ad30: 43 65 6c 6c 20 2a 70 43 65 6c 6c 3b 0a 20 20 42  Cell *pCell;.  B
ad40: 74 72 65 65 20 2a 70 42 74 20 3d 20 70 43 75 72  tree *pBt = pCur
ad50: 2d 3e 70 42 74 3b 0a 20 20 63 6f 6e 73 74 20 63  ->pBt;.  const c
ad60: 68 61 72 20 2a 7a 4b 65 79 20 20 3d 20 28 63 6f  har *zKey  = (co
ad70: 6e 73 74 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a  nst char*)pKey;.
ad80: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
ad90: 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
ada0: 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
adb0: 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
adc0: 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
add0: 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 70 43   );.  pCell = pC
ade0: 75 72 2d 3e 70 50 61 67 65 2d 3e 61 70 43 65 6c  ur->pPage->apCel
adf0: 6c 5b 70 43 75 72 2d 3e 69 64 78 5d 3b 0a 20 20  l[pCur->idx];.  
ae00: 6e 4c 6f 63 61 6c 20 3d 20 4e 4b 45 59 28 70 42  nLocal = NKEY(pB
ae10: 74 2c 20 70 43 65 6c 6c 2d 3e 68 29 20 2d 20 6e  t, pCell->h) - n
ae20: 49 67 6e 6f 72 65 3b 0a 20 20 69 66 28 20 6e 4c  Ignore;.  if( nL
ae30: 6f 63 61 6c 3c 30 20 29 20 6e 4c 6f 63 61 6c 20  ocal<0 ) nLocal 
ae40: 3d 20 30 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 3c  = 0;.  n = nKey<
ae50: 6e 4c 6f 63 61 6c 20 3f 20 6e 4b 65 79 20 3a 20  nLocal ? nKey : 
ae60: 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 6e 3e  nLocal;.  if( n>
ae70: 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44  MX_LOCAL_PAYLOAD
ae80: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 4d 58 5f 4c   ){.    n = MX_L
ae90: 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 3b 0a 20 20  OCAL_PAYLOAD;.  
aea0: 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  }.  c = memcmp(p
aeb0: 43 65 6c 6c 2d 3e 61 50 61 79 6c 6f 61 64 2c 20  Cell->aPayload, 
aec0: 7a 4b 65 79 2c 20 6e 29 3b 0a 20 20 69 66 28 20  zKey, n);.  if( 
aed0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 65  c!=0 ){.    *pRe
aee0: 73 75 6c 74 20 3d 20 63 3b 0a 20 20 20 20 72 65  sult = c;.    re
aef0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
af00: 20 20 7d 0a 20 20 7a 4b 65 79 20 2b 3d 20 6e 3b    }.  zKey += n;
af10: 0a 20 20 6e 4b 65 79 20 2d 3d 20 6e 3b 0a 20 20  .  nKey -= n;.  
af20: 6e 4c 6f 63 61 6c 20 2d 3d 20 6e 3b 0a 20 20 6e  nLocal -= n;.  n
af30: 65 78 74 50 61 67 65 20 3d 20 53 57 41 42 33 32  extPage = SWAB32
af40: 28 70 42 74 2c 20 70 43 65 6c 6c 2d 3e 6f 76 66  (pBt, pCell->ovf
af50: 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4b 65  l);.  while( nKe
af60: 79 3e 30 20 26 26 20 6e 4c 6f 63 61 6c 3e 30 20  y>0 && nLocal>0 
af70: 29 7b 0a 20 20 20 20 4f 76 65 72 66 6c 6f 77 50  ){.    OverflowP
af80: 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  age *pOvfl;.    
af90: 69 66 28 20 6e 65 78 74 50 61 67 65 3d 3d 30 20  if( nextPage==0 
afa0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
afb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
afc0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
afd0: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 70  qlitepager_get(p
afe0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
aff0: 50 61 67 65 2c 20 28 76 6f 69 64 2a 2a 29 26 70  Page, (void**)&p
b000: 4f 76 66 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Ovfl);.    if( r
b010: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
b020: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
b030: 6e 65 78 74 50 61 67 65 20 3d 20 53 57 41 42 33  nextPage = SWAB3
b040: 32 28 70 42 74 2c 20 70 4f 76 66 6c 2d 3e 69 4e  2(pBt, pOvfl->iN
b050: 65 78 74 29 3b 0a 20 20 20 20 6e 20 3d 20 6e 4b  ext);.    n = nK
b060: 65 79 3c 6e 4c 6f 63 61 6c 20 3f 20 6e 4b 65 79  ey<nLocal ? nKey
b070: 20 3a 20 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69   : nLocal;.    i
b080: 66 28 20 6e 3e 4f 56 45 52 46 4c 4f 57 5f 53 49  f( n>OVERFLOW_SI
b090: 5a 45 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ZE ){.      n = 
b0a0: 4f 56 45 52 46 4c 4f 57 5f 53 49 5a 45 3b 0a 20  OVERFLOW_SIZE;. 
b0b0: 20 20 20 7d 0a 20 20 20 20 63 20 3d 20 6d 65 6d     }.    c = mem
b0c0: 63 6d 70 28 70 4f 76 66 6c 2d 3e 61 50 61 79 6c  cmp(pOvfl->aPayl
b0d0: 6f 61 64 2c 20 7a 4b 65 79 2c 20 6e 29 3b 0a 20  oad, zKey, n);. 
b0e0: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75     sqlitepager_u
b0f0: 6e 72 65 66 28 70 4f 76 66 6c 29 3b 0a 20 20 20  nref(pOvfl);.   
b100: 20 69 66 28 20 63 21 3d 30 20 29 7b 0a 20 20 20   if( c!=0 ){.   
b110: 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20 63 3b     *pResult = c;
b120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b130: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
b140: 20 20 20 6e 4b 65 79 20 2d 3d 20 6e 3b 0a 20 20     nKey -= n;.  
b150: 20 20 6e 4c 6f 63 61 6c 20 2d 3d 20 6e 3b 0a 20    nLocal -= n;. 
b160: 20 20 20 7a 4b 65 79 20 2b 3d 20 6e 3b 0a 20 20     zKey += n;.  
b170: 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  }.  if( c==0 ){.
b180: 20 20 20 20 63 20 3d 20 6e 4c 6f 63 61 6c 20 2d      c = nLocal -
b190: 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 52   nKey;.  }.  *pR
b1a0: 65 73 75 6c 74 20 3d 20 63 3b 0a 20 20 72 65 74  esult = c;.  ret
b1b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b1c0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
b1d0: 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
b1e0: 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
b1f0: 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
b200: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
b210: 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
b220: 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
b230: 69 6e 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  in the byte orde
b240: 72 20 6f 66 20 74 68 65 20 64 69 73 6b 20 69 6d  r of the disk im
b250: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b260: 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
b270: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
b280: 6e 74 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  nt newPgno){.  i
b290: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
b2a0: 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
b2b0: 72 65 65 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  ree *pBt = pCur-
b2c0: 3e 70 42 74 3b 0a 0a 20 20 6e 65 77 50 67 6e 6f  >pBt;..  newPgno
b2d0: 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c 20 6e   = SWAB32(pBt, n
b2e0: 65 77 50 67 6e 6f 29 3b 0a 20 20 72 63 20 3d 20  ewPgno);.  rc = 
b2f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28  sqlitepager_get(
b300: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 77  pBt->pPager, new
b310: 50 67 6e 6f 2c 20 28 76 6f 69 64 2a 2a 29 26 70  Pgno, (void**)&p
b320: 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20  NewPage);.  if( 
b330: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
b340: 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28    rc = initPage(
b350: 70 42 74 2c 20 70 4e 65 77 50 61 67 65 2c 20 6e  pBt, pNewPage, n
b360: 65 77 50 67 6e 6f 2c 20 70 43 75 72 2d 3e 70 50  ewPgno, pCur->pP
b370: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
b380: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
b390: 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
b3a0: 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  =pCur->pPage->nC
b3b0: 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ell.          ||
b3c0: 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 70   pCur->pPage->ap
b3d0: 43 65 6c 6c 5b 70 43 75 72 2d 3e 69 64 78 5d 2d  Cell[pCur->idx]-
b3e0: 3e 68 2e 6c 65 66 74 43 68 69 6c 64 3d 3d 53 57  >h.leftChild==SW
b3f0: 41 42 33 32 28 70 42 74 2c 6e 65 77 50 67 6e 6f  AB32(pBt,newPgno
b400: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b410: 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
b420: 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  Page->nCell.    
b430: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70        || pCur->p
b440: 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67 68  Page->u.hdr.righ
b450: 74 43 68 69 6c 64 3d 3d 53 57 41 42 33 32 28 70  tChild==SWAB32(p
b460: 42 74 2c 6e 65 77 50 67 6e 6f 29 20 29 3b 0a 20  Bt,newPgno) );. 
b470: 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61   pNewPage->idxPa
b480: 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78  rent = pCur->idx
b490: 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  ;.  pCur->pPage-
b4a0: 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
b4b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
b4c0: 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ef(pCur->pPage);
b4d0: 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
b4e0: 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
b4f0: 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 69 66  r->idx = 0;.  if
b500: 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
b510: 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  l<1 ){.    retur
b520: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b540: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b550: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
b560: 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
b570: 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
b580: 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
b590: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
b5a0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
b5b0: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
b5c0: 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
b5d0: 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
b5e0: 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
b5f0: 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
b600: 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
b610: 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
b620: 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
b630: 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
b640: 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
b650: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
b660: 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
b670: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
b680: 29 7b 0a 20 20 50 67 6e 6f 20 6f 6c 64 50 67 6e  ){.  Pgno oldPgn
b690: 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  o;.  MemPage *pP
b6a0: 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65  arent;.  MemPage
b6b0: 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
b6c0: 64 78 50 61 72 65 6e 74 3b 0a 20 20 70 50 61 67  dxParent;.  pPag
b6d0: 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
b6e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b6f0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 65 6e 74  !=0 );.  pParent
b700: 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
b710: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
b720: 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78  rent!=0 );.  idx
b730: 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
b740: 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  idxParent;.  sql
b750: 69 74 65 70 61 67 65 72 5f 72 65 66 28 70 50 61  itepager_ref(pPa
b760: 72 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 70  rent);.  sqlitep
b770: 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
b780: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65  );.  pCur->pPage
b790: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 61 73   = pParent;.  as
b7a0: 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
b7b0: 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
b7c0: 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78  if( pParent->idx
b7d0: 53 68 69 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Shift==0 ){.    
b7e0: 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
b7f0: 61 72 65 6e 74 3b 0a 23 69 66 6e 64 65 66 20 4e  arent;.#ifndef N
b800: 44 45 42 55 47 20 20 0a 20 20 20 20 2f 2a 20 56  DEBUG  .    /* V
b810: 65 72 69 66 79 20 74 68 61 74 20 70 43 75 72 2d  erify that pCur-
b820: 3e 69 64 78 20 69 73 20 74 68 65 20 63 6f 72 72  >idx is the corr
b830: 65 63 74 20 69 6e 64 65 78 20 74 6f 20 70 6f 69  ect index to poi
b840: 6e 74 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63  nt back to the c
b850: 68 69 6c 64 0a 20 20 20 20 2a 2a 20 70 61 67 65  hild.    ** page
b860: 20 77 65 20 6a 75 73 74 20 63 61 6d 65 20 66 72   we just came fr
b870: 6f 6d 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6f  om .    */.    o
b880: 6c 64 50 67 6e 6f 20 3d 20 53 57 41 42 33 32 28  ldPgno = SWAB32(
b890: 70 43 75 72 2d 3e 70 42 74 2c 20 73 71 6c 69 74  pCur->pBt, sqlit
b8a0: 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65  epager_pagenumbe
b8b0: 72 28 70 50 61 67 65 29 29 3b 0a 20 20 20 20 69  r(pPage));.    i
b8c0: 66 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  f( pCur->idx<pPa
b8d0: 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
b8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
b8f0: 72 65 6e 74 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  rent->apCell[idx
b900: 50 61 72 65 6e 74 5d 2d 3e 68 2e 6c 65 66 74 43  Parent]->h.leftC
b910: 68 69 6c 64 3d 3d 6f 6c 64 50 67 6e 6f 20 29 3b  hild==oldPgno );
b920: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b930: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
b940: 74 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74 43 68  t->u.hdr.rightCh
b950: 69 6c 64 3d 3d 6f 6c 64 50 67 6e 6f 20 29 3b 0a  ild==oldPgno );.
b960: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
b970: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
b980: 20 4d 65 6d 50 61 67 65 2e 69 64 78 53 68 69 66   MemPage.idxShif
b990: 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
b9a0: 20 74 68 61 74 20 63 65 6c 6c 20 69 6e 64 69 63   that cell indic
b9b0: 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 0a 20  es might have . 
b9c0: 20 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 73 69     ** changed si
b9d0: 6e 63 65 20 69 64 78 50 61 72 65 6e 74 20 77 61  nce idxParent wa
b9e0: 73 20 73 65 74 20 61 6e 64 20 68 65 6e 63 65 20  s set and hence 
b9f0: 69 64 78 50 61 72 65 6e 74 20 6d 69 67 68 74 20  idxParent might 
ba00: 62 65 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  be out.    ** of
ba10: 20 64 61 74 65 2e 20 20 53 6f 20 72 65 63 6f 6d   date.  So recom
ba20: 70 75 74 65 20 74 68 65 20 70 61 72 65 6e 74 20  pute the parent 
ba30: 63 65 6c 6c 20 69 6e 64 65 78 20 62 79 20 73 63  cell index by sc
ba40: 61 6e 6e 69 6e 67 20 61 6c 6c 20 63 65 6c 6c 73  anning all cells
ba50: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6c 6f 63 61  .    ** and loca
ba60: 74 69 6e 67 20 74 68 65 20 6f 6e 65 20 74 68 61  ting the one tha
ba70: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
ba80: 63 68 69 6c 64 20 77 65 20 6a 75 73 74 20 63 61  child we just ca
ba90: 6d 65 20 66 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a  me from..    */.
baa0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
bab0: 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 72 65  Cur->idx = pPare
bac0: 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 6f  nt->nCell;.    o
bad0: 6c 64 50 67 6e 6f 20 3d 20 53 57 41 42 33 32 28  ldPgno = SWAB32(
bae0: 70 43 75 72 2d 3e 70 42 74 2c 20 73 71 6c 69 74  pCur->pBt, sqlit
baf0: 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65  epager_pagenumbe
bb00: 72 28 70 50 61 67 65 29 29 3b 0a 20 20 20 20 66  r(pPage));.    f
bb10: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 65 6e  or(i=0; i<pParen
bb20: 74 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  t->nCell; i++){.
bb30: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e        if( pParen
bb40: 74 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2d 3e 68 2e  t->apCell[i]->h.
bb50: 6c 65 66 74 43 68 69 6c 64 3d 3d 6f 6c 64 50 67  leftChild==oldPg
bb60: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  no ){.        pC
bb70: 75 72 2d 3e 69 64 78 20 3d 20 69 3b 0a 20 20 20  ur->idx = i;.   
bb80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bb90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
bba0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
bbb0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f  cursor to the ro
bbc0: 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69  ot page.*/.stati
bbd0: 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
bbe0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
bbf0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  {.  MemPage *pNe
bc00: 77 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  w;.  int rc;.  B
bc10: 74 72 65 65 20 2a 70 42 74 20 3d 20 70 43 75 72  tree *pBt = pCur
bc20: 2d 3e 70 42 74 3b 0a 0a 20 20 72 63 20 3d 20 73  ->pBt;..  rc = s
bc30: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 70  qlitepager_get(p
bc40: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 43 75 72  Bt->pPager, pCur
bc50: 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 28 76 6f 69  ->pgnoRoot, (voi
bc60: 64 2a 2a 29 26 70 4e 65 77 29 3b 0a 20 20 69 66  d**)&pNew);.  if
bc70: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
bc80: 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67  ;.  rc = initPag
bc90: 65 28 70 42 74 2c 20 70 4e 65 77 2c 20 70 43 75  e(pBt, pNew, pCu
bca0: 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 30 29 3b  r->pgnoRoot, 0);
bcb0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
bcc0: 72 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 70  rn rc;.  sqlitep
bcd0: 61 67 65 72 5f 75 6e 72 65 66 28 70 43 75 72 2d  ager_unref(pCur-
bce0: 3e 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d  >pPage);.  pCur-
bcf0: 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 3b 0a 20  >pPage = pNew;. 
bd00: 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
bd10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bd20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  OK;.}../*.** Mov
bd30: 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
bd40: 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
bd50: 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
bd60: 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
bd70: 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
bd80: 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
bd90: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
bda0: 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
bdb0: 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
bdc0: 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
bdd0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 77 68  .  int rc;..  wh
bde0: 69 6c 65 28 20 28 70 67 6e 6f 20 3d 20 70 43 75  ile( (pgno = pCu
bdf0: 72 2d 3e 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c  r->pPage->apCell
be00: 5b 70 43 75 72 2d 3e 69 64 78 5d 2d 3e 68 2e 6c  [pCur->idx]->h.l
be10: 65 66 74 43 68 69 6c 64 29 21 3d 30 20 29 7b 0a  eftChild)!=0 ){.
be20: 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
be30: 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
be40: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
be50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
be60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
be70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
be80: 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
be90: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
bea0: 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
beb0: 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
bec0: 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
bed0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
bee0: 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
bef0: 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
bf00: 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
bf10: 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
bf20: 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
bf30: 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
bf40: 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
bf50: 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
bf60: 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
bf70: 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
bf80: 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
bf90: 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
bfa0: 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
bfb0: 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2f 0a   the *page*..*/.
bfc0: 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
bfd0: 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
bfe0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
bff0: 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
c000: 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 67  c;..  while( (pg
c010: 6e 6f 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  no = pCur->pPage
c020: 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74 43 68 69  ->u.hdr.rightChi
c030: 6c 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  ld)!=0 ){.    pC
c040: 75 72 2d 3e 69 64 78 20 3d 20 70 43 75 72 2d 3e  ur->idx = pCur->
c050: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
c060: 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
c070: 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
c080: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
c090: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
c0a0: 75 72 2d 3e 69 64 78 20 3d 20 70 43 75 72 2d 3e  ur->idx = pCur->
c0b0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31  pPage->nCell - 1
c0c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c0d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
c0e0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
c0f0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
c100: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
c110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
c120: 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
c130: 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
c140: 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
c150: 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
c160: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
c170: 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
c180: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
c190: 70 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pty..*/.static i
c1a0: 6e 74 20 66 69 6c 65 42 74 72 65 65 46 69 72 73  nt fileBtreeFirs
c1b0: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
c1c0: 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
c1d0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 43  int rc;.  if( pC
c1e0: 75 72 2d 3e 70 50 61 67 65 3d 3d 30 20 29 20 72  ur->pPage==0 ) r
c1f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
c200: 52 54 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  RT;.  rc = moveT
c210: 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
c220: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c230: 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  c;.  if( pCur->p
c240: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
c250: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
c260: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c270: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 2a 70 52  TE_OK;.  }.  *pR
c280: 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d  es = 0;.  rc = m
c290: 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
c2a0: 75 72 29 3b 0a 20 20 70 43 75 72 2d 3e 65 53 6b  ur);.  pCur->eSk
c2b0: 69 70 20 3d 20 53 4b 49 50 5f 4e 4f 4e 45 3b 0a  ip = SKIP_NONE;.
c2c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c2d0: 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
c2e0: 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
c2f0: 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
c300: 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
c310: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
c320: 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
c330: 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
c340: 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
c350: 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
c360: 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
c370: 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
c380: 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74   is empty..*/.st
c390: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 42 74 72  atic int fileBtr
c3a0: 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
c3b0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
c3c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
c3d0: 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 3d 3d  f( pCur->pPage==
c3e0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
c3f0: 45 5f 41 42 4f 52 54 3b 0a 20 20 72 63 20 3d 20  E_ABORT;.  rc = 
c400: 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
c410: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
c420: 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
c430: 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
c440: 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70  sInit );.  if( p
c450: 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
c460: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 65  l==0 ){.    *pRe
c470: 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
c480: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
c490: 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
c4a0: 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
c4b0: 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 70 43  most(pCur);.  pC
c4c0: 75 72 2d 3e 65 53 6b 69 70 20 3d 20 53 4b 49 50  ur->eSkip = SKIP
c4d0: 5f 4e 4f 4e 45 3b 0a 20 20 72 65 74 75 72 6e 20  _NONE;.  return 
c4e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
c4f0: 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
c500: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
c510: 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65  n entry near pKe
c520: 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  y..** Return a s
c530: 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
c540: 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
c550: 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
c560: 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
c570: 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
c580: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
c590: 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
c5a0: 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
c5b0: 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
c5c0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
c5d0: 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
c5e0: 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
c5f0: 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
c600: 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
c610: 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
c620: 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  The result of co
c630: 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
c640: 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
c650: 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63  o which the.** c
c660: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
c670: 69 6e 74 69 6e 67 20 69 73 20 73 74 6f 72 65 64  inting is stored
c680: 20 69 6e 20 70 43 75 72 2d 3e 69 4d 61 74 63 68   in pCur->iMatch
c690: 2e 20 20 54 68 65 20 73 61 6d 65 0a 2a 2a 20 76  .  The same.** v
c6a0: 61 6c 75 65 20 69 73 20 61 6c 73 6f 20 77 72 69  alue is also wri
c6b0: 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66  tten to *pRes if
c6c0: 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68   pRes!=NULL.  Th
c6d0: 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20  e meaning of.** 
c6e0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73  this value is as
c6f0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
c700: 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
c710: 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
c720: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
c730: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
c760: 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65  n pKey or if the
c770: 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
c780: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c790: 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
c7a0: 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
c7b0: 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
c7c0: 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
c7d0: 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
c7e0: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
c7f0: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
c800: 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
c820: 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
c830: 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
c840: 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
c850: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
c860: 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
c870: 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
c890: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79  larger than pKey
c8a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 0a 69 6e 74 20  ..*/.static.int 
c8b0: 66 69 6c 65 42 74 72 65 65 4d 6f 76 65 74 6f 28  fileBtreeMoveto(
c8c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
c8d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
c8e0: 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 69 6e 74 20  , int nKey, int 
c8f0: 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
c900: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  ;.  if( pCur->pP
c910: 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
c920: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
c930: 70 43 75 72 2d 3e 65 53 6b 69 70 20 3d 20 53 4b  pCur->eSkip = SK
c940: 49 50 5f 4e 4f 4e 45 3b 0a 20 20 72 63 20 3d 20  IP_NONE;.  rc = 
c950: 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
c960: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
c970: 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28 3b 3b  urn rc;.  for(;;
c980: 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
c990: 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
c9a0: 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
c9b0: 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
c9c0: 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20  >pPage;.    int 
c9d0: 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73  c = -1;  /* pRes
c9e0: 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65   return if table
c9f0: 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62   is empty must b
ca00: 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20  e -1 */.    lwr 
ca10: 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
ca20: 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
ca30: 20 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75     while( lwr<=u
ca40: 70 72 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  pr ){.      pCur
ca50: 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  ->idx = (lwr+upr
ca60: 29 2f 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )/2;.      rc = 
ca70: 66 69 6c 65 42 74 72 65 65 4b 65 79 43 6f 6d 70  fileBtreeKeyComp
ca80: 61 72 65 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  are(pCur, pKey, 
ca90: 6e 4b 65 79 2c 20 30 2c 20 26 63 29 3b 0a 20 20  nKey, 0, &c);.  
caa0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
cab0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66  urn rc;.      if
cac0: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
cad0: 20 20 70 43 75 72 2d 3e 69 4d 61 74 63 68 20 3d    pCur->iMatch =
cae0: 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   c;.        if( 
caf0: 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30  pRes ) *pRes = 0
cb00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
cb10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
cb20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
cb30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
cb40: 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
cb50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cb60: 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
cb70: 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
cb80: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
cb90: 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
cba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cbb0: 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
cbc0: 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
cbd0: 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
cbe0: 63 68 6c 64 50 67 20 3d 20 70 50 61 67 65 2d 3e  chldPg = pPage->
cbf0: 75 2e 68 64 72 2e 72 69 67 68 74 43 68 69 6c 64  u.hdr.rightChild
cc00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cc10: 20 20 20 63 68 6c 64 50 67 20 3d 20 70 50 61 67     chldPg = pPag
cc20: 65 2d 3e 61 70 43 65 6c 6c 5b 6c 77 72 5d 2d 3e  e->apCell[lwr]->
cc30: 68 2e 6c 65 66 74 43 68 69 6c 64 3b 0a 20 20 20  h.leftChild;.   
cc40: 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
cc50: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  g==0 ){.      pC
cc60: 75 72 2d 3e 69 4d 61 74 63 68 20 3d 20 63 3b 0a  ur->iMatch = c;.
cc70: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
cc80: 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
cc90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cca0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  OK;.    }.    pC
ccb0: 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20  ur->idx = lwr;. 
ccc0: 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
ccd0: 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
cce0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
ccf0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
cd00: 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20   /* NOT REACHED 
cd10: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  */.}../*.** Adva
cd20: 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
cd30: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
cd40: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
cd50: 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
cd60: 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
cd70: 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
cd80: 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
cd90: 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
cda0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
cdb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
cdc0: 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
cdd0: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
cde0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
cdf0: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  =1..*/.static in
ce00: 74 20 66 69 6c 65 42 74 72 65 65 4e 65 78 74 28  t fileBtreeNext(
ce10: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
ce20: 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
ce30: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
ce40: 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
ce50: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
ce60: 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
ce70: 20 70 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   pPage==0 ){.   
ce80: 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
ce90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
cea0: 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
ceb0: 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
cec0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
ced0: 75 72 2d 3e 65 53 6b 69 70 21 3d 53 4b 49 50 5f  ur->eSkip!=SKIP_
cee0: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  INVALID );.  if(
cef0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
cf00: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
cf10: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
cf20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
cf30: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
cf40: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
cf50: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 6b  .  if( pCur->eSk
cf60: 69 70 3d 3d 53 4b 49 50 5f 4e 45 58 54 20 29 7b  ip==SKIP_NEXT ){
cf70: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 6b 69 70  .    pCur->eSkip
cf80: 20 3d 20 53 4b 49 50 5f 4e 4f 4e 45 3b 0a 20 20   = SKIP_NONE;.  
cf90: 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
cfa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cfb0: 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  K;.  }.  pCur->e
cfc0: 53 6b 69 70 20 3d 20 53 4b 49 50 5f 4e 4f 4e 45  Skip = SKIP_NONE
cfd0: 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ;.  pCur->idx++;
cfe0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
cff0: 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
d000: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
d010: 3e 75 2e 68 64 72 2e 72 69 67 68 74 43 68 69 6c  >u.hdr.rightChil
d020: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
d030: 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
d040: 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72  , pPage->u.hdr.r
d050: 69 67 68 74 43 68 69 6c 64 29 3b 0a 20 20 20 20  ightChild);.    
d060: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
d070: 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
d080: 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
d090: 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
d0a0: 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
d0b0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
d0c0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
d0d0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
d0e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
d0f0: 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
d100: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d110: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
d120: 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
d130: 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
d140: 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
d150: 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
d160: 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->idx>=pPage->nC
d170: 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
d180: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
d190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d1a0: 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
d1b0: 66 28 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e  f( pPage->u.hdr.
d1c0: 72 69 67 68 74 43 68 69 6c 64 3d 3d 30 20 29 7b  rightChild==0 ){
d1d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d1e0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
d1f0: 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
d200: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
d210: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
d220: 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
d230: 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
d240: 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
d250: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
d260: 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
d270: 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
d280: 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
d290: 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
d2a0: 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
d2b0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
d2c0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
d2d0: 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
d2e0: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
d2f0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
d300: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  =1..*/.static in
d310: 74 20 66 69 6c 65 42 74 72 65 65 50 72 65 76 69  t fileBtreePrevi
d320: 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
d330: 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
d340: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
d350: 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65   pgno;.  MemPage
d360: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
d370: 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
d380: 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29    if( pPage==0 )
d390: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
d3a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d3b0: 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20  TE_ABORT;.  }.  
d3c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
d3d0: 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
d3e0: 74 28 20 70 43 75 72 2d 3e 65 53 6b 69 70 21 3d  t( pCur->eSkip!=
d3f0: 53 4b 49 50 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  SKIP_INVALID );.
d400: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
d410: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ll==0 ){.    *pR
d420: 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
d430: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d440: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
d450: 6b 69 70 3d 3d 53 4b 49 50 5f 50 52 45 56 20 29  kip==SKIP_PREV )
d460: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 6b 69  {.    pCur->eSki
d470: 70 20 3d 20 53 4b 49 50 5f 4e 4f 4e 45 3b 0a 20  p = SKIP_NONE;. 
d480: 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
d490: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d4a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
d4b0: 65 53 6b 69 70 20 3d 20 53 4b 49 50 5f 4e 4f 4e  eSkip = SKIP_NON
d4c0: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  E;.  assert( pCu
d4d0: 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69  r->idx>=0 );.  i
d4e0: 66 28 20 28 70 67 6e 6f 20 3d 20 70 50 61 67 65  f( (pgno = pPage
d4f0: 2d 3e 61 70 43 65 6c 6c 5b 70 43 75 72 2d 3e 69  ->apCell[pCur->i
d500: 64 78 5d 2d 3e 68 2e 6c 65 66 74 43 68 69 6c 64  dx]->h.leftChild
d510: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )!=0 ){.    rc =
d520: 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
d530: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
d540: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d550: 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
d560: 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
d570: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
d580: 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d  hile( pCur->idx=
d590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
d5a0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
d5b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
d5c0: 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
d5d0: 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
d5e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
d5f0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
d600: 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
d610: 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
d620: 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  r->pPage;.    }.
d630: 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b      pCur->idx--;
d640: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d650: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  _OK;.  }.  *pRes
d660: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
d670: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
d680: 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
d690: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
d6a0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
d6b0: 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
d6c0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
d6d0: 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
d6e0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
d6f0: 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
d700: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
d710: 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
d720: 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
d730: 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
d740: 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
d750: 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
d760: 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
d770: 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
d780: 2a 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  * sqlitepager_un
d790: 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
d7a0: 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
d7b0: 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
d7c0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
d7d0: 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
d7e0: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
d7f0: 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
d800: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
d810: 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
d820: 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
d830: 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
d840: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
d850: 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
d860: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 6f  epager_unref() o
d870: 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
d880: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
d890: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
d8a0: 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
d8b0: 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
d8c0: 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66  n a (feeble) eff
d8d0: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
d8e0: 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
d8f0: 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
d900: 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
d910: 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
d920: 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
d930: 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
d940: 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
d950: 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
d960: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
d970: 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
d980: 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
d990: 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
d9a0: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
d9b0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 50  ic int allocateP
d9c0: 61 67 65 28 42 74 72 65 65 20 2a 70 42 74 2c 20  age(Btree *pBt, 
d9d0: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d9e0: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 50  , Pgno *pPgno, P
d9f0: 67 6e 6f 20 6e 65 61 72 62 79 29 7b 0a 20 20 50  gno nearby){.  P
da00: 61 67 65 4f 6e 65 20 2a 70 50 61 67 65 31 20 3d  ageOne *pPage1 =
da10: 20 70 42 74 2d 3e 70 61 67 65 31 3b 0a 20 20 69   pBt->page1;.  i
da20: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
da30: 67 65 31 2d 3e 66 72 65 65 4c 69 73 74 20 29 7b  ge1->freeList ){
da40: 0a 20 20 20 20 4f 76 65 72 66 6c 6f 77 50 61 67  .    OverflowPag
da50: 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 46 72  e *pOvfl;.    Fr
da60: 65 65 6c 69 73 74 49 6e 66 6f 20 2a 70 49 6e 66  eelistInfo *pInf
da70: 6f 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o;..    rc = sql
da80: 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 70  itepager_write(p
da90: 50 61 67 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Page1);.    if( 
daa0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
dab0: 20 20 20 20 53 57 41 42 5f 41 44 44 28 70 42 74      SWAB_ADD(pBt
dac0: 2c 20 70 50 61 67 65 31 2d 3e 6e 46 72 65 65 2c  , pPage1->nFree,
dad0: 20 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73   -1);.    rc = s
dae0: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 70  qlitepager_get(p
daf0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 57 41 42  Bt->pPager, SWAB
db00: 33 32 28 70 42 74 2c 20 70 50 61 67 65 31 2d 3e  32(pBt, pPage1->
db10: 66 72 65 65 4c 69 73 74 29 2c 0a 20 20 20 20 20  freeList),.     
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66     (void**)&pOvf
db40: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
db50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
db60: 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
db70: 5f 77 72 69 74 65 28 70 4f 76 66 6c 29 3b 0a 20  _write(pOvfl);. 
db80: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
db90: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75     sqlitepager_u
dba0: 6e 72 65 66 28 70 4f 76 66 6c 29 3b 0a 20 20 20  nref(pOvfl);.   
dbb0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dbc0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20    }.    pInfo = 
dbd0: 28 46 72 65 65 6c 69 73 74 49 6e 66 6f 2a 29 70  (FreelistInfo*)p
dbe0: 4f 76 66 6c 2d 3e 61 50 61 79 6c 6f 61 64 3b 0a  Ovfl->aPayload;.
dbf0: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
dc00: 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Free==0 ){.     
dc10: 20 2a 70 50 67 6e 6f 20 3d 20 53 57 41 42 33 32   *pPgno = SWAB32
dc20: 28 70 42 74 2c 20 70 50 61 67 65 31 2d 3e 66 72  (pBt, pPage1->fr
dc30: 65 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  eeList);.      p
dc40: 50 61 67 65 31 2d 3e 66 72 65 65 4c 69 73 74 20  Page1->freeList 
dc50: 3d 20 70 4f 76 66 6c 2d 3e 69 4e 65 78 74 3b 0a  = pOvfl->iNext;.
dc60: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
dc70: 28 4d 65 6d 50 61 67 65 2a 29 70 4f 76 66 6c 3b  (MemPage*)pOvfl;
dc80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dc90: 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 2c 20 6e    int closest, n
dca0: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 53 57 41 42  ;.      n = SWAB
dcb0: 33 32 28 70 42 74 2c 20 70 49 6e 66 6f 2d 3e 6e  32(pBt, pInfo->n
dcc0: 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
dcd0: 20 6e 3e 31 20 26 26 20 6e 65 61 72 62 79 3e 30   n>1 && nearby>0
dce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
dcf0: 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
dd00: 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
dd10: 20 20 20 20 20 20 64 69 73 74 20 3d 20 53 57 41        dist = SWA
dd20: 42 33 32 28 70 42 74 2c 20 70 49 6e 66 6f 2d 3e  B32(pBt, pInfo->
dd30: 61 46 72 65 65 5b 30 5d 29 20 2d 20 6e 65 61 72  aFree[0]) - near
dd40: 62 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  by;.        if( 
dd50: 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20  dist<0 ) dist = 
dd60: 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  -dist;.        f
dd70: 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=1; i<n; i++
dd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
dd90: 20 64 32 20 3d 20 53 57 41 42 33 32 28 70 42 74   d2 = SWAB32(pBt
dda0: 2c 20 70 49 6e 66 6f 2d 3e 61 46 72 65 65 5b 69  , pInfo->aFree[i
ddb0: 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
ddc0: 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
ddd0: 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
dde0: 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
ddf0: 74 20 29 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b  t ) closest = i;
de00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
de10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
de20: 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
de30: 20 20 20 7d 0a 20 20 20 20 20 20 53 57 41 42 5f     }.      SWAB_
de40: 41 44 44 28 70 42 74 2c 20 70 49 6e 66 6f 2d 3e  ADD(pBt, pInfo->
de50: 6e 46 72 65 65 2c 20 2d 31 29 3b 0a 20 20 20 20  nFree, -1);.    
de60: 20 20 2a 70 50 67 6e 6f 20 3d 20 53 57 41 42 33    *pPgno = SWAB3
de70: 32 28 70 42 74 2c 20 70 49 6e 66 6f 2d 3e 61 46  2(pBt, pInfo->aF
de80: 72 65 65 5b 63 6c 6f 73 65 73 74 5d 29 3b 0a 20  ree[closest]);. 
de90: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 72 65       pInfo->aFre
dea0: 65 5b 63 6c 6f 73 65 73 74 5d 20 3d 20 70 49 6e  e[closest] = pIn
deb0: 66 6f 2d 3e 61 46 72 65 65 5b 6e 2d 31 5d 3b 0a  fo->aFree[n-1];.
dec0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ded0: 65 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  epager_get(pBt->
dee0: 70 50 61 67 65 72 2c 20 2a 70 50 67 6e 6f 2c 20  pPager, *pPgno, 
def0: 28 76 6f 69 64 2a 2a 29 70 70 50 61 67 65 29 3b  (void**)ppPage);
df00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67  .      sqlitepag
df10: 65 72 5f 75 6e 72 65 66 28 70 4f 76 66 6c 29 3b  er_unref(pOvfl);
df20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
df30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
df40: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
df50: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 2a 70  dont_rollback(*p
df60: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
df70: 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
df80: 5f 77 72 69 74 65 28 2a 70 70 50 61 67 65 29 3b  _write(*ppPage);
df90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dfa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 50 67   }else{.    *pPg
dfb0: 6e 6f 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  no = sqlitepager
dfc0: 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  _pagecount(pBt->
dfd0: 70 50 61 67 65 72 29 20 2b 20 31 3b 0a 20 20 20  pPager) + 1;.   
dfe0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
dff0: 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65  r_get(pBt->pPage
e000: 72 2c 20 2a 70 50 67 6e 6f 2c 20 28 76 6f 69 64  r, *pPgno, (void
e010: 2a 2a 29 70 70 50 61 67 65 29 3b 0a 20 20 20 20  **)ppPage);.    
e020: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e030: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
e040: 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 2a  itepager_write(*
e050: 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  ppPage);.  }.  r
e060: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e070: 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66  ** Add a page of
e080: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e090: 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  le to the freeli
e0a0: 73 74 2e 20 20 45 69 74 68 65 72 20 70 67 6e 6f  st.  Either pgno
e0b0: 20 6f 72 0a 2a 2a 20 70 50 61 67 65 20 62 75 74   or.** pPage but
e0c0: 20 6e 6f 74 20 62 6f 74 68 20 6d 61 79 20 62 65   not both may be
e0d0: 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74   0. .**.** sqlit
e0e0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  epager_unref() i
e0f0: 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
e100: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
e110: 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 42  c int freePage(B
e120: 74 72 65 65 20 2a 70 42 74 2c 20 76 6f 69 64 20  tree *pBt, void 
e130: 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  *pPage, Pgno pgn
e140: 6f 29 7b 0a 20 20 50 61 67 65 4f 6e 65 20 2a 70  o){.  PageOne *p
e150: 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 61 67  Page1 = pBt->pag
e160: 65 31 3b 0a 20 20 4f 76 65 72 66 6c 6f 77 50 61  e1;.  OverflowPa
e170: 67 65 20 2a 70 4f 76 66 6c 20 3d 20 28 4f 76 65  ge *pOvfl = (Ove
e180: 72 66 6c 6f 77 50 61 67 65 2a 29 70 50 61 67 65  rflowPage*)pPage
e190: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
e1a0: 74 20 6e 65 65 64 55 6e 72 65 66 20 3d 20 30 3b  t needUnref = 0;
e1b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  .  MemPage *pMem
e1c0: 50 61 67 65 3b 0a 0a 20 20 69 66 28 20 70 67 6e  Page;..  if( pgn
e1d0: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  o==0 ){.    asse
e1e0: 72 74 28 20 70 4f 76 66 6c 21 3d 30 20 29 3b 0a  rt( pOvfl!=0 );.
e1f0: 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74      pgno = sqlit
e200: 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65  epager_pagenumbe
e210: 72 28 70 4f 76 66 6c 29 3b 0a 20 20 7d 0a 20 20  r(pOvfl);.  }.  
e220: 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 32 20 29  assert( pgno>2 )
e230: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e240: 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  tepager_pagenumb
e250: 65 72 28 70 4f 76 66 6c 29 3d 3d 70 67 6e 6f 20  er(pOvfl)==pgno 
e260: 29 3b 0a 20 20 70 4d 65 6d 50 61 67 65 20 3d 20  );.  pMemPage = 
e270: 28 4d 65 6d 50 61 67 65 2a 29 70 50 61 67 65 3b  (MemPage*)pPage;
e280: 0a 20 20 70 4d 65 6d 50 61 67 65 2d 3e 69 73 49  .  pMemPage->isI
e290: 6e 69 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  nit = 0;.  if( p
e2a0: 4d 65 6d 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  MemPage->pParent
e2b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61   ){.    sqlitepa
e2c0: 67 65 72 5f 75 6e 72 65 66 28 70 4d 65 6d 50 61  ger_unref(pMemPa
e2d0: 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
e2e0: 20 20 70 4d 65 6d 50 61 67 65 2d 3e 70 50 61 72    pMemPage->pPar
e2f0: 65 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ent = 0;.  }.  r
e300: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
e310: 77 72 69 74 65 28 70 50 61 67 65 31 29 3b 0a 20  write(pPage1);. 
e320: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
e330: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
e340: 53 57 41 42 5f 41 44 44 28 70 42 74 2c 20 70 50  SWAB_ADD(pBt, pP
e350: 61 67 65 31 2d 3e 6e 46 72 65 65 2c 20 31 29 3b  age1->nFree, 1);
e360: 0a 20 20 69 66 28 20 70 50 61 67 65 31 2d 3e 6e  .  if( pPage1->n
e370: 46 72 65 65 21 3d 30 20 26 26 20 70 50 61 67 65  Free!=0 && pPage
e380: 31 2d 3e 66 72 65 65 4c 69 73 74 21 3d 30 20 29  1->freeList!=0 )
e390: 7b 0a 20 20 20 20 4f 76 65 72 66 6c 6f 77 50 61  {.    OverflowPa
e3a0: 67 65 20 2a 70 46 72 65 65 49 64 78 3b 0a 20 20  ge *pFreeIdx;.  
e3b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
e3c0: 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67  er_get(pBt->pPag
e3d0: 65 72 2c 20 53 57 41 42 33 32 28 70 42 74 2c 20  er, SWAB32(pBt, 
e3e0: 70 50 61 67 65 31 2d 3e 66 72 65 65 4c 69 73 74  pPage1->freeList
e3f0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
e400: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
e410: 2a 2a 29 26 70 46 72 65 65 49 64 78 29 3b 0a 20  **)&pFreeIdx);. 
e420: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e430: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 72  E_OK ){.      Fr
e440: 65 65 6c 69 73 74 49 6e 66 6f 20 2a 70 49 6e 66  eelistInfo *pInf
e450: 6f 20 3d 20 28 46 72 65 65 6c 69 73 74 49 6e 66  o = (FreelistInf
e460: 6f 2a 29 70 46 72 65 65 49 64 78 2d 3e 61 50 61  o*)pFreeIdx->aPa
e470: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 69 6e 74  yload;.      int
e480: 20 6e 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c   n = SWAB32(pBt,
e490: 20 70 49 6e 66 6f 2d 3e 6e 46 72 65 65 29 3b 0a   pInfo->nFree);.
e4a0: 20 20 20 20 20 20 69 66 28 20 6e 3c 28 73 69 7a        if( n<(siz
e4b0: 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 72 65 65  eof(pInfo->aFree
e4c0: 29 2f 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  )/sizeof(pInfo->
e4d0: 61 46 72 65 65 5b 30 5d 29 29 20 29 7b 0a 20 20  aFree[0])) ){.  
e4e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e4f0: 65 70 61 67 65 72 5f 77 72 69 74 65 28 70 46 72  epager_write(pFr
e500: 65 65 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20  eeIdx);.        
e510: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e520: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
e530: 49 6e 66 6f 2d 3e 61 46 72 65 65 5b 6e 5d 20 3d  Info->aFree[n] =
e540: 20 53 57 41 42 33 32 28 70 42 74 2c 20 70 67 6e   SWAB32(pBt, pgn
e550: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53 57  o);.          SW
e560: 41 42 5f 41 44 44 28 70 42 74 2c 20 70 49 6e 66  AB_ADD(pBt, pInf
e570: 6f 2d 3e 6e 46 72 65 65 2c 20 31 29 3b 0a 20 20  o->nFree, 1);.  
e580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 70 61          sqlitepa
e590: 67 65 72 5f 75 6e 72 65 66 28 70 46 72 65 65 49  ger_unref(pFreeI
e5a0: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  dx);.          s
e5b0: 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f  qlitepager_dont_
e5c0: 77 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  write(pBt->pPage
e5d0: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
e5e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e5f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67  .      sqlitepag
e610: 65 72 5f 75 6e 72 65 66 28 70 46 72 65 65 49 64  er_unref(pFreeId
e620: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
e630: 69 66 28 20 70 4f 76 66 6c 3d 3d 30 20 29 7b 0a  if( pOvfl==0 ){.
e640: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
e650: 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
e660: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 70  qlitepager_get(p
e670: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
e680: 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66 6c  , (void**)&pOvfl
e690: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
e6a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
e6b0: 65 65 64 55 6e 72 65 66 20 3d 20 31 3b 0a 20 20  eedUnref = 1;.  
e6c0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70  }.  rc = sqlitep
e6d0: 61 67 65 72 5f 77 72 69 74 65 28 70 4f 76 66 6c  ager_write(pOvfl
e6e0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
e6f0: 20 20 20 69 66 28 20 6e 65 65 64 55 6e 72 65 66     if( needUnref
e700: 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75   ) sqlitepager_u
e710: 6e 72 65 66 28 70 4f 76 66 6c 29 3b 0a 20 20 20  nref(pOvfl);.   
e720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
e730: 20 20 70 4f 76 66 6c 2d 3e 69 4e 65 78 74 20 3d    pOvfl->iNext =
e740: 20 70 50 61 67 65 31 2d 3e 66 72 65 65 4c 69 73   pPage1->freeLis
e750: 74 3b 0a 20 20 70 50 61 67 65 31 2d 3e 66 72 65  t;.  pPage1->fre
e760: 65 4c 69 73 74 20 3d 20 53 57 41 42 33 32 28 70  eList = SWAB32(p
e770: 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 6d 65 6d  Bt, pgno);.  mem
e780: 73 65 74 28 70 4f 76 66 6c 2d 3e 61 50 61 79 6c  set(pOvfl->aPayl
e790: 6f 61 64 2c 20 30 2c 20 4f 56 45 52 46 4c 4f 57  oad, 0, OVERFLOW
e7a0: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 6e 65  _SIZE);.  if( ne
e7b0: 65 64 55 6e 72 65 66 20 29 20 72 63 20 3d 20 73  edUnref ) rc = s
e7c0: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
e7d0: 28 70 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72  (pOvfl);.  retur
e7e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
e7f0: 72 61 73 65 20 61 6c 6c 20 74 68 65 20 64 61 74  rase all the dat
e800: 61 20 6f 75 74 20 6f 66 20 61 20 63 65 6c 6c 2e  a out of a cell.
e810: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
e820: 72 65 74 75 72 6e 69 6e 67 20 6f 76 65 72 66 6c  returning overfl
e830: 6f 77 0a 2a 2a 20 70 61 67 65 73 20 62 61 63 6b  ow.** pages back
e840: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
e850: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
e860: 61 72 43 65 6c 6c 28 42 74 72 65 65 20 2a 70 42  arCell(Btree *pB
e870: 74 2c 20 43 65 6c 6c 20 2a 70 43 65 6c 6c 29 7b  t, Cell *pCell){
e880: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e890: 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
e8a0: 20 20 4f 76 65 72 66 6c 6f 77 50 61 67 65 20 2a    OverflowPage *
e8b0: 70 4f 76 66 6c 3b 0a 20 20 50 67 6e 6f 20 6f 76  pOvfl;.  Pgno ov
e8c0: 66 6c 2c 20 6e 65 78 74 4f 76 66 6c 3b 0a 20 20  fl, nextOvfl;.  
e8d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 4e  int rc;..  if( N
e8e0: 4b 45 59 28 70 42 74 2c 20 70 43 65 6c 6c 2d 3e  KEY(pBt, pCell->
e8f0: 68 29 20 2b 20 4e 44 41 54 41 28 70 42 74 2c 20  h) + NDATA(pBt, 
e900: 70 43 65 6c 6c 2d 3e 68 29 20 3c 3d 20 4d 58 5f  pCell->h) <= MX_
e910: 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 20 29 7b  LOCAL_PAYLOAD ){
e920: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e930: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6f 76 66  TE_OK;.  }.  ovf
e940: 6c 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c 20  l = SWAB32(pBt, 
e950: 70 43 65 6c 6c 2d 3e 6f 76 66 6c 29 3b 0a 20 20  pCell->ovfl);.  
e960: 70 43 65 6c 6c 2d 3e 6f 76 66 6c 20 3d 20 30 3b  pCell->ovfl = 0;
e970: 0a 20 20 77 68 69 6c 65 28 20 6f 76 66 6c 20 29  .  while( ovfl )
e980: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e990: 65 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  epager_get(pPage
e9a0: 72 2c 20 6f 76 66 6c 2c 20 28 76 6f 69 64 2a 2a  r, ovfl, (void**
e9b0: 29 26 70 4f 76 66 6c 29 3b 0a 20 20 20 20 69 66  )&pOvfl);.    if
e9c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
e9d0: 3b 0a 20 20 20 20 6e 65 78 74 4f 76 66 6c 20 3d  ;.    nextOvfl =
e9e0: 20 53 57 41 42 33 32 28 70 42 74 2c 20 70 4f 76   SWAB32(pBt, pOv
e9f0: 66 6c 2d 3e 69 4e 65 78 74 29 3b 0a 20 20 20 20  fl->iNext);.    
ea00: 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 42  rc = freePage(pB
ea10: 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 29 3b  t, pOvfl, ovfl);
ea20: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
ea30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c  turn rc;.    sql
ea40: 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70  itepager_unref(p
ea50: 4f 76 66 6c 29 3b 0a 20 20 20 20 6f 76 66 6c 20  Ovfl);.    ovfl 
ea60: 3d 20 6e 65 78 74 4f 76 66 6c 3b 0a 20 20 7d 0a  = nextOvfl;.  }.
ea70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ea80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
ea90: 61 74 65 20 61 20 6e 65 77 20 63 65 6c 6c 20 66  ate a new cell f
eaa0: 72 6f 6d 20 6b 65 79 20 61 6e 64 20 64 61 74 61  rom key and data
eab0: 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
eac0: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
ead0: 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  as.** necessary 
eae0: 61 6e 64 20 6c 69 6e 6b 65 64 20 74 6f 20 74 68  and linked to th
eaf0: 69 73 20 63 65 6c 6c 2e 20 20 0a 2a 2f 0a 73 74  is cell.  .*/.st
eb00: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
eb10: 65 6c 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ell(.  Btree *pB
eb20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
eb30: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 42 74 72  /* The whole Btr
eb40: 65 65 2e 20 20 4e 65 65 64 65 64 20 74 6f 20 61  ee.  Needed to a
eb50: 6c 6c 6f 63 61 74 65 20 70 61 67 65 73 20 2a 2f  llocate pages */
eb60: 0a 20 20 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20  .  Cell *pCell, 
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
eb80: 6f 70 75 6c 61 74 65 20 74 68 69 73 20 43 65 6c  opulate this Cel
eb90: 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  l structure */. 
eba0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
ebb0: 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  y, int nKey,    
ebc0: 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
ebd0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
ebe0: 61 2c 69 6e 74 20 6e 44 61 74 61 20 20 20 20 2f  a,int nData    /
ebf0: 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 29 7b  * The data */.){
ec00: 0a 20 20 4f 76 65 72 66 6c 6f 77 50 61 67 65 20  .  OverflowPage 
ec10: 2a 70 4f 76 66 6c 2c 20 2a 70 50 72 69 6f 72 3b  *pOvfl, *pPrior;
ec20: 0a 20 20 50 67 6e 6f 20 2a 70 4e 65 78 74 3b 0a  .  Pgno *pNext;.
ec30: 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
ec40: 0a 20 20 69 6e 74 20 6e 2c 20 72 63 3b 0a 20 20  .  int n, rc;.  
ec50: 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
ec60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 50 61 79  const char *pPay
ec70: 6c 6f 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 53  load;.  char *pS
ec80: 70 61 63 65 3b 0a 20 20 50 67 6e 6f 20 6e 65 61  pace;.  Pgno nea
ec90: 72 62 79 20 3d 20 30 3b 0a 0a 20 20 70 43 65 6c  rby = 0;..  pCel
eca0: 6c 2d 3e 68 2e 6c 65 66 74 43 68 69 6c 64 20 3d  l->h.leftChild =
ecb0: 20 30 3b 0a 20 20 70 43 65 6c 6c 2d 3e 68 2e 6e   0;.  pCell->h.n
ecc0: 4b 65 79 20 3d 20 53 57 41 42 31 36 28 70 42 74  Key = SWAB16(pBt
ecd0: 2c 20 6e 4b 65 79 20 26 20 30 78 66 66 66 66 29  , nKey & 0xffff)
ece0: 3b 0a 20 20 70 43 65 6c 6c 2d 3e 68 2e 6e 4b 65  ;.  pCell->h.nKe
ecf0: 79 48 69 20 3d 20 6e 4b 65 79 20 3e 3e 20 31 36  yHi = nKey >> 16
ed00: 3b 0a 20 20 70 43 65 6c 6c 2d 3e 68 2e 6e 44 61  ;.  pCell->h.nDa
ed10: 74 61 20 3d 20 53 57 41 42 31 36 28 70 42 74 2c  ta = SWAB16(pBt,
ed20: 20 6e 44 61 74 61 20 26 20 30 78 66 66 66 66 29   nData & 0xffff)
ed30: 3b 0a 20 20 70 43 65 6c 6c 2d 3e 68 2e 6e 44 61  ;.  pCell->h.nDa
ed40: 74 61 48 69 20 3d 20 6e 44 61 74 61 20 3e 3e 20  taHi = nData >> 
ed50: 31 36 3b 0a 20 20 70 43 65 6c 6c 2d 3e 68 2e 69  16;.  pCell->h.i
ed60: 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 4e 65  Next = 0;..  pNe
ed70: 78 74 20 3d 20 26 70 43 65 6c 6c 2d 3e 6f 76 66  xt = &pCell->ovf
ed80: 6c 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 70 43  l;.  pSpace = pC
ed90: 65 6c 6c 2d 3e 61 50 61 79 6c 6f 61 64 3b 0a 20  ell->aPayload;. 
eda0: 20 73 70 61 63 65 4c 65 66 74 20 3d 20 4d 58 5f   spaceLeft = MX_
edb0: 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 3b 0a 20  LOCAL_PAYLOAD;. 
edc0: 20 70 50 61 79 6c 6f 61 64 20 3d 20 70 4b 65 79   pPayload = pKey
edd0: 3b 0a 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ;.  pKey = 0;.  
ede0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 4b 65 79 3b  nPayload = nKey;
edf0: 0a 20 20 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  .  pPrior = 0;. 
ee00: 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
ee10: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
ee20: 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  aceLeft==0 ){.  
ee30: 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
ee40: 65 50 61 67 65 28 70 42 74 2c 20 28 4d 65 6d 50  ePage(pBt, (MemP
ee50: 61 67 65 2a 2a 29 26 70 4f 76 66 6c 2c 20 70 4e  age**)&pOvfl, pN
ee60: 65 78 74 2c 20 6e 65 61 72 62 79 29 3b 0a 20 20  ext, nearby);.  
ee70: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ee80: 20 20 20 20 20 20 2a 70 4e 65 78 74 20 3d 20 30        *pNext = 0
ee90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eea0: 20 20 20 20 20 20 20 6e 65 61 72 62 79 20 3d 20         nearby = 
eeb0: 2a 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  *pNext;.      }.
eec0: 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
eed0: 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75   ) sqlitepager_u
eee0: 6e 72 65 66 28 70 50 72 69 6f 72 29 3b 0a 20 20  nref(pPrior);.  
eef0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ef00: 20 20 20 20 20 20 63 6c 65 61 72 43 65 6c 6c 28        clearCell(
ef10: 70 42 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  pBt, pCell);.   
ef20: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ef30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ef40: 28 20 70 42 74 2d 3e 6e 65 65 64 53 77 61 62 20  ( pBt->needSwab 
ef50: 29 20 2a 70 4e 65 78 74 20 3d 20 73 77 61 62 33  ) *pNext = swab3
ef60: 32 28 2a 70 4e 65 78 74 29 3b 0a 20 20 20 20 20  2(*pNext);.     
ef70: 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 3b   pPrior = pOvfl;
ef80: 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
ef90: 20 3d 20 4f 56 45 52 46 4c 4f 57 5f 53 49 5a 45   = OVERFLOW_SIZE
efa0: 3b 0a 20 20 20 20 20 20 70 53 70 61 63 65 20 3d  ;.      pSpace =
efb0: 20 70 4f 76 66 6c 2d 3e 61 50 61 79 6c 6f 61 64   pOvfl->aPayload
efc0: 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
efd0: 26 70 4f 76 66 6c 2d 3e 69 4e 65 78 74 3b 0a 20  &pOvfl->iNext;. 
efe0: 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
eff0: 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
f000: 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
f010: 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20   spaceLeft;.    
f020: 6d 65 6d 63 70 79 28 70 53 70 61 63 65 2c 20 70  memcpy(pSpace, p
f030: 50 61 79 6c 6f 61 64 2c 20 6e 29 3b 0a 20 20 20  Payload, n);.   
f040: 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
f050: 20 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64      if( nPayload
f060: 3d 3d 30 20 26 26 20 70 44 61 74 61 20 29 7b 0a  ==0 && pData ){.
f070: 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
f080: 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 6e 50   pData;.      nP
f090: 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a  ayload = nData;.
f0a0: 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b        pData = 0;
f0b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f0c0: 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
f0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 61 63 65  .    }.    space
f0e0: 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  Left -= n;.    p
f0f0: 53 70 61 63 65 20 2b 3d 20 6e 3b 0a 20 20 7d 0a  Space += n;.  }.
f100: 20 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20    *pNext = 0;.  
f110: 69 66 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20  if( pPrior ){.  
f120: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e    sqlitepager_un
f130: 72 65 66 28 70 50 72 69 6f 72 29 3b 0a 20 20 7d  ref(pPrior);.  }
f140: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f150: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
f160: 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65  ange the MemPage
f170: 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72  .pParent pointer
f180: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f   on the page who
f190: 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  se number is.** 
f1a0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
f1b0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20  ond argument so 
f1c0: 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61  that MemPage.pPa
f1d0: 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  rent holds the.*
f1e0: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
f1f0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
f200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f210: 72 65 70 61 72 65 6e 74 50 61 67 65 28 50 61 67  reparentPage(Pag
f220: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
f230: 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a   pgno, MemPage *
f240: 70 4e 65 77 50 61 72 65 6e 74 2c 69 6e 74 20 69  pNewParent,int i
f250: 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dx){.  MemPage *
f260: 70 54 68 69 73 3b 0a 0a 20 20 69 66 28 20 70 67  pThis;..  if( pg
f270: 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  no==0 ) return;.
f280: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f290: 21 3d 30 20 29 3b 0a 20 20 70 54 68 69 73 20 3d  !=0 );.  pThis =
f2a0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f   sqlitepager_loo
f2b0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
f2c0: 29 3b 0a 20 20 69 66 28 20 70 54 68 69 73 20 26  );.  if( pThis &
f2d0: 26 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20  & pThis->isInit 
f2e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73  ){.    if( pThis
f2f0: 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50  ->pParent!=pNewP
f300: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69  arent ){.      i
f310: 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
f320: 74 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f  t ) sqlitepager_
f330: 75 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61  unref(pThis->pPa
f340: 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 70 54 68  rent);.      pTh
f350: 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e  is->pParent = pN
f360: 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
f370: 69 66 28 20 70 4e 65 77 50 61 72 65 6e 74 20 29  if( pNewParent )
f380: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66   sqlitepager_ref
f390: 28 70 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20  (pNewParent);.  
f3a0: 20 20 7d 0a 20 20 20 20 70 54 68 69 73 2d 3e 69    }.    pThis->i
f3b0: 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a  dxParent = idx;.
f3c0: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
f3d0: 75 6e 72 65 66 28 70 54 68 69 73 29 3b 0a 20 20  unref(pThis);.  
f3e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 61 72  }.}../*.** Repar
f3f0: 65 6e 74 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  ent all children
f400: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
f410: 67 65 20 74 6f 20 62 65 20 74 68 65 20 67 69 76  ge to be the giv
f420: 65 6e 20 70 61 67 65 2e 0a 2a 2a 20 49 6e 20 6f  en page..** In o
f430: 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20  ther words, for 
f440: 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70  every child of p
f450: 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70  Page, invoke rep
f460: 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74  arentPage().** t
f470: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
f480: 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77   each child know
f490: 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20  s that pPage is 
f4a0: 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  its parent..**.*
f4b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
f4c0: 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72  ets called after
f4d0: 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e   you memcpy() on
f4e0: 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61  e page into.** a
f4f0: 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nother..*/.stati
f500: 63 20 76 6f 69 64 20 72 65 70 61 72 65 6e 74 43  c void reparentC
f510: 68 69 6c 64 50 61 67 65 73 28 42 74 72 65 65 20  hildPages(Btree 
f520: 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
f530: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Page){.  int i;.
f540: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
f550: 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
f560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
f570: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
f580: 20 20 20 20 72 65 70 61 72 65 6e 74 50 61 67 65      reparentPage
f590: 28 70 50 61 67 65 72 2c 20 53 57 41 42 33 32 28  (pPager, SWAB32(
f5a0: 70 42 74 2c 20 70 50 61 67 65 2d 3e 61 70 43 65  pBt, pPage->apCe
f5b0: 6c 6c 5b 69 5d 2d 3e 68 2e 6c 65 66 74 43 68 69  ll[i]->h.leftChi
f5c0: 6c 64 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a  ld), pPage, i);.
f5d0: 20 20 7d 0a 20 20 72 65 70 61 72 65 6e 74 50 61    }.  reparentPa
f5e0: 67 65 28 70 50 61 67 65 72 2c 20 53 57 41 42 33  ge(pPager, SWAB3
f5f0: 32 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 75 2e  2(pBt, pPage->u.
f600: 68 64 72 2e 72 69 67 68 74 43 68 69 6c 64 29 2c  hdr.rightChild),
f610: 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 70 50   pPage, i);.  pP
f620: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
f630: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  0;.}../*.** Remo
f640: 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
f650: 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
f660: 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
f670: 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
f680: 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
f690: 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
f6a0: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
f6b0: 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
f6c0: 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
f6d0: 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
f6e0: 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
f6f0: 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
f700: 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
f710: 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
f720: 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
f730: 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
f740: 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
f750: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
f760: 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
f770: 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  **.** Do not bot
f780: 68 65 72 20 6d 61 69 6e 74 61 69 6e 69 6e 67 20  her maintaining 
f790: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
f7a0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
f7b0: 20 6f 66 20 43 65 6c 6c 73 2e 0a 2a 2a 20 4f 6e   of Cells..** On
f7c0: 6c 79 20 74 68 65 20 70 50 61 67 65 2d 3e 61 70  ly the pPage->ap
f7d0: 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  Cell[] array is 
f7e0: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 20  important.  The 
f7f0: 72 65 6c 69 6e 6b 43 65 6c 6c 4c 69 73 74 28 29  relinkCellList()
f800: 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c   .** routine wil
f810: 6c 20 62 65 20 63 61 6c 6c 65 64 20 73 6f 6f 6e  l be called soon
f820: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
f830: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
f840: 72 65 62 75 69 6c 64 20 0a 2a 2a 20 74 68 65 20  rebuild .** the 
f850: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
f860: 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
f870: 43 65 6c 6c 28 42 74 72 65 65 20 2a 70 42 74 2c  Cell(Btree *pBt,
f880: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
f890: 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
f8a0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
f8b0: 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
f8c0: 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
f8d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
f8e0: 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 42 74 2c 20  ==cellSize(pBt, 
f8f0: 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 69 64  pPage->apCell[id
f900: 78 5d 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x]) );.  assert(
f910: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77   sqlitepager_isw
f920: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 29 20  riteable(pPage) 
f930: 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70  );.  freeSpace(p
f940: 42 74 2c 20 70 50 61 67 65 2c 20 41 64 64 72 28  Bt, pPage, Addr(
f950: 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 69 64  pPage->apCell[id
f960: 78 5d 29 20 2d 20 41 64 64 72 28 70 50 61 67 65  x]) - Addr(pPage
f970: 29 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 6a 3d  ), sz);.  for(j=
f980: 69 64 78 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  idx; j<pPage->nC
f990: 65 6c 6c 2d 31 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ell-1; j++){.   
f9a0: 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 6a   pPage->apCell[j
f9b0: 5d 20 3d 20 70 50 61 67 65 2d 3e 61 70 43 65 6c  ] = pPage->apCel
f9c0: 6c 5b 6a 2b 31 5d 3b 0a 20 20 7d 0a 20 20 70 50  l[j+1];.  }.  pP
f9d0: 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
f9e0: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
f9f0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 1;.}../*.** In
fa00: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
fa10: 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
fa20: 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
fa30: 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
fa40: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
fa50: 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
fa60: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
fa70: 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
fa80: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
fa90: 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
faa0: 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
fab0: 69 74 2c 20 74 68 65 6e 20 6a 75 73 74 20 6d 61  it, then just ma
fac0: 6b 65 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c  ke pPage->apCell
fad0: 5b 69 5d 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  [i] point to the
fae0: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 6e 64 20   content.** and 
faf0: 73 65 74 20 70 50 61 67 65 2d 3e 69 73 4f 76 65  set pPage->isOve
fb00: 72 66 75 6c 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 44  rfull.  .**.** D
fb10: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 6d 61 69  o not bother mai
fb20: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 74  ntaining the int
fb30: 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 6c 69  egrity of the li
fb40: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 43 65 6c  nked list of Cel
fb50: 6c 73 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  ls..** Only the 
fb60: 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 5d 20  pPage->apCell[] 
fb70: 61 72 72 61 79 20 69 73 20 69 6d 70 6f 72 74 61  array is importa
fb80: 6e 74 2e 20 20 54 68 65 20 72 65 6c 69 6e 6b 43  nt.  The relinkC
fb90: 65 6c 6c 4c 69 73 74 28 29 20 0a 2a 2a 20 72 6f  ellList() .** ro
fba0: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
fbb0: 6c 6c 65 64 20 73 6f 6f 6e 20 61 66 74 65 72 20  lled soon after 
fbc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
fbd0: 6f 72 64 65 72 20 74 6f 20 72 65 62 75 69 6c 64  order to rebuild
fbe0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6e 6b 65 64 20   .** the linked 
fbf0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
fc00: 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
fc10: 42 74 72 65 65 20 2a 70 42 74 2c 20 4d 65 6d 50  Btree *pBt, MemP
fc20: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
fc30: 69 2c 20 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20  i, Cell *pCell, 
fc40: 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69  int sz){.  int i
fc50: 64 78 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  dx, j;.  assert(
fc60: 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
fc70: 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
fc80: 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
fc90: 7a 65 28 70 42 74 2c 20 70 43 65 6c 6c 29 20 29  ze(pBt, pCell) )
fca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fcb0: 74 65 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  tepager_iswritea
fcc0: 62 6c 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20  ble(pPage) );.  
fcd0: 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  idx = allocateSp
fce0: 61 63 65 28 70 42 74 2c 20 70 50 61 67 65 2c 20  ace(pBt, pPage, 
fcf0: 73 7a 29 3b 0a 20 20 66 6f 72 28 6a 3d 70 50 61  sz);.  for(j=pPa
fd00: 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 3e 69 3b 20  ge->nCell; j>i; 
fd10: 6a 2d 2d 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  j--){.    pPage-
fd20: 3e 61 70 43 65 6c 6c 5b 6a 5d 20 3d 20 70 50 61  >apCell[j] = pPa
fd30: 67 65 2d 3e 61 70 43 65 6c 6c 5b 6a 2d 31 5d 3b  ge->apCell[j-1];
fd40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
fd50: 65 6c 6c 2b 2b 3b 0a 20 20 69 66 28 20 69 64 78  ell++;.  if( idx
fd60: 3c 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <=0 ){.    pPage
fd70: 2d 3e 69 73 4f 76 65 72 66 75 6c 6c 20 3d 20 31  ->isOverfull = 1
fd80: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 43  ;.    pPage->apC
fd90: 65 6c 6c 5b 69 5d 20 3d 20 70 43 65 6c 6c 3b 0a  ell[i] = pCell;.
fda0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
fdb0: 63 70 79 28 26 70 50 61 67 65 2d 3e 75 2e 61 44  cpy(&pPage->u.aD
fdc0: 69 73 6b 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  isk[idx], pCell,
fdd0: 20 73 7a 29 3b 0a 20 20 20 20 70 50 61 67 65 2d   sz);.    pPage-
fde0: 3e 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 28 43 65  >apCell[i] = (Ce
fdf0: 6c 6c 2a 29 26 70 50 61 67 65 2d 3e 75 2e 61 44  ll*)&pPage->u.aD
fe00: 69 73 6b 5b 69 64 78 5d 3b 0a 20 20 7d 0a 20 20  isk[idx];.  }.  
fe10: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
fe20: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 1;.}../*.** Re
fe30: 62 75 69 6c 64 20 74 68 65 20 6c 69 6e 6b 65 64  build the linked
fe40: 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 6f   list of cells o
fe50: 6e 20 61 20 70 61 67 65 20 73 6f 20 74 68 61 74  n a page so that
fe60: 20 74 68 65 20 63 65 6c 6c 73 0a 2a 2a 20 6f 63   the cells.** oc
fe70: 63 75 72 20 69 6e 20 74 68 65 20 6f 72 64 65 72  cur in the order
fe80: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
fe90: 65 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b  e pPage->apCell[
fea0: 5d 20 61 72 72 61 79 2e 20 20 0a 2a 2a 20 49 6e  ] array.  .** In
feb0: 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
fec0: 65 20 6f 6e 63 65 20 74 6f 20 72 65 70 61 69 72  e once to repair
fed0: 20 64 61 6d 61 67 65 20 61 66 74 65 72 20 6f 6e   damage after on
fee0: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 69 6e 76  e or more.** inv
fef0: 6f 63 61 74 69 6f 6e 73 20 6f 66 20 65 69 74 68  ocations of eith
ff00: 65 72 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  er insertCell() 
ff10: 6f 72 20 64 72 6f 70 43 65 6c 6c 28 29 2e 0a 2a  or dropCell()..*
ff20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
ff30: 6c 69 6e 6b 43 65 6c 6c 4c 69 73 74 28 42 74 72  linkCellList(Btr
ff40: 65 65 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ee *pBt, MemPage
ff50: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
ff60: 69 3b 0a 20 20 75 31 36 20 2a 70 49 64 78 3b 0a  i;.  u16 *pIdx;.
ff70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ff80: 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
ff90: 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 49  e(pPage) );.  pI
ffa0: 64 78 20 3d 20 26 70 50 61 67 65 2d 3e 75 2e 68  dx = &pPage->u.h
ffb0: 64 72 2e 66 69 72 73 74 43 65 6c 6c 3b 0a 20 20  dr.firstCell;.  
ffc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
ffd0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
ffe0: 20 20 20 69 6e 74 20 69 64 78 20 3d 20 41 64 64     int idx = Add
fff0: 72 28 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b  r(pPage->apCell[
10000 69 5d 29 20 2d 20 41 64 64 72 28 70 50 61 67 65  i]) - Addr(pPage
10010 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
10020 64 78 3e 30 20 26 26 20 69 64 78 3c 53 51 4c 49  dx>0 && idx<SQLI
10030 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  TE_PAGE_SIZE );.
10040 20 20 20 20 2a 70 49 64 78 20 3d 20 53 57 41 42      *pIdx = SWAB
10050 31 36 28 70 42 74 2c 20 69 64 78 29 3b 0a 20 20  16(pBt, idx);.  
10060 20 20 70 49 64 78 20 3d 20 26 70 50 61 67 65 2d    pIdx = &pPage-
10070 3e 61 70 43 65 6c 6c 5b 69 5d 2d 3e 68 2e 69 4e  >apCell[i]->h.iN
10080 65 78 74 3b 0a 20 20 7d 0a 20 20 2a 70 49 64 78  ext;.  }.  *pIdx
10090 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 0;.}../*.** M
100a0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
100b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46  e contents of pF
100c0 72 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e 20 20 54  rom into pTo.  T
100d0 68 65 20 70 46 72 6f 6d 2d 3e 61 70 43 65 6c 6c  he pFrom->apCell
100e0 5b 5d 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  [].** pointers t
100f0 68 61 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20 70  hat point into p
10100 46 72 6f 6d 2d 3e 75 2e 61 44 69 73 6b 5b 5d 20  From->u.aDisk[] 
10110 6d 75 73 74 20 62 65 20 61 64 6a 75 73 74 65 64  must be adjusted
10120 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 69 6e 74   to point.** int
10130 6f 20 70 54 6f 2d 3e 75 2e 61 44 69 73 6b 5b 5d  o pTo->u.aDisk[]
10140 20 69 6e 73 74 65 61 64 2e 20 20 42 75 74 20 73   instead.  But s
10150 6f 6d 65 20 70 46 72 6f 6d 2d 3e 61 70 43 65 6c  ome pFrom->apCel
10160 6c 5b 5d 20 65 6e 74 72 69 65 73 20 6d 69 67 68  l[] entries migh
10170 74 0a 2a 2a 20 6e 6f 74 20 70 6f 69 6e 74 20 74  t.** not point t
10180 6f 20 70 46 72 6f 6d 2d 3e 75 2e 61 44 69 73 6b  o pFrom->u.aDisk
10190 5b 5d 2e 20 20 54 68 6f 73 65 20 61 72 65 20 75  [].  Those are u
101a0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
101b0 74 69 63 20 76 6f 69 64 20 63 6f 70 79 50 61 67  tic void copyPag
101c0 65 28 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  e(MemPage *pTo, 
101d0 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 29 7b  MemPage *pFrom){
101e0 0a 20 20 75 70 74 72 20 66 72 6f 6d 2c 20 74 6f  .  uptr from, to
101f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d  ;.  int i;.  mem
10200 63 70 79 28 70 54 6f 2d 3e 75 2e 61 44 69 73 6b  cpy(pTo->u.aDisk
10210 2c 20 70 46 72 6f 6d 2d 3e 75 2e 61 44 69 73 6b  , pFrom->u.aDisk
10220 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
10230 5a 45 29 3b 0a 20 20 70 54 6f 2d 3e 70 50 61 72  ZE);.  pTo->pPar
10240 65 6e 74 20 3d 20 30 3b 0a 20 20 70 54 6f 2d 3e  ent = 0;.  pTo->
10250 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 70 54  isInit = 1;.  pT
10260 6f 2d 3e 6e 43 65 6c 6c 20 3d 20 70 46 72 6f 6d  o->nCell = pFrom
10270 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 70 54 6f 2d 3e  ->nCell;.  pTo->
10280 6e 46 72 65 65 20 3d 20 70 46 72 6f 6d 2d 3e 6e  nFree = pFrom->n
10290 46 72 65 65 3b 0a 20 20 70 54 6f 2d 3e 69 73 4f  Free;.  pTo->isO
102a0 76 65 72 66 75 6c 6c 20 3d 20 70 46 72 6f 6d 2d  verfull = pFrom-
102b0 3e 69 73 4f 76 65 72 66 75 6c 6c 3b 0a 20 20 74  >isOverfull;.  t
102c0 6f 20 3d 20 41 64 64 72 28 70 54 6f 29 3b 0a 20  o = Addr(pTo);. 
102d0 20 66 72 6f 6d 20 3d 20 41 64 64 72 28 70 46 72   from = Addr(pFr
102e0 6f 6d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  om);.  for(i=0; 
102f0 69 3c 70 54 6f 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  i<pTo->nCell; i+
10300 2b 29 7b 0a 20 20 20 20 75 70 74 72 20 78 20 3d  +){.    uptr x =
10310 20 41 64 64 72 28 70 46 72 6f 6d 2d 3e 61 70 43   Addr(pFrom->apC
10320 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  ell[i]);.    if(
10330 20 78 3e 66 72 6f 6d 20 26 26 20 78 3c 66 72 6f   x>from && x<fro
10340 6d 2b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  m+SQLITE_PAGE_SI
10350 5a 45 20 29 7b 0a 20 20 20 20 20 20 2a 28 28 75  ZE ){.      *((u
10360 70 74 72 2a 29 26 70 54 6f 2d 3e 61 70 43 65 6c  ptr*)&pTo->apCel
10370 6c 5b 69 5d 29 20 3d 20 78 20 2b 20 74 6f 20 2d  l[i]) = x + to -
10380 20 66 72 6f 6d 3b 0a 20 20 20 20 7d 65 6c 73 65   from;.    }else
10390 7b 0a 20 20 20 20 20 20 70 54 6f 2d 3e 61 70 43  {.      pTo->apC
103a0 65 6c 6c 5b 69 5d 20 3d 20 70 46 72 6f 6d 2d 3e  ell[i] = pFrom->
103b0 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d  apCell[i];.    }
103c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
103d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
103e0 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
103f0 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
10400 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
10410 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
10420 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
10430 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
10440 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
10450 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
10460 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
10470 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
10480 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
10490 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
104a0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
104b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
104c0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
104d0 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
104e0 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
104f0 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
10500 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
10510 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
10520 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
10530 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
10540 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
10550 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
10560 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
10570 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
10580 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
10590 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
105a0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
105b0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
105c0 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
105d0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
105e0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
105f0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
10600 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
10610 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
10620 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
10630 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
10640 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10650 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
10660 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
10670 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
10680 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
10690 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
106a0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
106b0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a  balance */../*.*
106c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
106d0 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c  edistributes Cel
106e0 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20  ls on pPage and 
106f0 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
10700 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
10710 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
10720 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
10730 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
10740 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
10750 75 61 6c 6c 79 20 6f 6e 65 20 73 69 62 6c 69 6e  ually one siblin
10760 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  g on either side
10770 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
10780 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
10790 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 62 6f  ng,.** though bo
107a0 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
107b0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
107c0 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
107d0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
107e0 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
107f0 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
10800 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
10810 68 61 6e 20 74 77 6f 20 73 69 62 6c 69 6e 67 73  han two siblings
10820 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  .** (something w
10830 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
10840 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73  ppen if pPage is
10850 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
10860 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66  r a .** child of
10870 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20   root) then all 
10880 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
10890 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69  gs participate i
108a0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
108b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
108c0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
108d0 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20   pPage might be 
108e0 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
108f0 72 65 61 73 65 64 20 62 79 0a 2a 2a 20 6f 6e 65  reased by.** one
10900 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
10910 20 6b 65 65 70 20 70 61 67 65 73 20 62 65 74 77   keep pages betw
10920 65 65 6e 20 36 36 25 20 61 6e 64 20 31 30 30 25  een 66% and 100%
10930 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
10940 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
10950 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
10960 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
10970 6e 20 36 36 25 20 66 75 6c 6c 2e 20 49 66 20 70  n 66% full. If p
10980 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
10990 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
109a0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
109b0 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
109c0 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
109d0 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
109e0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
109f0 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
10a00 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
10a10 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 65  ** overfull or e
10a20 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  mpty..**.** This
10a30 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 72   routine calls r
10a40 65 6c 69 6e 6b 43 65 6c 6c 4c 69 73 74 28 29 20  elinkCellList() 
10a50 6f 6e 20 69 74 73 20 69 6e 70 75 74 20 70 61 67  on its input pag
10a60 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a  e regardless of.
10a70 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10a80 74 20 69 74 20 64 6f 65 73 20 61 6e 79 20 72 65  t it does any re
10a90 61 6c 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 43  al balancing.  C
10aa0 6c 69 65 6e 74 20 72 6f 75 74 69 6e 65 73 20 77  lient routines w
10ab0 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79 0a 2a 2a  ill typically.**
10ac0 20 69 6e 76 6f 6b 65 20 69 6e 73 65 72 74 43 65   invoke insertCe
10ad0 6c 6c 28 29 20 6f 72 20 64 72 6f 70 43 65 6c 6c  ll() or dropCell
10ae0 28 29 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  () before callin
10af0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  g this routine, 
10b00 73 6f 20 77 65 0a 2a 2a 20 6e 65 65 64 20 74 6f  so we.** need to
10b10 20 63 61 6c 6c 20 72 65 6c 69 6e 6b 43 65 6c 6c   call relinkCell
10b20 4c 69 73 74 28 29 20 74 6f 20 63 6c 65 61 6e 20  List() to clean 
10b30 75 70 20 74 68 65 20 6d 65 73 73 20 74 68 61 74  up the mess that
10b40 20 74 68 6f 73 65 20 6f 74 68 65 72 0a 2a 2a 20   those other.** 
10b50 72 6f 75 74 69 6e 65 73 20 6c 65 66 74 20 62 65  routines left be
10b60 68 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  hind..**.** pCur
10b70 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
10b80 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 63 65  g to the same ce
10b90 6c 6c 20 61 73 20 77 68 65 6e 20 74 68 69 73 20  ll as when this 
10ba0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
10bb0 65 64 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  ed.** even if th
10bc0 61 74 20 63 65 6c 6c 20 67 65 74 73 20 6d 6f 76  at cell gets mov
10bd0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
10be0 74 20 70 61 67 65 2e 20 20 70 43 75 72 20 6d 61  t page.  pCur ma
10bf0 79 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 20 53 65  y be NULL..** Se
10c00 74 20 74 68 65 20 70 43 75 72 20 70 61 72 61 6d  t the pCur param
10c10 65 74 65 72 20 74 6f 20 4e 55 4c 4c 20 69 66 20  eter to NULL if 
10c20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 61 72 65 20  you do not care 
10c30 61 62 6f 75 74 20 6b 65 65 70 69 6e 67 20 74 72  about keeping tr
10c40 61 63 6b 0a 2a 2a 20 6f 66 20 61 20 63 65 6c 6c  ack.** of a cell
10c50 20 61 73 20 74 68 61 74 20 77 69 6c 6c 20 73 61   as that will sa
10c60 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
10c70 74 68 65 20 77 6f 72 6b 20 6f 66 20 6b 65 65 70  the work of keep
10c80 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 69 74 2e  ing track of it.
10c90 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
10ca0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
10cb0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
10cc0 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
10cd0 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
10ce0 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
10cf0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
10d00 65 2d 3e 75 2e 61 44 69 73 6b 5b 5d 2e 20 20 54  e->u.aDisk[].  T
10d10 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
10d20 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
10d30 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74   overfull.  Part
10d40 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74   of the job of t
10d50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
10d60 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61  o.** make sure a
10d70 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61  ll Cells for pPa
10d80 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69  ge once again fi
10d90 74 20 69 6e 20 70 50 61 67 65 2d 3e 75 2e 61 44  t in pPage->u.aD
10da0 69 73 6b 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  isk[]..**.** In 
10db0 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
10dc0 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c  lancing the sibl
10dd0 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74  ings of pPage, t
10de0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
10df0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f  ge.** might beco
10e00 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
10e10 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68  nderfull.  If th
10e20 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e  at happens, then
10e30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10e40 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
10e50 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61  sively on the pa
10e60 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rent..**.** If t
10e70 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
10e80 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
10e90 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
10ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
10eb0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
10ec0 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68  state.  So if th
10ed0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
10ee0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
10ef0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
10f00 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
10f10 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
10f20 74 72 65 65 20 2a 70 42 74 2c 20 4d 65 6d 50 61  tree *pBt, MemPa
10f30 67 65 20 2a 70 50 61 67 65 2c 20 42 74 43 75 72  ge *pPage, BtCur
10f40 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
10f50 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
10f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10f70 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
10f80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
10f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10fa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10fb0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
10fc0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
10fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10fe0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10ff0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
11000 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  [] */.  int nNew
11010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11020 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11030 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
11040 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76  [] */.  int nDiv
11050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11060 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11070 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76  f cells in apDiv
11080 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
11090 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
110a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
110b0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
110c0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
110d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
110e0 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61   of pPage in pPa
110f0 72 65 6e 74 2d 3e 61 70 43 65 6c 6c 5b 5d 20 2a  rent->apCell[] *
11100 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
11130 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
11140 2d 3e 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  ->apCell[] */.  
11150 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11170 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
11180 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 2f 2a 20 61 70 43 65 6c 6c 5b 69 43 75 72    /* apCell[iCur
111b0 5d 20 69 73 20 74 68 65 20 63 65 6c 6c 20 6f 66  ] is the cell of
111c0 20 74 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20   the cursor */. 
111d0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 43 75   MemPage *pOldCu
111e0 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a  rPage;        /*
111f0 20 54 68 65 20 63 75 72 73 6f 72 20 6f 72 69 67   The cursor orig
11200 69 6e 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  inally points to
11210 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
11220 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11240 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
11250 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
11260 65 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  e page */.  MemP
11270 61 67 65 20 2a 65 78 74 72 61 55 6e 72 65 66 20  age *extraUnref 
11280 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 20 70 61  = 0;     /* A pa
11290 67 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ge that needs to
112a0 20 62 65 20 75 6e 72 65 66 2d 65 64 20 2a 2f 0a   be unref-ed */.
112b0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
112c0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
112d0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
112e0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
112f0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
11300 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
11310 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
11320 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
11330 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
11340 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
11350 2b 31 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +1];        /* p
11360 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
11370 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
11380 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
11390 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
113a0 31 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1];          /* 
113b0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
113c0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
113d0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  New[] */.  int i
113e0 64 78 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  dxDiv[NB];      
113f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63          /* Indic
11400 65 73 20 6f 66 20 64 69 76 69 64 65 72 20 63 65  es of divider ce
11410 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
11420 2f 0a 20 20 43 65 6c 6c 20 2a 61 70 44 69 76 5b  /.  Cell *apDiv[
11430 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
11440 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
11450 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
11460 20 20 43 65 6c 6c 20 61 54 65 6d 70 5b 4e 42 5d    Cell aTemp[NB]
11470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11480 2a 20 54 65 6d 70 6f 72 61 72 79 20 68 6f 6c 64  * Temporary hold
11490 69 6e 67 20 61 72 65 61 20 66 6f 72 20 61 70 44  ing area for apD
114a0 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  iv[] */.  int cn
114b0 74 4e 65 77 5b 4e 42 2b 31 5d 3b 20 20 20 20 20  tNew[NB+1];     
114c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
114d0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 63  in apCell[] of c
114e0 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
114f0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
11500 65 77 5b 4e 42 2b 31 5d 3b 20 20 20 20 20 20 20  ew[NB+1];       
11510 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
11520 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
11530 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
11540 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
11550 61 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  aOld[NB];       
11560 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
11570 79 20 63 6f 70 69 65 73 20 6f 66 20 70 50 61 67  y copies of pPag
11580 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
11590 67 73 20 2a 2f 0a 20 20 43 65 6c 6c 20 2a 61 70  gs */.  Cell *ap
115a0 43 65 6c 6c 5b 28 4d 58 5f 43 45 4c 4c 2b 32 29  Cell[(MX_CELL+2)
115b0 2a 4e 42 5d 3b 20 2f 2a 20 41 6c 6c 20 63 65 6c  *NB]; /* All cel
115c0 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
115d0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
115e0 20 20 69 6e 74 20 73 7a 43 65 6c 6c 5b 28 4d 58    int szCell[(MX
115f0 5f 43 45 4c 4c 2b 32 29 2a 4e 42 5d 3b 20 20 2f  _CELL+2)*NB];  /
11600 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
11610 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
11620 2f 2a 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  /* .  ** Return 
11630 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
11640 79 20 77 6f 72 6b 20 69 66 20 70 50 61 67 65 20  y work if pPage 
11650 69 73 20 6e 65 69 74 68 65 72 20 6f 76 65 72 66  is neither overf
11660 75 6c 6c 20 6e 6f 72 0a 20 20 2a 2a 20 75 6e 64  ull nor.  ** und
11670 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 61  erfull..  */.  a
11680 73 73 65 72 74 28 20 73 71 6c 69 74 65 70 61 67  ssert( sqlitepag
11690 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
116a0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 21  Page) );.  if( !
116b0 70 50 61 67 65 2d 3e 69 73 4f 76 65 72 66 75 6c  pPage->isOverful
116c0 6c 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  l && pPage->nFre
116d0 65 3c 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e<SQLITE_PAGE_SI
116e0 5a 45 2f 32 20 0a 20 20 20 20 20 20 20 20 26 26  ZE/2 .        &&
116f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 3d 32   pPage->nCell>=2
11700 29 7b 0a 20 20 20 20 72 65 6c 69 6e 6b 43 65 6c  ){.    relinkCel
11710 6c 4c 69 73 74 28 70 42 74 2c 20 70 50 61 67 65  lList(pBt, pPage
11720 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
11740 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
11750 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70   parent of the p
11760 61 67 65 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  age to be balanc
11770 65 65 64 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  eed..  ** If the
11780 72 65 20 69 73 20 6e 6f 20 70 61 72 65 6e 74 2c  re is no parent,
11790 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 70   it means this p
117a0 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
117b0 70 61 67 65 20 61 6e 64 0a 20 20 2a 2a 20 73 70  page and.  ** sp
117c0 65 63 69 61 6c 20 72 75 6c 65 73 20 61 70 70 6c  ecial rules appl
117d0 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 72 65 6e  y..  */.  pParen
117e0 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
117f0 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e  nt;.  if( pParen
11800 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 67 6e 6f  t==0 ){.    Pgno
11810 20 70 67 6e 6f 43 68 69 6c 64 3b 0a 20 20 20 20   pgnoChild;.    
11820 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
11830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
11840 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
11850 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
11860 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ll==0 ){.      i
11870 66 28 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e  f( pPage->u.hdr.
11880 72 69 67 68 74 43 68 69 6c 64 20 29 7b 0a 20 20  rightChild ){.  
11890 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
118a0 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
118b0 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 6f 70  e is empty.  Cop
118c0 79 20 74 68 65 20 6f 6e 65 20 63 68 69 6c 64 20  y the one child 
118d0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
118e0 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  into the root pa
118f0 67 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 20  ge and return.  
11900 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  This reduces the
11910 20 64 65 70 74 68 0a 20 20 20 20 20 20 20 20 2a   depth.        *
11920 2a 20 6f 66 20 74 68 65 20 42 54 72 65 65 20 62  * of the BTree b
11930 79 20 6f 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a  y one..        *
11940 2f 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 43 68  /.        pgnoCh
11950 69 6c 64 20 3d 20 53 57 41 42 33 32 28 70 42 74  ild = SWAB32(pBt
11960 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72  , pPage->u.hdr.r
11970 69 67 68 74 43 68 69 6c 64 29 3b 0a 20 20 20 20  ightChild);.    
11980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
11990 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50  ager_get(pBt->pP
119a0 61 67 65 72 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  ager, pgnoChild,
119b0 20 28 76 6f 69 64 2a 2a 29 26 70 43 68 69 6c 64   (void**)&pChild
119c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
119d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
119e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50         memcpy(pP
119f0 61 67 65 2c 20 70 43 68 69 6c 64 2c 20 53 51 4c  age, pChild, SQL
11a00 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
11a10 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69          pPage->i
11a20 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
11a30 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65     rc = initPage
11a40 28 70 42 74 2c 20 70 50 61 67 65 2c 20 73 71 6c  (pBt, pPage, sql
11a50 69 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  itepager_pagenum
11a60 62 65 72 28 70 50 61 67 65 29 2c 20 30 29 3b 0a  ber(pPage), 0);.
11a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11a80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
11a90 0a 20 20 20 20 20 20 20 20 72 65 70 61 72 65 6e  .        reparen
11aa0 74 43 68 69 6c 64 50 61 67 65 73 28 70 42 74 2c  tChildPages(pBt,
11ab0 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   pPage);.       
11ac0 20 69 66 28 20 70 43 75 72 20 26 26 20 70 43 75   if( pCur && pCu
11ad0 72 2d 3e 70 50 61 67 65 3d 3d 70 43 68 69 6c 64  r->pPage==pChild
11ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11af0 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28  litepager_unref(
11b00 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  pChild);.       
11b10 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
11b20 20 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   pPage;.        
11b30 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65    sqlitepager_re
11b40 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
11b50 20 20 7d 0a 20 20 20 20 20 20 20 20 66 72 65 65    }.        free
11b60 50 61 67 65 28 70 42 74 2c 20 70 43 68 69 6c 64  Page(pBt, pChild
11b70 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
11b80 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
11b90 72 5f 75 6e 72 65 66 28 70 43 68 69 6c 64 29 3b  r_unref(pChild);
11ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11bb0 20 20 20 20 20 20 72 65 6c 69 6e 6b 43 65 6c 6c        relinkCell
11bc0 4c 69 73 74 28 70 42 74 2c 20 70 50 61 67 65 29  List(pBt, pPage)
11bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11c00 21 70 50 61 67 65 2d 3e 69 73 4f 76 65 72 66 75  !pPage->isOverfu
11c10 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ll ){.      /* I
11c20 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
11c30 72 6f 6f 74 20 70 61 67 65 20 74 6f 20 62 65 20  root page to be 
11c40 6c 65 73 73 20 74 68 61 6e 20 68 61 6c 66 20 66  less than half f
11c50 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ull..      */.  
11c60 20 20 20 20 72 65 6c 69 6e 6b 43 65 6c 6c 4c 69      relinkCellLi
11c70 73 74 28 70 42 74 2c 20 70 50 61 67 65 29 3b 0a  st(pBt, pPage);.
11c80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11c90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
11ca0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
11cb0 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69  e get to here, i
11cc0 74 20 6d 65 61 6e 73 20 74 68 65 20 72 6f 6f 74  t means the root
11cd0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
11ce0 6c 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  l..    ** When t
11cf0 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
11d00 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
11d10 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
11d20 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  e.    ** content
11d30 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
11d40 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
11d50 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
11d60 74 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 61 6e  t.    ** page an
11d70 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68   empty page with
11d80 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e   rightChild poin
11d90 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a  ting to the new.
11da0 20 20 20 20 2a 2a 20 63 68 69 6c 64 2e 20 20 54      ** child.  T
11db0 68 65 6e 20 66 61 6c 6c 20 74 68 72 75 20 74 6f  hen fall thru to
11dc0 20 74 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   the code below 
11dd0 77 68 69 63 68 20 77 69 6c 6c 20 63 61 75 73 65  which will cause
11de0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  .    ** the over
11df0 66 75 6c 6c 20 63 68 69 6c 64 20 70 61 67 65 20  full child page 
11e00 74 6f 20 62 65 20 73 70 6c 69 74 2e 0a 20 20 20  to be split..   
11e10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11e20 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 70  itepager_write(p
11e30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11e40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11e50 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
11e60 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c  Page(pBt, &pChil
11e70 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 73  d, &pgnoChild, s
11e80 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 6e  qlitepager_pagen
11e90 75 6d 62 65 72 28 70 50 61 67 65 29 29 3b 0a 20  umber(pPage));. 
11ea0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
11eb0 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  rn rc;.    asser
11ec0 74 28 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69  t( sqlitepager_i
11ed0 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
11ee0 64 29 20 29 3b 0a 20 20 20 20 63 6f 70 79 50 61  d) );.    copyPa
11ef0 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
11f00 29 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 70  );.    pChild->p
11f10 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 3b 0a  Parent = pPage;.
11f20 20 20 20 20 70 43 68 69 6c 64 2d 3e 69 64 78 50      pChild->idxP
11f30 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  arent = 0;.    s
11f40 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66 28 70  qlitepager_ref(p
11f50 50 61 67 65 29 3b 0a 20 20 20 20 70 43 68 69 6c  Page);.    pChil
11f60 64 2d 3e 69 73 4f 76 65 72 66 75 6c 6c 20 3d 20  d->isOverfull = 
11f70 31 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 20  1;.    if( pCur 
11f80 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 3d 3d  && pCur->pPage==
11f90 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 73  pPage ){.      s
11fa0 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
11fb0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  (pPage);.      p
11fc0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 68  Cur->pPage = pCh
11fd0 69 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ild;.    }else{.
11fe0 20 20 20 20 20 20 65 78 74 72 61 55 6e 72 65 66        extraUnref
11ff0 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 20 20 7d   = pChild;.    }
12000 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 42  .    zeroPage(pB
12010 74 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 70  t, pPage);.    p
12020 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67 68  Page->u.hdr.righ
12030 74 43 68 69 6c 64 20 3d 20 53 57 41 42 33 32 28  tChild = SWAB32(
12040 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  pBt, pgnoChild);
12050 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 70  .    pParent = p
12060 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 20  Page;.    pPage 
12070 3d 20 70 43 68 69 6c 64 3b 0a 20 20 7d 0a 20 20  = pChild;.  }.  
12080 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
12090 5f 77 72 69 74 65 28 70 50 61 72 65 6e 74 29 3b  _write(pParent);
120a0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
120b0 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
120c0 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
120d0 20 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   );.  .  /*.  **
120e0 20 46 69 6e 64 20 74 68 65 20 43 65 6c 6c 20 69   Find the Cell i
120f0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
12100 65 20 77 68 6f 73 65 20 68 2e 6c 65 66 74 43 68  e whose h.leftCh
12110 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a  ild points back.
12120 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20    ** to pPage.  
12130 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62  The "idx" variab
12140 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  le is the index 
12150 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49  of that cell.  I
12160 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20  f pPage.  ** is 
12170 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68  the rightmost ch
12180 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ild of pParent t
12190 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70  hen set idx to p
121a0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20  Parent->nCell . 
121b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
121c0 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20  t->idxShift ){. 
121d0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 73 77     Pgno pgno, sw
121e0 61 62 50 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f  abPgno;.    pgno
121f0 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70   = sqlitepager_p
12200 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 29  agenumber(pPage)
12210 3b 0a 20 20 20 20 73 77 61 62 50 67 6e 6f 20 3d  ;.    swabPgno =
12220 20 53 57 41 42 33 32 28 70 42 74 2c 20 70 67 6e   SWAB32(pBt, pgn
12230 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d  o);.    for(idx=
12240 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  0; idx<pParent->
12250 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20  nCell; idx++){. 
12260 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
12270 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 2d 3e 68  ->apCell[idx]->h
12280 2e 6c 65 66 74 43 68 69 6c 64 3d 3d 73 77 61 62  .leftChild==swab
12290 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
122a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
122b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
122c0 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
122d0 65 6c 6c 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ell || pParent->
122e0 75 2e 68 64 72 2e 72 69 67 68 74 43 68 69 6c 64  u.hdr.rightChild
122f0 3d 3d 73 77 61 62 50 67 6e 6f 20 29 3b 0a 20 20  ==swabPgno );.  
12300 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d  }else{.    idx =
12310 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
12320 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  t;.  }..  /*.  *
12330 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72  * Initialize var
12340 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69  iables so that i
12350 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74  t will be safe t
12360 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65  o jump.  ** dire
12370 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f  ctly to balance_
12380 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d  cleanup at any m
12390 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  oment..  */.  nO
123a0 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20  ld = nNew = 0;. 
123b0 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66   sqlitepager_ref
123c0 28 70 50 61 72 65 6e 74 29 3b 0a 0a 20 20 2f 2a  (pParent);..  /*
123d0 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69  .  ** Find sibli
123e0 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67  ng pages to pPag
123f0 65 20 61 6e 64 20 74 68 65 20 43 65 6c 6c 73 20  e and the Cells 
12400 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20  in pParent that 
12410 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20  divide.  ** the 
12420 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74  siblings.  An at
12430 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
12440 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
12450 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a  s on either.  **
12460 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
12470 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
12480 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
12490 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
124a0 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74   if.  ** pPage t
124b0 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
124c0 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
124d0 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
124e0 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20  e.  If pParent. 
124f0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
12500 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
12510 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
12520 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
12530 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69  ken..  */.  nxDi
12540 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20  v = idx - NN;.  
12550 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e  if( nxDiv + NB >
12560 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
12570 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70  ){.    nxDiv = p
12580 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20  Parent->nCell - 
12590 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66  NB + 1;.  }.  if
125a0 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20  ( nxDiv<0 ){.   
125b0 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a   nxDiv = 0;.  }.
125c0 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f    nDiv = 0;.  fo
125d0 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20  r(i=0, k=nxDiv; 
125e0 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b  i<NB; i++, k++){
125f0 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65  .    if( k<pPare
12600 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
12610 20 20 20 69 64 78 44 69 76 5b 69 5d 20 3d 20 6b     idxDiv[i] = k
12620 3b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  ;.      apDiv[i]
12630 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 43 65   = pParent->apCe
12640 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 6e 44 69  ll[k];.      nDi
12650 76 2b 2b 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  v++;.      pgnoO
12660 6c 64 5b 69 5d 20 3d 20 53 57 41 42 33 32 28 70  ld[i] = SWAB32(p
12670 42 74 2c 20 61 70 44 69 76 5b 69 5d 2d 3e 68 2e  Bt, apDiv[i]->h.
12680 6c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 20 20  leftChild);.    
12690 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61  }else if( k==pPa
126a0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
126b0 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
126c0 3d 20 53 57 41 42 33 32 28 70 42 74 2c 20 70 50  = SWAB32(pBt, pP
126d0 61 72 65 6e 74 2d 3e 75 2e 68 64 72 2e 72 69 67  arent->u.hdr.rig
126e0 68 74 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 65  htChild);.    }e
126f0 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
12700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
12710 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74   sqlitepager_get
12720 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
12730 6e 6f 4f 6c 64 5b 69 5d 2c 20 28 76 6f 69 64 2a  noOld[i], (void*
12740 2a 29 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  *)&apOld[i]);.  
12750 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
12760 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
12770 0a 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61  .    rc = initPa
12780 67 65 28 70 42 74 2c 20 61 70 4f 6c 64 5b 69 5d  ge(pBt, apOld[i]
12790 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 70 50  , pgnoOld[i], pP
127a0 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  arent);.    if( 
127b0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
127c0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61  e_cleanup;.    a
127d0 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65  pOld[i]->idxPare
127e0 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 6e 4f 6c 64  nt = k;.    nOld
127f0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
12800 2a 2a 20 53 65 74 20 69 43 75 72 20 74 6f 20 62  ** Set iCur to b
12810 65 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61  e the index in a
12820 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
12830 65 6c 6c 20 74 68 61 74 20 74 68 65 20 63 75 72  ell that the cur
12840 73 6f 72 0a 20 20 2a 2a 20 69 73 20 70 6f 69 6e  sor.  ** is poin
12850 74 69 6e 67 20 74 6f 2e 20 20 57 65 20 77 69 6c  ting to.  We wil
12860 6c 20 6e 65 65 64 20 74 68 69 73 20 6c 61 74 65  l need this late
12870 72 20 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  r on in order to
12880 20 6b 65 65 70 20 74 68 65 0a 20 20 2a 2a 20 63   keep the.  ** c
12890 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61  ursor pointing a
128a0 74 20 74 68 65 20 73 61 6d 65 20 63 65 6c 6c 2e  t the same cell.
128b0 20 20 49 66 20 70 43 75 72 20 70 6f 69 6e 74 73    If pCur points
128c0 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 0a   to a page that.
128d0 20 20 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 76 6f    ** has no invo
128e0 6c 76 65 6d 65 6e 74 20 77 69 74 68 20 74 68 69  lvement with thi
128f0 73 20 72 65 62 61 6c 61 6e 63 69 6e 67 2c 20 74  s rebalancing, t
12900 68 65 6e 20 73 65 74 20 69 43 75 72 20 74 6f 20  hen set iCur to 
12910 61 20 6c 61 72 67 65 0a 20 20 2a 2a 20 6e 75 6d  a large.  ** num
12920 62 65 72 20 73 6f 20 74 68 61 74 20 74 68 65 20  ber so that the 
12930 69 43 75 72 3d 3d 6a 20 74 65 73 74 73 20 61 6c  iCur==j tests al
12940 77 61 79 73 20 66 61 69 6c 20 69 6e 20 74 68 65  ways fail in the
12950 20 6d 61 69 6e 20 63 65 6c 6c 0a 20 20 2a 2a 20   main cell.  ** 
12960 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6c 6f 6f  distribution loo
12970 70 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  p below..  */.  
12980 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
12990 69 43 75 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f  iCur = 0;.    fo
129a0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
129b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
129c0 43 75 72 2d 3e 70 50 61 67 65 3d 3d 61 70 4f 6c  Cur->pPage==apOl
129d0 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  d[i] ){.        
129e0 69 43 75 72 20 2b 3d 20 70 43 75 72 2d 3e 69 64  iCur += pCur->id
129f0 78 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  x;.        break
12a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12a10 69 43 75 72 20 2b 3d 20 61 70 4f 6c 64 5b 69 5d  iCur += apOld[i]
12a20 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 69  ->nCell;.      i
12a30 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 70  f( i<nOld-1 && p
12a40 43 75 72 2d 3e 70 50 61 67 65 3d 3d 70 50 61 72  Cur->pPage==pPar
12a50 65 6e 74 20 26 26 20 70 43 75 72 2d 3e 69 64 78  ent && pCur->idx
12a60 3d 3d 69 64 78 44 69 76 5b 69 5d 20 29 7b 0a 20  ==idxDiv[i] ){. 
12a70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12a80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 75 72      }.      iCur
12a90 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  ++;.    }.    pO
12aa0 6c 64 43 75 72 50 61 67 65 20 3d 20 70 43 75 72  ldCurPage = pCur
12ab0 2d 3e 70 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  ->pPage;.  }..  
12ac0 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70  /*.  ** Make cop
12ad0 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ies of the conte
12ae0 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20  nt of pPage and 
12af0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74  its siblings int
12b00 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54  o aOld[]..  ** T
12b10 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
12b20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  function will us
12b30 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
12b40 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20  copies rather.  
12b50 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
12b60 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
12b70 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
12b80 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
12b90 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  he.  ** process 
12ba0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
12bb0 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tten..  */.  for
12bc0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
12bd0 2b 29 7b 0a 20 20 20 20 63 6f 70 79 50 61 67 65  +){.    copyPage
12be0 28 26 61 4f 6c 64 5b 69 5d 2c 20 61 70 4f 6c 64  (&aOld[i], apOld
12bf0 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  [i]);.  }..  /*.
12c00 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
12c10 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
12c20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
12c30 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
12c40 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
12c50 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
12c60 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
12c70 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
12c80 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
12c90 2a 20 69 6e 74 6f 20 61 54 65 6d 70 5b 5d 20 61  * into aTemp[] a
12ca0 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
12cb0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 20  e divider Cells 
12cc0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
12cd0 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a  */.  nCell = 0;.
12ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
12cf0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
12d00 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 26 61 4f  Page *pOld = &aO
12d10 6c 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ld[i];.    for(j
12d20 3d 30 3b 20 6a 3c 70 4f 6c 64 2d 3e 6e 43 65 6c  =0; j<pOld->nCel
12d30 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  l; j++){.      a
12d40 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
12d50 4f 6c 64 2d 3e 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  Old->apCell[j];.
12d60 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
12d70 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 28 70  ll] = cellSize(p
12d80 42 74 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  Bt, apCell[nCell
12d90 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  ]);.      nCell+
12da0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
12db0 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20   i<nOld-1 ){.   
12dc0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
12dd0 20 3d 20 63 65 6c 6c 53 69 7a 65 28 70 42 74 2c   = cellSize(pBt,
12de0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
12df0 20 20 6d 65 6d 63 70 79 28 26 61 54 65 6d 70 5b    memcpy(&aTemp[
12e00 69 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  i], apDiv[i], sz
12e10 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
12e20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
12e30 5d 20 3d 20 26 61 54 65 6d 70 5b 69 5d 3b 0a 20  ] = &aTemp[i];. 
12e40 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 42       dropCell(pB
12e50 74 2c 20 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  t, pParent, nxDi
12e60 76 2c 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  v, szCell[nCell]
12e70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12e80 20 53 57 41 42 33 32 28 70 42 74 2c 20 61 70 43   SWAB32(pBt, apC
12e90 65 6c 6c 5b 6e 43 65 6c 6c 5d 2d 3e 68 2e 6c 65  ell[nCell]->h.le
12ea0 66 74 43 68 69 6c 64 29 3d 3d 70 67 6e 6f 4f 6c  ftChild)==pgnoOl
12eb0 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 61 70  d[i] );.      ap
12ec0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2d 3e 68 2e 6c  Cell[nCell]->h.l
12ed0 65 66 74 43 68 69 6c 64 20 3d 20 70 4f 6c 64 2d  eftChild = pOld-
12ee0 3e 75 2e 68 64 72 2e 72 69 67 68 74 43 68 69 6c  >u.hdr.rightChil
12ef0 64 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  d;.      nCell++
12f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12f10 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
12f20 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
12f30 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
12f40 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
12f50 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
12f60 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
12f70 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
12f80 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
12f90 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
12fa0 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
12fb0 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
12fc0 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
12fd0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
12fe0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
12ff0 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
13000 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
13010 70 61 74 68 20 69 20 66 72 6f 6d 20 70 61 74 68  path i from path
13020 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
13030 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
13040 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
13050 20 20 2a 2a 20 54 68 69 73 20 6c 69 74 74 6c 65    ** This little
13060 20 70 61 74 63 68 20 6f 66 20 63 6f 64 65 20 69   patch of code i
13070 73 20 63 72 69 74 69 63 61 6c 20 66 6f 72 20 6b  s critical for k
13080 65 65 70 69 6e 67 20 74 68 65 20 74 72 65 65 0a  eeping the tree.
13090 20 20 2a 2a 20 62 61 6c 61 6e 63 65 64 2e 20 0a    ** balanced. .
130a0 20 20 2a 2f 0a 20 20 66 6f 72 28 73 75 62 74 6f    */.  for(subto
130b0 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
130c0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  ll; i++){.    su
130d0 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
130e0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 75 62  [i];.    if( sub
130f0 74 6f 74 61 6c 20 3e 20 55 53 41 42 4c 45 5f 53  total > USABLE_S
13100 50 41 43 45 20 29 7b 0a 20 20 20 20 20 20 73 7a  PACE ){.      sz
13110 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
13120 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
13130 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
13140 20 69 3b 0a 20 20 20 20 20 20 73 75 62 74 6f 74   i;.      subtot
13150 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
13160 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  +;.    }.  }.  s
13170 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
13180 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
13190 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
131a0 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
131b0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 77 68 69 6c  ; i--){.    whil
131c0 65 28 20 73 7a 4e 65 77 5b 69 5d 3c 55 53 41 42  e( szNew[i]<USAB
131d0 4c 45 5f 53 50 41 43 45 2f 32 20 29 7b 0a 20 20  LE_SPACE/2 ){.  
131e0 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
131f0 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
13200 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 3e 30 20 29   cntNew[i-1]>0 )
13210 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
13220 20 2b 3d 20 73 7a 43 65 6c 6c 5b 63 6e 74 4e 65   += szCell[cntNe
13230 77 5b 69 2d 31 5d 5d 3b 0a 20 20 20 20 20 20 73  w[i-1]];.      s
13240 7a 4e 65 77 5b 69 2d 31 5d 20 2d 3d 20 73 7a 43  zNew[i-1] -= szC
13250 65 6c 6c 5b 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d  ell[cntNew[i-1]-
13260 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1];.    }.  }.  
13270 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
13280 5d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  ]>0 );..  /*.  *
13290 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
132a0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
132b0 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
132c0 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
132d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
132e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  +){.    if( i<nO
132f0 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 70 4e 65  ld ){.      apNe
13300 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b  w[i] = apOld[i];
13310 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
13320 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a  ] = pgnoOld[i];.
13330 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
13340 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
13350 70 61 67 65 72 5f 77 72 69 74 65 28 61 70 4e 65  pager_write(apNe
13360 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  w[i]);.    }else
13370 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  {.      rc = all
13380 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26  ocatePage(pBt, &
13390 61 70 4e 65 77 5b 69 5d 2c 20 26 70 67 6e 6f 4e  apNew[i], &pgnoN
133a0 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69  ew[i], pgnoNew[i
133b0 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1]);.      if( 
133c0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
133d0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
133e0 0a 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20  .    nNew++;.   
133f0 20 7a 65 72 6f 50 61 67 65 28 70 42 74 2c 20 61   zeroPage(pBt, a
13400 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pNew[i]);.    ap
13410 4e 65 77 5b 69 5d 2d 3e 69 73 49 6e 69 74 20 3d  New[i]->isInit =
13420 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72   1;.  }..  /* Fr
13430 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
13440 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
13450 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
13460 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
13470 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
13480 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 42  rc = freePage(pB
13490 74 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 70 67 6e  t, apOld[i], pgn
134a0 6f 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  oOld[i]);.    if
134b0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
134c0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
134d0 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
134e0 65 66 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ef(apOld[i]);.  
134f0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
13500 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
13510 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
13520 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
13530 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
13540 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
13550 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
13560 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
13570 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
13580 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
13590 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
135a0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
135b0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
135c0 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
135d0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
135e0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
135f0 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
13600 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
13610 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
13620 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
13630 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
13640 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
13650 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
13660 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
13670 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
13680 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
13690 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
136a0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
136b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
136c0 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
136d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
136e0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
136f0 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
13700 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
13710 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
13720 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
13730 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
13740 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
13750 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
13760 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
13770 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
13780 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
13790 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
137a0 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
137b0 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
137c0 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
137d0 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
137e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
137f0 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
13800 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
13810 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
13820 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
13830 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
13840 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
13850 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
13860 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
13870 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
13880 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
13890 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
138a0 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
138b0 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
138c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
138d0 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
138e0 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
138f0 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
13900 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
13910 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
13920 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
13930 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
13940 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
13950 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
13960 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
13970 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
13980 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 77 68  apNew[i];.    wh
13990 69 6c 65 28 20 6a 3c 63 6e 74 4e 65 77 5b 69 5d  ile( j<cntNew[i]
139a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
139b0 28 20 70 4e 65 77 2d 3e 6e 46 72 65 65 3e 3d 73  ( pNew->nFree>=s
139c0 7a 43 65 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20  zCell[j] );.    
139d0 20 20 69 66 28 20 70 43 75 72 20 26 26 20 69 43    if( pCur && iC
139e0 75 72 3d 3d 6a 20 29 7b 20 70 43 75 72 2d 3e 70  ur==j ){ pCur->p
139f0 50 61 67 65 20 3d 20 70 4e 65 77 3b 20 70 43 75  Page = pNew; pCu
13a00 72 2d 3e 69 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  r->idx = pNew->n
13a10 43 65 6c 6c 3b 20 7d 0a 20 20 20 20 20 20 69 6e  Cell; }.      in
13a20 73 65 72 74 43 65 6c 6c 28 70 42 74 2c 20 70 4e  sertCell(pBt, pN
13a30 65 77 2c 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 2c  ew, pNew->nCell,
13a40 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 73 7a 43 65   apCell[j], szCe
13a50 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 6a 2b  ll[j]);.      j+
13a60 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
13a70 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c  ert( pNew->nCell
13a80 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
13a90 28 20 21 70 4e 65 77 2d 3e 69 73 4f 76 65 72 66  ( !pNew->isOverf
13aa0 75 6c 6c 20 29 3b 0a 20 20 20 20 72 65 6c 69 6e  ull );.    relin
13ab0 6b 43 65 6c 6c 4c 69 73 74 28 70 42 74 2c 20 70  kCellList(pBt, p
13ac0 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  New);.    if( i<
13ad0 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c  nNew-1 && j<nCel
13ae0 6c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  l ){.      pNew-
13af0 3e 75 2e 68 64 72 2e 72 69 67 68 74 43 68 69 6c  >u.hdr.rightChil
13b00 64 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 2d 3e 68  d = apCell[j]->h
13b10 2e 6c 65 66 74 43 68 69 6c 64 3b 0a 20 20 20 20  .leftChild;.    
13b20 20 20 61 70 43 65 6c 6c 5b 6a 5d 2d 3e 68 2e 6c    apCell[j]->h.l
13b30 65 66 74 43 68 69 6c 64 20 3d 20 53 57 41 42 33  eftChild = SWAB3
13b40 32 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 5b 69  2(pBt, pgnoNew[i
13b50 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ]);.      if( pC
13b60 75 72 20 26 26 20 69 43 75 72 3d 3d 6a 20 29 7b  ur && iCur==j ){
13b70 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
13b80 50 61 72 65 6e 74 3b 20 70 43 75 72 2d 3e 69 64  Parent; pCur->id
13b90 78 20 3d 20 6e 78 44 69 76 3b 20 7d 0a 20 20 20  x = nxDiv; }.   
13ba0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 42     insertCell(pB
13bb0 74 2c 20 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  t, pParent, nxDi
13bc0 76 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 73 7a  v, apCell[j], sz
13bd0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Cell[j]);.      
13be0 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
13bf0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
13c00 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
13c10 20 29 3b 0a 20 20 61 70 4e 65 77 5b 6e 4e 65 77   );.  apNew[nNew
13c20 2d 31 5d 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74  -1]->u.hdr.right
13c30 43 68 69 6c 64 20 3d 20 61 4f 6c 64 5b 6e 4f 6c  Child = aOld[nOl
13c40 64 2d 31 5d 2e 75 2e 68 64 72 2e 72 69 67 68 74  d-1].u.hdr.right
13c50 43 68 69 6c 64 3b 0a 20 20 69 66 28 20 6e 78 44  Child;.  if( nxD
13c60 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
13c70 6c 6c 20 29 7b 0a 20 20 20 20 70 50 61 72 65 6e  ll ){.    pParen
13c80 74 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74 43 68  t->u.hdr.rightCh
13c90 69 6c 64 20 3d 20 53 57 41 42 33 32 28 70 42 74  ild = SWAB32(pBt
13ca0 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
13cb0 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
13cc0 20 70 50 61 72 65 6e 74 2d 3e 61 70 43 65 6c 6c   pParent->apCell
13cd0 5b 6e 78 44 69 76 5d 2d 3e 68 2e 6c 65 66 74 43  [nxDiv]->h.leftC
13ce0 68 69 6c 64 20 3d 20 53 57 41 42 33 32 28 70 42  hild = SWAB32(pB
13cf0 74 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  t, pgnoNew[nNew-
13d00 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1]);.  }.  if( p
13d10 43 75 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6a  Cur ){.    if( j
13d20 3c 3d 69 43 75 72 20 26 26 20 70 43 75 72 2d 3e  <=iCur && pCur->
13d30 70 50 61 67 65 3d 3d 70 50 61 72 65 6e 74 20 26  pPage==pParent &
13d40 26 20 70 43 75 72 2d 3e 69 64 78 3e 69 64 78 44  & pCur->idx>idxD
13d50 69 76 5b 6e 4f 6c 64 2d 31 5d 20 29 7b 0a 20 20  iv[nOld-1] ){.  
13d60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
13d70 2d 3e 70 50 61 67 65 3d 3d 70 4f 6c 64 43 75 72  ->pPage==pOldCur
13d80 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 43  Page );.      pC
13d90 75 72 2d 3e 69 64 78 20 2b 3d 20 6e 4e 65 77 20  ur->idx += nNew 
13da0 2d 20 6e 4f 6c 64 3b 0a 20 20 20 20 7d 65 6c 73  - nOld;.    }els
13db0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
13dc0 20 70 4f 6c 64 43 75 72 50 61 67 65 21 3d 30 20   pOldCurPage!=0 
13dd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70  );.      sqlitep
13de0 61 67 65 72 5f 72 65 66 28 70 43 75 72 2d 3e 70  ager_ref(pCur->p
13df0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Page);.      sql
13e00 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70  itepager_unref(p
13e10 4f 6c 64 43 75 72 50 61 67 65 29 3b 0a 20 20 20  OldCurPage);.   
13e20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
13e30 2a 20 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64  * Reparent child
13e40 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ren of all cells
13e50 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
13e60 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
13e70 20 20 20 20 72 65 70 61 72 65 6e 74 43 68 69 6c      reparentChil
13e80 64 50 61 67 65 73 28 70 42 74 2c 20 61 70 4e 65  dPages(pBt, apNe
13e90 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 70  w[i]);.  }.  rep
13ea0 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
13eb0 70 42 74 2c 20 70 50 61 72 65 6e 74 29 3b 0a 0a  pBt, pParent);..
13ec0 20 20 2f 2a 0a 20 20 2a 2a 20 62 61 6c 61 6e 63    /*.  ** balanc
13ed0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
13ee0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62  e..  */.  rc = b
13ef0 61 6c 61 6e 63 65 28 70 42 74 2c 20 70 50 61 72  alance(pBt, pPar
13f00 65 6e 74 2c 20 70 43 75 72 29 3b 0a 0a 20 20 2f  ent, pCur);..  /
13f10 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
13f20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
13f30 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
13f40 65 61 6e 75 70 3a 0a 20 20 69 66 28 20 65 78 74  eanup:.  if( ext
13f50 72 61 55 6e 72 65 66 20 29 7b 0a 20 20 20 20 73  raUnref ){.    s
13f60 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
13f70 28 65 78 74 72 61 55 6e 72 65 66 29 3b 0a 20 20  (extraUnref);.  
13f80 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
13f90 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
13fa0 66 28 20 61 70 4f 6c 64 5b 69 5d 21 3d 30 20 26  f( apOld[i]!=0 &
13fb0 26 20 61 70 4f 6c 64 5b 69 5d 21 3d 26 61 4f 6c  & apOld[i]!=&aOl
13fc0 64 5b 69 5d 20 29 20 73 71 6c 69 74 65 70 61 67  d[i] ) sqlitepag
13fd0 65 72 5f 75 6e 72 65 66 28 61 70 4f 6c 64 5b 69  er_unref(apOld[i
13fe0 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
13ff0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
14000 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72  .    sqlitepager
14010 5f 75 6e 72 65 66 28 61 70 4e 65 77 5b 69 5d 29  _unref(apNew[i])
14020 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
14030 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 3d   && pCur->pPage=
14040 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
14050 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
14060 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
14070 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
14080 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
14090 65 66 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  ef(pParent);.  }
140a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
140b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
140c0 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
140d0 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
140e0 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  t to the same ta
140f0 62 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 70  ble.** as pCur p
14100 6f 69 6e 74 73 20 74 6f 2e 20 20 49 66 20 61 6e  oints to.  If an
14110 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
14120 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
14130 69 74 68 0a 2a 2a 20 77 72 46 6c 61 67 3d 3d 30  ith.** wrFlag==0
14140 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
14150 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
14160 45 5f 4c 4f 43 4b 45 44 2e 20 20 49 66 20 61 6c  E_LOCKED.  If al
14170 6c 0a 2a 2a 20 63 75 72 73 6f 72 73 20 70 6f 69  l.** cursors poi
14180 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  nt to the same t
14190 61 62 6c 65 20 77 65 72 65 20 6f 70 65 6e 65 64  able were opened
141a0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
141b0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
141c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
141d0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ITE_OK..**.** In
141e0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63 68 65   addition to che
141f0 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c  cking for read-l
14200 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20 72 65  ocks (where a re
14210 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e  ad-lock .** mean
14220 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  s a cursor opene
14230 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
14240 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  ) this routine a
14250 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c  lso moves.** all
14260 20 63 75 72 73 6f 72 73 20 6f 74 68 65 72 20 74   cursors other t
14270 68 61 6e 20 70 43 75 72 20 73 6f 20 74 68 61 74  han pCur so that
14280 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
14290 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69  ng to the .** fi
142a0 72 73 74 20 43 65 6c 6c 20 6f 6e 20 72 6f 6f 74  rst Cell on root
142b0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
142c0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
142d0 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20  e an insert .** 
142e0 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20  or delete might 
142f0 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
14300 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20  r of cells on a 
14310 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a  page or delete.*
14320 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c  * a page entirel
14330 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  y and we do not 
14340 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e  want to leave an
14350 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f  y cursors .** po
14360 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78  inting to non-ex
14370 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20  istant pages or 
14380 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
14390 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
143a0 63 6b 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  cks(BtCursor *pC
143b0 75 72 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ur){.  BtCursor 
143c0 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  *p;.  assert( pC
143d0 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
143e0 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 53 68 61  for(p=pCur->pSha
143f0 72 65 64 3b 20 70 21 3d 70 43 75 72 3b 20 70 3d  red; p!=pCur; p=
14400 70 2d 3e 70 53 68 61 72 65 64 29 7b 0a 20 20 20  p->pShared){.   
14410 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20   assert( p );.  
14420 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e    assert( p->pgn
14430 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
14440 6f 52 6f 6f 74 20 29 3b 0a 20 20 20 20 69 66 28  oRoot );.    if(
14450 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 20   p->wrFlag==0 ) 
14460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
14470 43 4b 45 44 3b 0a 20 20 20 20 69 66 28 20 73 71  CKED;.    if( sq
14480 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75  litepager_pagenu
14490 6d 62 65 72 28 70 2d 3e 70 50 61 67 65 29 21 3d  mber(p->pPage)!=
144a0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  p->pgnoRoot ){. 
144b0 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28       moveToRoot(
144c0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
144d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
144e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
144f0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
14500 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
14510 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
14520 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
14530 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
14540 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
14550 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
14560 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
14570 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
14580 20 77 68 61 74 20 64 61 74 61 62 61 73 65 20 74   what database t
14590 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
145a0 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
145b0 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
145c0 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
145d0 6e 67 20 61 74 20 74 68 65 20 6e 65 77 20 72 65  ng at the new re
145e0 63 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cord..*/.static 
145f0 69 6e 74 20 66 69 6c 65 42 74 72 65 65 49 6e 73  int fileBtreeIns
14600 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ert(.  BtCursor 
14610 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
14620 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
14630 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61  data into the ta
14640 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73  ble of this curs
14650 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  or */.  const vo
14660 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
14670 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
14680 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  y of the new rec
14690 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
146a0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
146b0 6e 44 61 74 61 20 20 20 2f 2a 20 54 68 65 20 64  nData   /* The d
146c0 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72  ata of the new r
146d0 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 43 65  ecord */.){.  Ce
146e0 6c 6c 20 6e 65 77 43 65 6c 6c 3b 0a 20 20 69 6e  ll newCell;.  in
146f0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b  t rc;.  int loc;
14700 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
14710 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
14720 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
14730 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28  Cur->pBt;..  if(
14740 20 70 43 75 72 2d 3e 70 50 61 67 65 3d 3d 30 20   pCur->pPage==0 
14750 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14760 4c 49 54 45 5f 41 42 4f 52 54 3b 20 20 2f 2a 20  LITE_ABORT;  /* 
14770 41 20 72 6f 6c 6c 62 61 63 6b 20 64 65 73 74 72  A rollback destr
14780 6f 79 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  oyed this cursor
14790 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   */.  }.  if( !p
147a0 42 74 2d 3e 69 6e 54 72 61 6e 73 20 7c 7c 20 6e  Bt->inTrans || n
147b0 4b 65 79 2b 6e 44 61 74 61 3d 3d 30 20 29 7b 0a  Key+nData==0 ){.
147c0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
147d0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
147e0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20  before doing an 
147f0 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65  insert */.    re
14800 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
14810 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
14820 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
14830 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
14840 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
14850 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72  y );.  if( !pCur
14860 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
14870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
14880 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  RM;   /* Cursor 
14890 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69  not open for wri
148a0 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
148b0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
148c0 28 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65  (pCur) ){.    re
148d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
148e0 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
148f0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
14900 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
14910 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 69  */.  }.  rc = fi
14920 6c 65 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  leBtreeMoveto(pC
14930 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
14940 26 6c 6f 63 29 3b 0a 20 20 69 66 28 20 72 63 20  &loc);.  if( rc 
14950 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
14960 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
14970 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
14980 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
14990 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
149a0 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
149b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
149c0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 66 69 6c  n rc;.  rc = fil
149d0 6c 49 6e 43 65 6c 6c 28 70 42 74 2c 20 26 6e 65  lInCell(pBt, &ne
149e0 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
149f0 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29  y, pData, nData)
14a00 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
14a10 75 72 6e 20 72 63 3b 0a 20 20 73 7a 4e 65 77 20  urn rc;.  szNew 
14a20 3d 20 63 65 6c 6c 53 69 7a 65 28 70 42 74 2c 20  = cellSize(pBt, 
14a30 26 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 69 66 28  &newCell);.  if(
14a40 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 6e   loc==0 ){.    n
14a50 65 77 43 65 6c 6c 2e 68 2e 6c 65 66 74 43 68 69  ewCell.h.leftChi
14a60 6c 64 20 3d 20 70 50 61 67 65 2d 3e 61 70 43 65  ld = pPage->apCe
14a70 6c 6c 5b 70 43 75 72 2d 3e 69 64 78 5d 2d 3e 68  ll[pCur->idx]->h
14a80 2e 6c 65 66 74 43 68 69 6c 64 3b 0a 20 20 20 20  .leftChild;.    
14a90 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
14aa0 42 74 2c 20 70 50 61 67 65 2d 3e 61 70 43 65 6c  Bt, pPage->apCel
14ab0 6c 5b 70 43 75 72 2d 3e 69 64 78 5d 29 3b 0a 20  l[pCur->idx]);. 
14ac0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
14ad0 72 6e 20 72 63 3b 0a 20 20 20 20 64 72 6f 70 43  rn rc;.    dropC
14ae0 65 6c 6c 28 70 42 74 2c 20 70 50 61 67 65 2c 20  ell(pBt, pPage, 
14af0 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
14b00 69 7a 65 28 70 42 74 2c 20 70 50 61 67 65 2d 3e  ize(pBt, pPage->
14b10 61 70 43 65 6c 6c 5b 70 43 75 72 2d 3e 69 64 78  apCell[pCur->idx
14b20 5d 29 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ]));.  }else if(
14b30 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
14b40 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
14b50 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 75  assert( pPage->u
14b60 2e 68 64 72 2e 72 69 67 68 74 43 68 69 6c 64 3d  .hdr.rightChild=
14b70 3d 30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20 62  =0 );  /* Must b
14b80 65 20 61 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  e a leaf page */
14b90 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b  .    pCur->idx++
14ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
14bb0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 75 2e  ssert( pPage->u.
14bc0 68 64 72 2e 72 69 67 68 74 43 68 69 6c 64 3d 3d  hdr.rightChild==
14bd0 30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65  0 );  /* Must be
14be0 20 61 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a   a leaf page */.
14bf0 20 20 7d 0a 20 20 69 6e 73 65 72 74 43 65 6c 6c    }.  insertCell
14c00 28 70 42 74 2c 20 70 50 61 67 65 2c 20 70 43 75  (pBt, pPage, pCu
14c10 72 2d 3e 69 64 78 2c 20 26 6e 65 77 43 65 6c 6c  r->idx, &newCell
14c20 2c 20 73 7a 4e 65 77 29 3b 0a 20 20 72 63 20 3d  , szNew);.  rc =
14c30 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2d 3e 70   balance(pCur->p
14c40 42 74 2c 20 70 50 61 67 65 2c 20 70 43 75 72 29  Bt, pPage, pCur)
14c50 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 42 74 72  ;.  /* sqliteBtr
14c60 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d  eePageDump(pCur-
14c70 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
14c80 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f  Root, 1); */.  /
14c90 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  * fflush(stdout)
14ca0 3b 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 65 53 6b  ; */.  pCur->eSk
14cb0 69 70 20 3d 20 53 4b 49 50 5f 49 4e 56 41 4c 49  ip = SKIP_INVALI
14cc0 44 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  D;.  return rc;.
14cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
14ce0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
14cf0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
14d00 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  nting to..**.** 
14d10 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
14d20 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65  ft pointing at e
14d30 69 74 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f  ither the next o
14d40 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  r the previous.*
14d50 2a 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  * entry.  If the
14d60 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
14d70 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
14d80 6e 65 78 74 20 65 6e 74 72 79 2c 20 74 68 65 6e  next entry, then
14d90 20 0a 2a 2a 20 74 68 65 20 70 43 75 72 2d 3e 65   .** the pCur->e
14da0 53 6b 69 70 20 66 6c 61 67 20 69 73 20 73 65 74  Skip flag is set
14db0 20 74 6f 20 53 4b 49 50 5f 4e 45 58 54 20 77 68   to SKIP_NEXT wh
14dc0 69 63 68 20 66 6f 72 63 65 73 20 74 68 65 20 6e  ich forces the n
14dd0 65 78 74 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20  ext call to .** 
14de0 73 71 6c 69 74 65 42 74 72 65 65 4e 65 78 74 28  sqliteBtreeNext(
14df0 29 20 74 6f 20 62 65 20 61 20 6e 6f 2d 6f 70 2e  ) to be a no-op.
14e00 20 20 54 68 61 74 20 77 61 79 2c 20 79 6f 75 20    That way, you 
14e10 63 61 6e 20 61 6c 77 61 79 73 20 63 61 6c 6c 0a  can always call.
14e20 2a 2a 20 73 71 6c 69 74 65 42 74 72 65 65 4e 65  ** sqliteBtreeNe
14e30 78 74 28 29 20 61 66 74 65 72 20 61 20 64 65 6c  xt() after a del
14e40 65 74 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  ete and the curs
14e50 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a  or will be left.
14e60 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ** pointing to t
14e70 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 61  he first entry a
14e80 66 74 65 72 20 74 68 65 20 64 65 6c 65 74 65 64  fter the deleted
14e90 20 65 6e 74 72 79 2e 20 20 53 69 6d 69 6c 61 72   entry.  Similar
14ea0 6c 79 2c 0a 2a 2a 20 70 43 75 72 2d 3e 65 53 6b  ly,.** pCur->eSk
14eb0 69 70 20 69 73 20 73 65 74 20 74 6f 20 53 4b 49  ip is set to SKI
14ec0 50 5f 50 52 45 56 20 69 73 20 74 68 65 20 63 75  P_PREV is the cu
14ed0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
14ee0 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20  nting to.** the 
14ef0 65 6e 74 72 79 20 70 72 69 6f 72 20 74 6f 20 74  entry prior to t
14f00 68 65 20 64 65 6c 65 74 65 64 20 65 6e 74 72 79  he deleted entry
14f10 20 73 6f 20 74 68 61 74 20 61 20 73 75 62 73 65   so that a subse
14f20 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a  quent call to.**
14f30 20 73 71 6c 69 74 65 42 74 72 65 65 50 72 65 76   sqliteBtreePrev
14f40 69 6f 75 73 28 29 20 77 69 6c 6c 20 61 6c 77 61  ious() will alwa
14f50 79 73 20 6c 65 61 76 65 20 74 68 65 20 63 75 72  ys leave the cur
14f60 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  sor pointing at 
14f70 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 69 6d 6d  the.** entry imm
14f80 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20  ediately before 
14f90 74 68 65 20 6f 6e 65 20 74 68 61 74 20 77 61 73  the one that was
14fa0 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
14fb0 74 69 63 20 69 6e 74 20 66 69 6c 65 42 74 72 65  tic int fileBtre
14fc0 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
14fd0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
14fe0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
14ff0 2d 3e 70 50 61 67 65 3b 0a 20 20 43 65 6c 6c 20  ->pPage;.  Cell 
15000 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63  *pCell;.  int rc
15010 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  ;.  Pgno pgnoChi
15020 6c 64 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ld;.  Btree *pBt
15030 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
15040 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
15050 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
15060 70 43 75 72 2d 3e 70 50 61 67 65 3d 3d 30 20 29  pCur->pPage==0 )
15070 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15080 49 54 45 5f 41 42 4f 52 54 3b 20 20 2f 2a 20 41  ITE_ABORT;  /* A
15090 20 72 6f 6c 6c 62 61 63 6b 20 64 65 73 74 72 6f   rollback destro
150a0 79 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 20  yed this cursor 
150b0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 42  */.  }.  if( !pB
150c0 74 2d 3e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  t->inTrans ){.  
150d0 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
150e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
150f0 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c  fore doing a del
15100 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ete */.    retur
15110 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
15120 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
15130 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
15140 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15150 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
15160 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64  ;.  if( pCur->id
15170 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  x >= pPage->nCel
15180 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
15190 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
151a0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  * The cursor is 
151b0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
151c0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
151d0 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46    if( !pCur->wrF
151e0 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
151f0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20  n SQLITE_PERM;  
15200 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e   /* Did not open
15210 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72   this cursor for
15220 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
15230 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
15240 6f 63 6b 73 28 70 43 75 72 29 20 29 7b 0a 20 20  ocks(pCur) ){.  
15250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15260 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
15270 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
15280 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
15290 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20  ock */.  }.  rc 
152a0 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72  = sqlitepager_wr
152b0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  ite(pPage);.  if
152c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
152d0 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  pCell = pPag
152e0 65 2d 3e 61 70 43 65 6c 6c 5b 70 43 75 72 2d 3e  e->apCell[pCur->
152f0 69 64 78 5d 3b 0a 20 20 70 67 6e 6f 43 68 69 6c  idx];.  pgnoChil
15300 64 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c 20  d = SWAB32(pBt, 
15310 70 43 65 6c 6c 2d 3e 68 2e 6c 65 66 74 43 68 69  pCell->h.leftChi
15320 6c 64 29 3b 0a 20 20 63 6c 65 61 72 43 65 6c 6c  ld);.  clearCell
15330 28 70 42 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  (pBt, pCell);.  
15340 69 66 28 20 70 67 6e 6f 43 68 69 6c 64 20 29 7b  if( pgnoChild ){
15350 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
15360 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20  he entry we are 
15370 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20  about to delete 
15380 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f  is not a leaf so
15390 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20   if we do not.  
153a0 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e    ** do somethin
153b0 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  g we will leave 
153c0 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74  a hole on an int
153d0 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20  ernal page..    
153e0 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69  ** We have to fi
153f0 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d  ll the hole by m
15400 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20  oving in a cell 
15410 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68  from a leaf.  Th
15420 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65  e.    ** next Ce
15430 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65  ll after the one
15440 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
15450 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
15460 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a  exist and.    **
15470 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f   to be a leaf so
15480 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a   we can use it..
15490 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72      */.    BtCur
154a0 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20  sor leafCur;.   
154b0 20 43 65 6c 6c 20 2a 70 4e 65 78 74 3b 0a 20 20   Cell *pNext;.  
154c0 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b 0a 20 20    int szNext;.  
154d0 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
154e0 20 20 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72     getTempCursor
154f0 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29  (pCur, &leafCur)
15500 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6c 65 42  ;.    rc = fileB
15510 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
15520 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
15530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15550 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
15560 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  PT;.    }.    rc
15570 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77   = sqlitepager_w
15580 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61  rite(leafCur.pPa
15590 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
155a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
155b0 20 64 72 6f 70 43 65 6c 6c 28 70 42 74 2c 20 70   dropCell(pBt, p
155c0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
155d0 20 63 65 6c 6c 53 69 7a 65 28 70 42 74 2c 20 70   cellSize(pBt, p
155e0 43 65 6c 6c 29 29 3b 0a 20 20 20 20 70 4e 65 78  Cell));.    pNex
155f0 74 20 3d 20 6c 65 61 66 43 75 72 2e 70 50 61 67  t = leafCur.pPag
15600 65 2d 3e 61 70 43 65 6c 6c 5b 6c 65 61 66 43 75  e->apCell[leafCu
15610 72 2e 69 64 78 5d 3b 0a 20 20 20 20 73 7a 4e 65  r.idx];.    szNe
15620 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 28 70 42  xt = cellSize(pB
15630 74 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 70  t, pNext);.    p
15640 4e 65 78 74 2d 3e 68 2e 6c 65 66 74 43 68 69 6c  Next->h.leftChil
15650 64 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c 20  d = SWAB32(pBt, 
15660 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20  pgnoChild);.    
15670 69 6e 73 65 72 74 43 65 6c 6c 28 70 42 74 2c 20  insertCell(pBt, 
15680 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
15690 2c 20 70 4e 65 78 74 2c 20 73 7a 4e 65 78 74 29  , pNext, szNext)
156a0 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
156b0 63 65 28 70 42 74 2c 20 70 50 61 67 65 2c 20 70  ce(pBt, pPage, p
156c0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
156d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
156e0 20 20 70 43 75 72 2d 3e 65 53 6b 69 70 20 3d 20    pCur->eSkip = 
156f0 53 4b 49 50 5f 4e 45 58 54 3b 0a 20 20 20 20 64  SKIP_NEXT;.    d
15700 72 6f 70 43 65 6c 6c 28 70 42 74 2c 20 6c 65 61  ropCell(pBt, lea
15710 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
15720 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29  Cur.idx, szNext)
15730 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
15740 63 65 28 70 42 74 2c 20 6c 65 61 66 43 75 72 2e  ce(pBt, leafCur.
15750 70 50 61 67 65 2c 20 70 43 75 72 29 3b 0a 20 20  pPage, pCur);.  
15760 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72    releaseTempCur
15770 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
15780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 72 6f 70   }else{.    drop
15790 43 65 6c 6c 28 70 42 74 2c 20 70 50 61 67 65 2c  Cell(pBt, pPage,
157a0 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c   pCur->idx, cell
157b0 53 69 7a 65 28 70 42 74 2c 20 70 43 65 6c 6c 29  Size(pBt, pCell)
157c0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
157d0 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
157e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ll ){.      pCur
157f0 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
15800 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 20 20 69 66  Cell-1;.      if
15810 28 20 70 43 75 72 2d 3e 69 64 78 3c 30 20 29 7b  ( pCur->idx<0 ){
15820 20 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e   .        pCur->
15830 69 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  idx = 0;.       
15840 20 70 43 75 72 2d 3e 65 53 6b 69 70 20 3d 20 53   pCur->eSkip = S
15850 4b 49 50 5f 4e 45 58 54 3b 0a 20 20 20 20 20 20  KIP_NEXT;.      
15860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15870 43 75 72 2d 3e 65 53 6b 69 70 20 3d 20 53 4b 49  Cur->eSkip = SKI
15880 50 5f 50 52 45 56 3b 0a 20 20 20 20 20 20 7d 0a  P_PREV;.      }.
15890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
158a0 20 70 43 75 72 2d 3e 65 53 6b 69 70 20 3d 20 53   pCur->eSkip = S
158b0 4b 49 50 5f 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  KIP_NEXT;.    }.
158c0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
158d0 28 70 42 74 2c 20 70 50 61 67 65 2c 20 70 43 75  (pBt, pPage, pCu
158e0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
158f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
15900 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
15910 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
15920 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
15930 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
15940 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
15950 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
15960 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  le..**.** In the
15970 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
15980 6e 74 61 74 69 6f 6e 2c 20 42 54 72 65 65 20 74  ntation, BTree t
15990 61 62 6c 65 73 20 61 6e 64 20 42 54 72 65 65 20  ables and BTree 
159a0 69 6e 64 69 63 65 73 20 61 72 65 20 74 68 65 20  indices are the 
159b0 0a 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 20 49  .** the same.  I
159c0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 77 65  n the future, we
159d0 20 6d 61 79 20 63 68 61 6e 67 65 20 74 68 69 73   may change this
159e0 20 73 6f 20 74 68 61 74 20 42 54 72 65 65 20 74   so that BTree t
159f0 61 62 6c 65 73 0a 2a 2a 20 61 72 65 20 72 65 73  ables.** are res
15a00 74 72 69 63 74 65 64 20 74 6f 20 68 61 76 69 6e  tricted to havin
15a10 67 20 61 20 34 2d 62 79 74 65 20 69 6e 74 65 67  g a 4-byte integ
15a20 65 72 20 6b 65 79 20 61 6e 64 20 61 72 62 69 74  er key and arbit
15a30 72 61 72 79 20 64 61 74 61 20 61 6e 64 0a 2a 2a  rary data and.**
15a40 20 42 54 72 65 65 20 69 6e 64 69 63 65 73 20 61   BTree indices a
15a50 72 65 20 72 65 73 74 72 69 63 74 65 64 20 74 6f  re restricted to
15a60 20 68 61 76 69 6e 67 20 61 6e 20 61 72 62 69 74   having an arbit
15a70 72 61 72 79 20 6b 65 79 20 61 6e 64 20 6e 6f 20  rary key and no 
15a80 64 61 74 61 2e 0a 2a 2a 20 42 75 74 20 66 6f 72  data..** But for
15a90 20 6e 6f 77 2c 20 74 68 69 73 20 72 6f 75 74 69   now, this routi
15aa0 6e 65 20 61 6c 73 6f 20 73 65 72 76 65 73 20 74  ne also serves t
15ab0 6f 20 63 72 65 61 74 65 20 69 6e 64 69 63 65 73  o create indices
15ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15ad0 66 69 6c 65 42 74 72 65 65 43 72 65 61 74 65 54  fileBtreeCreateT
15ae0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 42 74 2c  able(Btree *pBt,
15af0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 29 7b 0a   int *piTable){.
15b00 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
15b10 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
15b20 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
15b30 66 28 20 21 70 42 74 2d 3e 69 6e 54 72 61 6e 73  f( !pBt->inTrans
15b40 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
15b50 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
15b60 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 20  ion first */.   
15b70 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
15b80 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
15b90 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
15ba0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
15bb0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
15bc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15bd0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
15be0 20 7d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61   }.  rc = alloca
15bf0 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  tePage(pBt, &pRo
15c00 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 30  ot, &pgnoRoot, 0
15c10 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
15c20 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
15c30 74 28 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69  t( sqlitepager_i
15c40 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
15c50 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
15c60 70 42 74 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 73  pBt, pRoot);.  s
15c70 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
15c80 28 70 52 6f 6f 74 29 3b 0a 20 20 2a 70 69 54 61  (pRoot);.  *piTa
15c90 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
15ca0 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
15cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15cc0 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
15cd0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
15ce0 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
15cf0 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
15d00 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
15d10 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
15d20 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
15d30 74 61 62 61 73 65 50 61 67 65 28 42 74 72 65 65  tabasePage(Btree
15d40 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
15d50 2c 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c  , int freePageFl
15d60 61 67 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ag){.  MemPage *
15d70 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pPage;.  int rc;
15d80 0a 20 20 43 65 6c 6c 20 2a 70 43 65 6c 6c 3b 0a  .  Cell *pCell;.
15d90 20 20 69 6e 74 20 69 64 78 3b 0a 0a 20 20 72 63    int idx;..  rc
15da0 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67   = sqlitepager_g
15db0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
15dc0 70 67 6e 6f 2c 20 28 76 6f 69 64 2a 2a 29 26 70  pgno, (void**)&p
15dd0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
15de0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
15df0 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
15e00 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
15e10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15e20 72 63 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50  rc;.  rc = initP
15e30 61 67 65 28 70 42 74 2c 20 70 50 61 67 65 2c 20  age(pBt, pPage, 
15e40 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20  pgno, 0);.  if( 
15e50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
15e60 20 20 69 64 78 20 3d 20 53 57 41 42 31 36 28 70    idx = SWAB16(p
15e70 42 74 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72  Bt, pPage->u.hdr
15e80 2e 66 69 72 73 74 43 65 6c 6c 29 3b 0a 20 20 77  .firstCell);.  w
15e90 68 69 6c 65 28 20 69 64 78 3e 30 20 29 7b 0a 20  hile( idx>0 ){. 
15ea0 20 20 20 70 43 65 6c 6c 20 3d 20 28 43 65 6c 6c     pCell = (Cell
15eb0 2a 29 26 70 50 61 67 65 2d 3e 75 2e 61 44 69 73  *)&pPage->u.aDis
15ec0 6b 5b 69 64 78 5d 3b 0a 20 20 20 20 69 64 78 20  k[idx];.    idx 
15ed0 3d 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 43  = SWAB16(pBt, pC
15ee0 65 6c 6c 2d 3e 68 2e 69 4e 65 78 74 29 3b 0a 20  ell->h.iNext);. 
15ef0 20 20 20 69 66 28 20 70 43 65 6c 6c 2d 3e 68 2e     if( pCell->h.
15f00 6c 65 66 74 43 68 69 6c 64 20 29 7b 0a 20 20 20  leftChild ){.   
15f10 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
15f20 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 53  abasePage(pBt, S
15f30 57 41 42 33 32 28 70 42 74 2c 20 70 43 65 6c 6c  WAB32(pBt, pCell
15f40 2d 3e 68 2e 6c 65 66 74 43 68 69 6c 64 29 2c 20  ->h.leftChild), 
15f50 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
15f60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15f70 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
15f80 61 72 43 65 6c 6c 28 70 42 74 2c 20 70 43 65 6c  arCell(pBt, pCel
15f90 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
15fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
15fb0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 75 2e 68    if( pPage->u.h
15fc0 64 72 2e 72 69 67 68 74 43 68 69 6c 64 20 29 7b  dr.rightChild ){
15fd0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
15fe0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
15ff0 20 53 57 41 42 33 32 28 70 42 74 2c 20 70 50 61   SWAB32(pBt, pPa
16000 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74 43  ge->u.hdr.rightC
16010 68 69 6c 64 29 2c 20 31 29 3b 0a 20 20 20 20 69  hild), 1);.    i
16020 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16030 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  c;.  }.  if( fre
16040 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20  ePageFlag ){.   
16050 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
16060 42 74 2c 20 70 50 61 67 65 2c 20 70 67 6e 6f 29  Bt, pPage, pgno)
16070 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
16080 65 72 6f 50 61 67 65 28 70 42 74 2c 20 70 50 61  eroPage(pBt, pPa
16090 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ge);.  }.  sqlit
160a0 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  epager_unref(pPa
160b0 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
160c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
160d0 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
160e0 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  n from a single 
160f0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
16100 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
16110 20 69 6e 74 20 66 69 6c 65 42 74 72 65 65 43 6c   int fileBtreeCl
16120 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a  earTable(Btree *
16130 70 42 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 29  pBt, int iTable)
16140 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
16150 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
16160 69 66 28 20 21 70 42 74 2d 3e 69 6e 54 72 61 6e  if( !pBt->inTran
16170 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
16180 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
16190 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
161a0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
161b0 20 20 7d 0a 20 20 66 6f 72 28 70 43 75 72 3d 70    }.  for(pCur=p
161c0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
161d0 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
161e0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
161f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  ur->pgnoRoot==(P
16200 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
16210 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
16220 46 6c 61 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  Flag==0 ) return
16230 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
16240 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74        moveToRoot
16250 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
16260 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61  }.  rc = clearDa
16270 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
16280 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 29  (Pgno)iTable, 0)
16290 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
162a0 20 20 66 69 6c 65 42 74 72 65 65 52 6f 6c 6c 62    fileBtreeRollb
162b0 61 63 6b 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ack(pBt);.  }.  
162c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
162d0 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e  .** Erase all in
162e0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74  formation in a t
162f0 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65  able and add the
16300 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
16310 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65  le to.** the fre
16320 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20  elist.  Except, 
16330 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
16340 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20  principle table 
16350 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70  (the one on.** p
16360 61 67 65 20 32 29 20 69 73 20 6e 65 76 65 72 20  age 2) is never 
16370 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
16380 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
16390 20 69 6e 74 20 66 69 6c 65 42 74 72 65 65 44 72   int fileBtreeDr
163a0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
163b0 42 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  Bt, int iTable){
163c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
163d0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
163e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
163f0 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 54 72 61   if( !pBt->inTra
16400 6e 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ns ){.    return
16410 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
16420 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16430 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
16440 0a 20 20 7d 0a 20 20 66 6f 72 28 70 43 75 72 3d  .  }.  for(pCur=
16450 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
16460 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
16470 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
16480 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28  Cur->pgnoRoot==(
16490 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20  Pgno)iTable ){. 
164a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
164b0 54 45 5f 4c 4f 43 4b 45 44 3b 20 20 2f 2a 20 43  TE_LOCKED;  /* C
164c0 61 6e 6e 6f 74 20 64 72 6f 70 20 61 20 74 61 62  annot drop a tab
164d0 6c 65 20 74 68 61 74 20 68 61 73 20 61 20 63 75  le that has a cu
164e0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  rsor */.    }.  
164f0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70  }.  rc = sqlitep
16500 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50  ager_get(pBt->pP
16510 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 54 61 62  ager, (Pgno)iTab
16520 6c 65 2c 20 28 76 6f 69 64 2a 2a 29 26 70 50 61  le, (void**)&pPa
16530 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
16540 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16550 3d 20 66 69 6c 65 42 74 72 65 65 43 6c 65 61 72  = fileBtreeClear
16560 54 61 62 6c 65 28 70 42 74 2c 20 69 54 61 62 6c  Table(pBt, iTabl
16570 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
16580 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
16590 69 54 61 62 6c 65 3e 32 20 29 7b 0a 20 20 20 20  iTable>2 ){.    
165a0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 42  rc = freePage(pB
165b0 74 2c 20 70 50 61 67 65 2c 20 69 54 61 62 6c 65  t, pPage, iTable
165c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
165d0 7a 65 72 6f 50 61 67 65 28 70 42 74 2c 20 70 50  zeroPage(pBt, pP
165e0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  age);.  }.  sqli
165f0 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  tepager_unref(pP
16600 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
16610 63 3b 20 20 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a  c;  .}..#if 0 /*
16620 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 2f 2a 0a   UNTESTED */./*.
16630 2a 2a 20 43 6f 70 79 20 61 6c 6c 20 63 65 6c 6c  ** Copy all cell
16640 20 64 61 74 61 20 66 72 6f 6d 20 6f 6e 65 20 64   data from one d
16650 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
16660 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2a 20 70 61  o another..** pa
16670 67 65 73 20 62 61 63 6b 20 74 68 65 20 66 72 65  ges back the fre
16680 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
16690 20 69 6e 74 20 63 6f 70 79 43 65 6c 6c 28 42 74   int copyCell(Bt
166a0 72 65 65 20 2a 70 42 74 46 72 6f 6d 2c 20 42 54  ree *pBtFrom, BT
166b0 72 65 65 20 2a 70 42 74 54 6f 2c 20 43 65 6c 6c  ree *pBtTo, Cell
166c0 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 50 61 67 65   *pCell){.  Page
166d0 72 20 2a 70 46 72 6f 6d 50 61 67 65 72 20 3d 20  r *pFromPager = 
166e0 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 3b  pBtFrom->pPager;
166f0 0a 20 20 4f 76 65 72 66 6c 6f 77 50 61 67 65 20  .  OverflowPage 
16700 2a 70 4f 76 66 6c 3b 0a 20 20 50 67 6e 6f 20 6f  *pOvfl;.  Pgno o
16710 76 66 6c 2c 20 6e 65 78 74 4f 76 66 6c 3b 0a 20  vfl, nextOvfl;. 
16720 20 50 67 6e 6f 20 2a 70 50 72 65 76 3b 0a 20 20   Pgno *pPrev;.  
16730 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16740 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
16750 4e 65 77 2c 20 2a 70 50 72 65 76 50 67 3b 0a 20  New, *pPrevPg;. 
16760 20 50 67 6e 6f 20 6e 65 77 3b 0a 0a 20 20 69 66   Pgno new;..  if
16770 28 20 4e 4b 45 59 28 70 42 74 54 6f 2c 20 70 43  ( NKEY(pBtTo, pC
16780 65 6c 6c 2d 3e 68 29 20 2b 20 4e 44 41 54 41 28  ell->h) + NDATA(
16790 70 42 74 54 6f 2c 20 70 43 65 6c 6c 2d 3e 68 29  pBtTo, pCell->h)
167a0 20 3c 3d 20 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59   <= MX_LOCAL_PAY
167b0 4c 4f 41 44 20 29 7b 0a 20 20 20 20 72 65 74 75  LOAD ){.    retu
167c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
167d0 7d 0a 20 20 70 50 72 65 76 20 3d 20 26 70 43 65  }.  pPrev = &pCe
167e0 6c 6c 2d 3e 6f 76 66 6c 3b 0a 20 20 70 50 72 65  ll->ovfl;.  pPre
167f0 76 50 67 20 3d 20 30 3b 0a 20 20 6f 76 66 6c 20  vPg = 0;.  ovfl 
16800 3d 20 53 57 41 42 33 32 28 70 42 74 54 6f 2c 20  = SWAB32(pBtTo, 
16810 70 43 65 6c 6c 2d 3e 6f 76 66 6c 29 3b 0a 20 20  pCell->ovfl);.  
16820 77 68 69 6c 65 28 20 6f 76 66 6c 20 26 26 20 72  while( ovfl && r
16830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
16850 61 67 65 72 5f 67 65 74 28 70 46 72 6f 6d 50 61  ager_get(pFromPa
16860 67 65 72 2c 20 6f 76 66 6c 2c 20 28 76 6f 69 64  ger, ovfl, (void
16870 2a 2a 29 26 70 4f 76 66 6c 29 3b 0a 20 20 20 20  **)&pOvfl);.    
16880 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16890 72 63 3b 0a 20 20 20 20 6e 65 78 74 4f 76 66 6c  rc;.    nextOvfl
168a0 20 3d 20 53 57 41 42 33 32 28 70 42 74 46 72 6f   = SWAB32(pBtFro
168b0 6d 2c 20 70 4f 76 66 6c 2d 3e 69 4e 65 78 74 29  m, pOvfl->iNext)
168c0 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
168d0 61 74 65 50 61 67 65 28 70 42 74 54 6f 2c 20 26  atePage(pBtTo, &
168e0 70 4e 65 77 2c 20 26 6e 65 77 2c 20 30 29 3b 0a  pNew, &new, 0);.
168f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16910 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
16920 77 72 69 74 65 28 70 4e 65 77 29 3b 0a 20 20 20  write(pNew);.   
16930 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16950 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 4f 76  memcpy(pNew, pOv
16960 66 6c 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fl, SQLITE_PAGE_
16970 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 2a  SIZE);.        *
16980 70 50 72 65 76 20 3d 20 53 57 41 42 33 32 28 70  pPrev = SWAB32(p
16990 42 74 54 6f 2c 20 6e 65 77 29 3b 0a 20 20 20 20  BtTo, new);.    
169a0 20 20 20 20 69 66 28 20 70 50 72 65 76 50 67 20      if( pPrevPg 
169b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
169c0 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70  itepager_unref(p
169d0 50 72 65 76 50 67 29 3b 0a 20 20 20 20 20 20 20  PrevPg);.       
169e0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
169f0 20 3d 20 26 70 4f 76 66 6c 2d 3e 69 4e 65 78 74   = &pOvfl->iNext
16a00 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 50  ;.        pPrevP
16a10 67 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  g = pNew;.      
16a20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
16a30 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f  tepager_unref(pO
16a40 76 66 6c 29 3b 0a 20 20 20 20 6f 76 66 6c 20 3d  vfl);.    ovfl =
16a50 20 6e 65 78 74 4f 76 66 6c 3b 0a 20 20 7d 0a 20   nextOvfl;.  }. 
16a60 20 69 66 28 20 70 50 72 65 76 50 67 20 29 7b 0a   if( pPrevPg ){.
16a70 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
16a80 75 6e 72 65 66 28 70 50 72 65 76 50 67 29 3b 0a  unref(pPrevPg);.
16a90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16aa0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  .}.#endif...#if 
16ab0 30 20 2f 2a 20 55 4e 54 45 53 54 45 44 20 2a 2f  0 /* UNTESTED */
16ac0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 61 20 70 61  ./*.** Copy a pa
16ad0 67 65 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20  ge of data from 
16ae0 6f 6e 65 20 64 61 74 61 62 61 73 65 20 6f 76 65  one database ove
16af0 72 20 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f  r to another..*/
16b00 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
16b10 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20  DatabasePage(.  
16b20 42 74 72 65 65 20 2a 70 42 74 46 72 6f 6d 2c 0a  Btree *pBtFrom,.
16b30 20 20 50 67 6e 6f 20 70 67 6e 6f 46 72 6f 6d 2c    Pgno pgnoFrom,
16b40 0a 20 20 42 74 72 65 65 20 2a 70 42 74 54 6f 2c  .  Btree *pBtTo,
16b50 0a 20 20 50 67 6e 6f 20 2a 70 54 6f 0a 29 7b 0a  .  Pgno *pTo.){.
16b60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
16b70 46 72 6f 6d 2c 20 2a 70 50 61 67 65 3b 0a 20 20  From, *pPage;.  
16b80 50 67 6e 6f 20 74 6f 3b 0a 20 20 69 6e 74 20 72  Pgno to;.  int r
16b90 63 3b 0a 20 20 43 65 6c 6c 20 2a 70 43 65 6c 6c  c;.  Cell *pCell
16ba0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 0a 20 20  ;.  int idx;..  
16bb0 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
16bc0 5f 67 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  _get(pBtFrom->pP
16bd0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 76 6f 69  ager, pgno, (voi
16be0 64 2a 2a 29 26 70 50 61 67 65 46 72 6f 6d 29 3b  d**)&pPageFrom);
16bf0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16c00 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 6c  rn rc;.  rc = al
16c10 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
16c20 26 70 50 61 67 65 2c 20 70 54 6f 2c 20 30 29 3b  &pPage, pTo, 0);
16c30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
16c50 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
16c60 74 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  te(pPage);.  }. 
16c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16c80 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  OK ){.    memcpy
16c90 28 70 50 61 67 65 2c 20 70 50 61 67 65 46 72 6f  (pPage, pPageFro
16ca0 6d 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  m, SQLITE_PAGE_S
16cb0 49 5a 45 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  IZE);.    idx = 
16cc0 53 57 41 42 31 36 28 70 42 74 2c 20 70 50 61 67  SWAB16(pBt, pPag
16cd0 65 2d 3e 75 2e 68 64 72 2e 66 69 72 73 74 43 65  e->u.hdr.firstCe
16ce0 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ll);.    while( 
16cf0 69 64 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  idx>0 ){.      p
16d00 43 65 6c 6c 20 3d 20 28 43 65 6c 6c 2a 29 26 70  Cell = (Cell*)&p
16d10 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b 5b 69 64  Page->u.aDisk[id
16d20 78 5d 3b 0a 20 20 20 20 20 20 69 64 78 20 3d 20  x];.      idx = 
16d30 53 57 41 42 31 36 28 70 42 74 2c 20 70 43 65 6c  SWAB16(pBt, pCel
16d40 6c 2d 3e 68 2e 69 4e 65 78 74 29 3b 0a 20 20 20  l->h.iNext);.   
16d50 20 20 20 69 66 28 20 70 43 65 6c 6c 2d 3e 68 2e     if( pCell->h.
16d60 6c 65 66 74 43 68 69 6c 64 20 29 7b 0a 20 20 20  leftChild ){.   
16d70 20 20 20 20 20 50 67 6e 6f 20 6e 65 77 43 68 6c       Pgno newChl
16d80 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  d;.        rc = 
16d90 63 6f 70 79 44 61 74 61 62 61 73 65 50 61 67 65  copyDatabasePage
16da0 28 70 42 74 46 72 6f 6d 2c 20 53 57 41 42 33 32  (pBtFrom, SWAB32
16db0 28 70 42 74 46 72 6f 6d 2c 20 70 43 65 6c 6c 2d  (pBtFrom, pCell-
16dc0 3e 68 2e 6c 65 66 74 43 68 69 6c 64 29 2c 0a 20  >h.leftChild),. 
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 74               pBt
16df0 54 6f 2c 20 26 6e 65 77 43 68 6c 64 29 3b 0a 20  To, &newChld);. 
16e00 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
16e10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16e20 20 20 20 70 43 65 6c 6c 2d 3e 68 2e 6c 65 66 74     pCell->h.left
16e30 43 68 69 6c 64 20 3d 20 53 57 41 42 33 32 28 70  Child = SWAB32(p
16e40 42 74 46 72 6f 6d 2c 20 6e 65 77 43 68 6c 64 29  BtFrom, newChld)
16e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16e60 72 63 20 3d 20 63 6f 70 79 43 65 6c 6c 28 70 42  rc = copyCell(pB
16e70 74 46 72 6f 6d 2c 20 70 42 74 54 6f 2c 20 70 43  tFrom, pBtTo, pC
16e80 65 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ell);.      if( 
16e90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
16ea0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
16eb0 61 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74  age->u.hdr.right
16ec0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 50  Child ){.      P
16ed0 67 6e 6f 20 6e 65 77 43 68 6c 64 3b 0a 20 20 20  gno newChld;.   
16ee0 20 20 20 72 63 20 3d 20 63 6f 70 79 44 61 74 61     rc = copyData
16ef0 62 61 73 65 50 61 67 65 28 70 42 74 46 72 6f 6d  basePage(pBtFrom
16f00 2c 20 53 57 41 42 33 32 28 70 42 74 46 72 6f 6d  , SWAB32(pBtFrom
16f10 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72  , pPage->u.hdr.r
16f20 69 67 68 74 43 68 69 6c 64 29 2c 20 0a 20 20 20  ightChild), .   
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 20 20 20 20 70 42 74 54 6f 2c 20           pBtTo, 
16f50 26 6e 65 77 43 68 6c 64 29 3b 0a 20 20 20 20 20  &newChld);.     
16f60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16f70 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
16f80 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74 43 68 69  ->u.hdr.rightChi
16f90 6c 64 20 3d 20 53 57 41 42 33 32 28 70 42 74 54  ld = SWAB32(pBtT
16fa0 6f 2c 20 6e 65 77 43 68 69 6c 64 29 3b 0a 20 20  o, newChild);.  
16fb0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
16fc0 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
16fd0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
16fe0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16ff0 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69   Read the meta-i
17000 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
17010 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
17020 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17030 20 66 69 6c 65 42 74 72 65 65 47 65 74 4d 65 74   fileBtreeGetMet
17040 61 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e  a(Btree *pBt, in
17050 74 20 2a 61 4d 65 74 61 29 7b 0a 20 20 50 61 67  t *aMeta){.  Pag
17060 65 4f 6e 65 20 2a 70 50 31 3b 0a 20 20 69 6e 74  eOne *pP1;.  int
17070 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   rc;.  int i;.. 
17080 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
17090 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65  r_get(pBt->pPage
170a0 72 2c 20 31 2c 20 28 76 6f 69 64 2a 2a 29 26 70  r, 1, (void**)&p
170b0 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  P1);.  if( rc ) 
170c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 4d 65  return rc;.  aMe
170d0 74 61 5b 30 5d 20 3d 20 53 57 41 42 33 32 28 70  ta[0] = SWAB32(p
170e0 42 74 2c 20 70 50 31 2d 3e 6e 46 72 65 65 29 3b  Bt, pP1->nFree);
170f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
17100 7a 65 6f 66 28 70 50 31 2d 3e 61 4d 65 74 61 29  zeof(pP1->aMeta)
17110 2f 73 69 7a 65 6f 66 28 70 50 31 2d 3e 61 4d 65  /sizeof(pP1->aMe
17120 74 61 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ta[0]); i++){.  
17130 20 20 61 4d 65 74 61 5b 69 2b 31 5d 20 3d 20 53    aMeta[i+1] = S
17140 57 41 42 33 32 28 70 42 74 2c 20 70 50 31 2d 3e  WAB32(pBt, pP1->
17150 61 4d 65 74 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aMeta[i]);.  }. 
17160 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
17170 65 66 28 70 50 31 29 3b 0a 20 20 72 65 74 75 72  ef(pP1);.  retur
17180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17190 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61  /*.** Write meta
171a0 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63  -information bac
171b0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
171c0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
171d0 6e 74 20 66 69 6c 65 42 74 72 65 65 55 70 64 61  nt fileBtreeUpda
171e0 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 42  teMeta(Btree *pB
171f0 74 2c 20 69 6e 74 20 2a 61 4d 65 74 61 29 7b 0a  t, int *aMeta){.
17200 20 20 50 61 67 65 4f 6e 65 20 2a 70 50 31 3b 0a    PageOne *pP1;.
17210 20 20 69 6e 74 20 72 63 2c 20 69 3b 0a 20 20 69    int rc, i;.  i
17220 66 28 20 21 70 42 74 2d 3e 69 6e 54 72 61 6e 73  f( !pBt->inTrans
17230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
17240 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
17250 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
17260 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17270 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
17280 70 61 67 65 31 3b 0a 20 20 72 63 20 3d 20 73 71  page1;.  rc = sq
17290 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28  litepager_write(
172a0 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pP1);.  if( rc )
172b0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 20   return rc;   . 
172c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
172d0 6f 66 28 70 50 31 2d 3e 61 4d 65 74 61 29 2f 73  of(pP1->aMeta)/s
172e0 69 7a 65 6f 66 28 70 50 31 2d 3e 61 4d 65 74 61  izeof(pP1->aMeta
172f0 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
17300 70 50 31 2d 3e 61 4d 65 74 61 5b 69 5d 20 3d 20  pP1->aMeta[i] = 
17310 53 57 41 42 33 32 28 70 42 74 2c 20 61 4d 65 74  SWAB32(pBt, aMet
17320 61 5b 69 2b 31 5d 29 3b 0a 20 20 7d 0a 20 20 72  a[i+1]);.  }.  r
17330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17340 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
17350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17390 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 6c  ***.** The compl
173a0 65 74 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ete implementati
173b0 6f 6e 20 6f 66 20 74 68 65 20 42 54 72 65 65 20  on of the BTree 
173c0 73 75 62 73 79 73 74 65 6d 20 69 73 20 61 62 6f  subsystem is abo
173d0 76 65 20 74 68 69 73 20 6c 69 6e 65 2e 0a 2a 2a  ve this line..**
173e0 20 41 6c 6c 20 74 68 65 20 63 6f 64 65 20 74 68   All the code th
173f0 65 20 66 6f 6c 6c 6f 77 73 20 69 73 20 66 6f 72  e follows is for
17400 20 74 65 73 74 69 6e 67 20 61 6e 64 20 74 72 6f   testing and tro
17410 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 74 68 65  ubleshooting the
17420 20 42 54 72 65 65 0a 2a 2a 20 73 75 62 73 79 73   BTree.** subsys
17430 74 65 6d 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  tem.  None of th
17440 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
17450 6f 77 73 20 69 73 20 75 73 65 64 20 64 75 72 69  ows is used duri
17460 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ng normal operat
17470 69 6f 6e 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion..***********
17480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
174a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
174b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
174c0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ***/../*.** Prin
174d0 74 20 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20  t a disassembly 
174e0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
174f0 65 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75  e on standard ou
17500 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
17510 69 6e 65 0a 2a 2a 20 69 73 20 75 73 65 64 20 66  ine.** is used f
17520 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64  or debugging and
17530 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a   testing only..*
17540 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17550 54 45 53 54 0a 73 74 61 74 69 63 20 69 6e 74 20  TEST.static int 
17560 66 69 6c 65 42 74 72 65 65 50 61 67 65 44 75 6d  fileBtreePageDum
17570 70 28 42 74 72 65 65 20 2a 70 42 74 2c 20 69 6e  p(Btree *pBt, in
17580 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75  t pgno, int recu
17590 72 73 69 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  rsive){.  int rc
175a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
175b0 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ge;.  int i, j;.
175c0 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75    int nFree;.  u
175d0 31 36 20 69 64 78 3b 0a 20 20 63 68 61 72 20 72  16 idx;.  char r
175e0 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75 6e 73 69  ange[20];.  unsi
175f0 67 6e 65 64 20 63 68 61 72 20 70 61 79 6c 6f 61  gned char payloa
17600 64 5b 32 30 5d 3b 0a 20 20 72 63 20 3d 20 73 71  d[20];.  rc = sq
17610 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 70 42  litepager_get(pB
17620 74 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f  t->pPager, (Pgno
17630 29 70 67 6e 6f 2c 20 28 76 6f 69 64 2a 2a 29 26  )pgno, (void**)&
17640 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
17650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17660 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 63  c;.  }.  if( rec
17670 75 72 73 69 76 65 20 29 20 70 72 69 6e 74 66 28  ursive ) printf(
17680 22 50 41 47 45 20 25 64 3a 5c 6e 22 2c 20 70 67  "PAGE %d:\n", pg
17690 6e 6f 29 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  no);.  i = 0;.  
176a0 69 64 78 20 3d 20 53 57 41 42 31 36 28 70 42 74  idx = SWAB16(pBt
176b0 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 66  , pPage->u.hdr.f
176c0 69 72 73 74 43 65 6c 6c 29 3b 0a 20 20 77 68 69  irstCell);.  whi
176d0 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78  le( idx>0 && idx
176e0 3c 3d 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  <=SQLITE_PAGE_SI
176f0 5a 45 2d 4d 49 4e 5f 43 45 4c 4c 5f 53 49 5a 45  ZE-MIN_CELL_SIZE
17700 20 29 7b 0a 20 20 20 20 43 65 6c 6c 20 2a 70 43   ){.    Cell *pC
17710 65 6c 6c 20 3d 20 28 43 65 6c 6c 2a 29 26 70 50  ell = (Cell*)&pP
17720 61 67 65 2d 3e 75 2e 61 44 69 73 6b 5b 69 64 78  age->u.aDisk[idx
17730 5d 3b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  ];.    int sz = 
17740 63 65 6c 6c 53 69 7a 65 28 70 42 74 2c 20 70 43  cellSize(pBt, pC
17750 65 6c 6c 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  ell);.    sprint
17760 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22  f(range,"%d..%d"
17770 2c 20 69 64 78 2c 20 69 64 78 2b 73 7a 2d 31 29  , idx, idx+sz-1)
17780 3b 0a 20 20 20 20 73 7a 20 3d 20 4e 4b 45 59 28  ;.    sz = NKEY(
17790 70 42 74 2c 20 70 43 65 6c 6c 2d 3e 68 29 20 2b  pBt, pCell->h) +
177a0 20 4e 44 41 54 41 28 70 42 74 2c 20 70 43 65 6c   NDATA(pBt, pCel
177b0 6c 2d 3e 68 29 3b 0a 20 20 20 20 69 66 28 20 73  l->h);.    if( s
177c0 7a 3e 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64  z>sizeof(payload
177d0 29 2d 31 20 29 20 73 7a 20 3d 20 73 69 7a 65 6f  )-1 ) sz = sizeo
177e0 66 28 70 61 79 6c 6f 61 64 29 2d 31 3b 0a 20 20  f(payload)-1;.  
177f0 20 20 6d 65 6d 63 70 79 28 70 61 79 6c 6f 61 64    memcpy(payload
17800 2c 20 70 43 65 6c 6c 2d 3e 61 50 61 79 6c 6f 61  , pCell->aPayloa
17810 64 2c 20 73 7a 29 3b 0a 20 20 20 20 66 6f 72 28  d, sz);.    for(
17820 6a 3d 30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b  j=0; j<sz; j++){
17830 0a 20 20 20 20 20 20 69 66 28 20 70 61 79 6c 6f  .      if( paylo
17840 61 64 5b 6a 5d 3c 30 78 32 30 20 7c 7c 20 70 61  ad[j]<0x20 || pa
17850 79 6c 6f 61 64 5b 6a 5d 3e 30 78 37 66 20 29 20  yload[j]>0x7f ) 
17860 70 61 79 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27  payload[j] = '.'
17870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 79 6c  ;.    }.    payl
17880 6f 61 64 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20  oad[sz] = 0;.   
17890 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22   printf(.      "
178a0 63 65 6c 6c 20 25 32 64 3a 20 69 3d 25 2d 31 30  cell %2d: i=%-10
178b0 73 20 63 68 6c 64 3d 25 2d 34 64 20 6e 6b 3d 25  s chld=%-4d nk=%
178c0 2d 34 64 20 6e 64 3d 25 2d 34 64 20 70 61 79 6c  -4d nd=%-4d payl
178d0 6f 61 64 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20  oad=%s\n",.     
178e0 20 69 2c 20 72 61 6e 67 65 2c 20 28 69 6e 74 29   i, range, (int)
178f0 70 43 65 6c 6c 2d 3e 68 2e 6c 65 66 74 43 68 69  pCell->h.leftChi
17900 6c 64 2c 20 0a 20 20 20 20 20 20 4e 4b 45 59 28  ld, .      NKEY(
17910 70 42 74 2c 20 70 43 65 6c 6c 2d 3e 68 29 2c 20  pBt, pCell->h), 
17920 4e 44 41 54 41 28 70 42 74 2c 20 70 43 65 6c 6c  NDATA(pBt, pCell
17930 2d 3e 68 29 2c 0a 20 20 20 20 20 20 70 61 79 6c  ->h),.      payl
17940 6f 61 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  oad.    );.    i
17950 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
17960 20 26 26 20 70 50 61 67 65 2d 3e 61 70 43 65 6c   && pPage->apCel
17970 6c 5b 69 5d 21 3d 70 43 65 6c 6c 20 29 7b 0a 20  l[i]!=pCell ){. 
17980 20 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a       printf("***
17990 2a 20 61 70 43 65 6c 6c 5b 25 64 5d 20 64 6f 65  * apCell[%d] doe
179a0 73 20 6e 6f 74 20 6d 61 74 63 68 20 6f 6e 20 70  s not match on p
179b0 72 69 6f 72 20 65 6e 74 72 79 20 2a 2a 2a 2a 5c  rior entry ****\
179c0 6e 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  n", i);.    }.  
179d0 20 20 69 2b 2b 3b 0a 20 20 20 20 69 64 78 20 3d    i++;.    idx =
179e0 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 43 65   SWAB16(pBt, pCe
179f0 6c 6c 2d 3e 68 2e 69 4e 65 78 74 29 3b 0a 20 20  ll->h.iNext);.  
17a00 7d 0a 20 20 69 66 28 20 69 64 78 21 3d 30 20 29  }.  if( idx!=0 )
17a10 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 45 52  {.    printf("ER
17a20 52 4f 52 3a 20 6e 65 78 74 20 63 65 6c 6c 20 69  ROR: next cell i
17a30 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndex out of rang
17a40 65 3a 20 25 64 5c 6e 22 2c 20 69 64 78 29 3b 0a  e: %d\n", idx);.
17a50 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 72 69    }.  printf("ri
17a60 67 68 74 5f 63 68 69 6c 64 3a 20 25 64 5c 6e 22  ght_child: %d\n"
17a70 2c 20 53 57 41 42 33 32 28 70 42 74 2c 20 70 50  , SWAB32(pBt, pP
17a80 61 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67 68 74  age->u.hdr.right
17a90 43 68 69 6c 64 29 29 3b 0a 20 20 6e 46 72 65 65  Child));.  nFree
17aa0 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   = 0;.  i = 0;. 
17ab0 20 69 64 78 20 3d 20 53 57 41 42 31 36 28 70 42   idx = SWAB16(pB
17ac0 74 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e  t, pPage->u.hdr.
17ad0 66 69 72 73 74 46 72 65 65 29 3b 0a 20 20 77 68  firstFree);.  wh
17ae0 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64  ile( idx>0 && id
17af0 78 3c 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  x<SQLITE_PAGE_SI
17b00 5a 45 20 29 7b 0a 20 20 20 20 46 72 65 65 42 6c  ZE ){.    FreeBl
17b10 6b 20 2a 70 20 3d 20 28 46 72 65 65 42 6c 6b 2a  k *p = (FreeBlk*
17b20 29 26 70 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b  )&pPage->u.aDisk
17b30 5b 69 64 78 5d 3b 0a 20 20 20 20 73 70 72 69 6e  [idx];.    sprin
17b40 74 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64  tf(range,"%d..%d
17b50 22 2c 20 69 64 78 2c 20 69 64 78 2b 70 2d 3e 69  ", idx, idx+p->i
17b60 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 6e 46 72  Size-1);.    nFr
17b70 65 65 20 2b 3d 20 53 57 41 42 31 36 28 70 42 74  ee += SWAB16(pBt
17b80 2c 20 70 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 20  , p->iSize);.   
17b90 20 70 72 69 6e 74 66 28 22 66 72 65 65 62 6c 6f   printf("freeblo
17ba0 63 6b 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20  ck %2d: i=%-10s 
17bb0 73 69 7a 65 3d 25 2d 34 64 20 74 6f 74 61 6c 3d  size=%-4d total=
17bc0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
17bd0 20 72 61 6e 67 65 2c 20 53 57 41 42 31 36 28 70   range, SWAB16(p
17be0 42 74 2c 20 70 2d 3e 69 53 69 7a 65 29 2c 20 6e  Bt, p->iSize), n
17bf0 46 72 65 65 29 3b 0a 20 20 20 20 69 64 78 20 3d  Free);.    idx =
17c00 20 53 57 41 42 31 36 28 70 42 74 2c 20 70 2d 3e   SWAB16(pBt, p->
17c10 69 4e 65 78 74 29 3b 0a 20 20 20 20 69 2b 2b 3b  iNext);.    i++;
17c20 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78 21 3d  .  }.  if( idx!=
17c30 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  0 ){.    printf(
17c40 22 45 52 52 4f 52 3a 20 6e 65 78 74 20 66 72 65  "ERROR: next fre
17c50 65 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f 75 74  eblock index out
17c60 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c 6e 22   of range: %d\n"
17c70 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20 69 66  , idx);.  }.  if
17c80 28 20 72 65 63 75 72 73 69 76 65 20 26 26 20 70  ( recursive && p
17c90 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67 68  Page->u.hdr.righ
17ca0 74 43 68 69 6c 64 21 3d 30 20 29 7b 0a 20 20 20  tChild!=0 ){.   
17cb0 20 69 64 78 20 3d 20 53 57 41 42 31 36 28 70 42   idx = SWAB16(pB
17cc0 74 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e  t, pPage->u.hdr.
17cd0 66 69 72 73 74 43 65 6c 6c 29 3b 0a 20 20 20 20  firstCell);.    
17ce0 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20  while( idx>0 && 
17cf0 69 64 78 3c 53 51 4c 49 54 45 5f 50 41 47 45 5f  idx<SQLITE_PAGE_
17d00 53 49 5a 45 2d 4d 49 4e 5f 43 45 4c 4c 5f 53 49  SIZE-MIN_CELL_SI
17d10 5a 45 20 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  ZE ){.      Cell
17d20 20 2a 70 43 65 6c 6c 20 3d 20 28 43 65 6c 6c 2a   *pCell = (Cell*
17d30 29 26 70 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b  )&pPage->u.aDisk
17d40 5b 69 64 78 5d 3b 0a 20 20 20 20 20 20 66 69 6c  [idx];.      fil
17d50 65 42 74 72 65 65 50 61 67 65 44 75 6d 70 28 70  eBtreePageDump(p
17d60 42 74 2c 20 53 57 41 42 33 32 28 70 42 74 2c 20  Bt, SWAB32(pBt, 
17d70 70 43 65 6c 6c 2d 3e 68 2e 6c 65 66 74 43 68 69  pCell->h.leftChi
17d80 6c 64 29 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ld), 1);.      i
17d90 64 78 20 3d 20 53 57 41 42 31 36 28 70 42 74 2c  dx = SWAB16(pBt,
17da0 20 70 43 65 6c 6c 2d 3e 68 2e 69 4e 65 78 74 29   pCell->h.iNext)
17db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65  ;.    }.    file
17dc0 42 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 42  BtreePageDump(pB
17dd0 74 2c 20 53 57 41 42 33 32 28 70 42 74 2c 20 70  t, SWAB32(pBt, p
17de0 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67 68  Page->u.hdr.righ
17df0 74 43 68 69 6c 64 29 2c 20 31 29 3b 0a 20 20 7d  tChild), 1);.  }
17e00 0a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75  .  sqlitepager_u
17e10 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72  nref(pPage);.  r
17e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17e30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
17e40 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
17e50 0a 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c 74  .** Fill aResult
17e60 5b 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74  [] with informat
17e70 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 65 6e  ion about the en
17e80 74 72 79 20 61 6e 64 20 70 61 67 65 20 74 68 61  try and page tha
17e90 74 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  t the.** cursor 
17ea0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  is pointing to..
17eb0 2a 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  ** .**   aResult
17ec0 5b 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65 20  [0] =  The page 
17ed0 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73  number.**   aRes
17ee0 75 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e  ult[1] =  The en
17ef0 74 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  try number.**   
17f00 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f  aResult[2] =  To
17f10 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  tal number of en
17f20 74 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61  tries on this pa
17f30 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  ge.**   aResult[
17f40 33 5d 20 3d 20 20 53 69 7a 65 20 6f 66 20 74 68  3] =  Size of th
17f50 69 73 20 65 6e 74 72 79 0a 2a 2a 20 20 20 61 52  is entry.**   aR
17f60 65 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62  esult[4] =  Numb
17f70 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
17f80 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a   on this page.**
17f90 20 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20     aResult[5] = 
17fa0 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   Number of free 
17fb0 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70 61  blocks on the pa
17fc0 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  ge.**   aResult[
17fd0 36 5d 20 3d 20 20 50 61 67 65 20 6e 75 6d 62 65  6] =  Page numbe
17fe0 72 20 6f 66 20 74 68 65 20 6c 65 66 74 20 63 68  r of the left ch
17ff0 69 6c 64 20 6f 66 20 74 68 69 73 20 65 6e 74 72  ild of this entr
18000 79 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 37  y.**   aResult[7
18010 5d 20 3d 20 20 50 61 67 65 20 6e 75 6d 62 65 72  ] =  Page number
18020 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 63 68   of the right ch
18030 69 6c 64 20 66 6f 72 20 74 68 65 20 77 68 6f 6c  ild for the whol
18040 65 20 70 61 67 65 0a 2a 2a 0a 2a 2a 20 54 68 69  e page.**.** Thi
18050 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
18060 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
18070 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
18080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18090 66 69 6c 65 42 74 72 65 65 43 75 72 73 6f 72 44  fileBtreeCursorD
180a0 75 6d 70 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ump(BtCursor *pC
180b0 75 72 2c 20 69 6e 74 20 2a 61 52 65 73 75 6c 74  ur, int *aResult
180c0 29 7b 0a 20 20 69 6e 74 20 63 6e 74 2c 20 69 64  ){.  int cnt, id
180d0 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
180e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
180f0 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  e;.  Btree *pBt 
18100 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 61  = pCur->pBt;.  a
18110 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69  Result[0] = sqli
18120 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  tepager_pagenumb
18130 65 72 28 70 50 61 67 65 29 3b 0a 20 20 61 52 65  er(pPage);.  aRe
18140 73 75 6c 74 5b 31 5d 20 3d 20 70 43 75 72 2d 3e  sult[1] = pCur->
18150 69 64 78 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32  idx;.  aResult[2
18160 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
18170 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64  ;.  if( pCur->id
18180 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
18190 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
181a0 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33 5d  {.    aResult[3]
181b0 20 3d 20 63 65 6c 6c 53 69 7a 65 28 70 42 74 2c   = cellSize(pBt,
181c0 20 70 50 61 67 65 2d 3e 61 70 43 65 6c 6c 5b 70   pPage->apCell[p
181d0 43 75 72 2d 3e 69 64 78 5d 29 3b 0a 20 20 20 20  Cur->idx]);.    
181e0 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 53 57 41  aResult[6] = SWA
181f0 42 33 32 28 70 42 74 2c 20 70 50 61 67 65 2d 3e  B32(pBt, pPage->
18200 61 70 43 65 6c 6c 5b 70 43 75 72 2d 3e 69 64 78  apCell[pCur->idx
18210 5d 2d 3e 68 2e 6c 65 66 74 43 68 69 6c 64 29 3b  ]->h.leftChild);
18220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52  .  }else{.    aR
18230 65 73 75 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20  esult[3] = 0;.  
18240 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30    aResult[6] = 0
18250 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b  ;.  }.  aResult[
18260 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65  4] = pPage->nFre
18270 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  e;.  cnt = 0;.  
18280 69 64 78 20 3d 20 53 57 41 42 31 36 28 70 42 74  idx = SWAB16(pBt
18290 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 66  , pPage->u.hdr.f
182a0 69 72 73 74 46 72 65 65 29 3b 0a 20 20 77 68 69  irstFree);.  whi
182b0 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78  le( idx>0 && idx
182c0 3c 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  <SQLITE_PAGE_SIZ
182d0 45 20 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a  E ){.    cnt++;.
182e0 20 20 20 20 69 64 78 20 3d 20 53 57 41 42 31 36      idx = SWAB16
182f0 28 70 42 74 2c 20 28 28 46 72 65 65 42 6c 6b 2a  (pBt, ((FreeBlk*
18300 29 26 70 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b  )&pPage->u.aDisk
18310 5b 69 64 78 5d 29 2d 3e 69 4e 65 78 74 29 3b 0a  [idx])->iNext);.
18320 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b 35 5d    }.  aResult[5]
18330 20 3d 20 63 6e 74 3b 0a 20 20 61 52 65 73 75 6c   = cnt;.  aResul
18340 74 5b 37 5d 20 3d 20 53 57 41 42 33 32 28 70 42  t[7] = SWAB32(pB
18350 74 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e  t, pPage->u.hdr.
18360 72 69 67 68 74 43 68 69 6c 64 29 3b 0a 20 20 72  rightChild);.  r
18370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18380 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
18390 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
183a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
183b0 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
183c0 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54  with a BTree.  T
183d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
183e0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
183f0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
18400 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
18410 20 50 61 67 65 72 20 2a 66 69 6c 65 42 74 72 65   Pager *fileBtre
18420 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 42  ePager(Btree *pB
18430 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
18440 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 23 65 6e 64  ->pPager;.}.#end
18450 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  if../*.** This s
18460 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73  tructure is pass
18470 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75 67  ed around throug
18480 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74 79  h all the sanity
18490 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e   checking routin
184a0 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  es.** in order t
184b0 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  o keep track of 
184c0 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61 74  some global stat
184d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  e information..*
184e0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
184f0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e 74   IntegrityCk Int
18500 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63 74  egrityCk;.struct
18510 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a 20   IntegrityCk {. 
18520 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20   Btree *pBt;    
18530 2f 2a 20 54 68 65 20 74 72 65 65 20 62 65 69 6e  /* The tree bein
18540 67 20 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f  g checked out */
18550 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
18560 3b 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61  ; /* The associa
18570 74 65 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f  ted pager.  Also
18580 20 61 63 63 65 73 73 69 62 6c 65 20 62 79 20 70   accessible by p
18590 42 74 2d 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20  Bt->pPager */.  
185a0 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 2f  int nPage;     /
185b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
185c0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
185d0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65  e */.  int *anRe
185e0 66 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  f;    /* Number 
185f0 6f 66 20 74 69 6d 65 73 20 65 61 63 68 20 70 61  of times each pa
18600 67 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  ge is referenced
18610 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 65 65 50   */.  int nTreeP
18620 61 67 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  age; /* Number o
18630 66 20 42 54 72 65 65 20 70 61 67 65 73 20 2a 2f  f BTree pages */
18640 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
18650 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
18660 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 74 6f  ytes of data sto
18670 72 65 64 20 6f 6e 20 42 54 72 65 65 20 70 61 67  red on BTree pag
18680 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  es */.  char *zE
18690 72 72 4d 73 67 3b 20 2f 2a 20 41 6e 20 65 72 72  rrMsg; /* An err
186a0 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c  or message.  NUL
186b0 4c 20 6f 66 20 6e 6f 20 65 72 72 6f 72 73 20 73  L of no errors s
186c0 65 65 6e 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  een. */.};../*.*
186d0 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
186e0 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
186f0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
18700 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
18710 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 49 6e  heckAppendMsg(In
18720 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
18730 6b 2c 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 20  k, char *zMsg1, 
18740 63 68 61 72 20 2a 7a 4d 73 67 32 29 7b 0a 20 20  char *zMsg2){.  
18750 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  if( pCheck->zErr
18760 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  Msg ){.    char 
18770 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e  *zOld = pCheck->
18780 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68  zErrMsg;.    pCh
18790 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  eck->zErrMsg = 0
187a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
187b0 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a  tring(&pCheck->z
187c0 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c  ErrMsg, zOld, "\
187d0 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32  n", zMsg1, zMsg2
187e0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
187f0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64   sqliteFree(zOld
18800 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18810 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
18820 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67  &pCheck->zErrMsg
18830 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
18840 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 7d  (char*)0);.  }.}
18850 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  ../*.** Add 1 to
18860 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
18870 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
18880 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
18890 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
188a0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
188b0 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
188c0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
188d0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
188e0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
188f0 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
18900 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
18910 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
18920 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
18930 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
18940 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
18950 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
18960 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
18970 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
18980 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
18990 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
189a0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
189b0 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
189c0 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
189d0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
189e0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
189f0 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
18a00 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
18a10 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31  .    char zBuf[1
18a20 30 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  00];.    sprintf
18a30 28 7a 42 75 66 2c 20 22 69 6e 76 61 6c 69 64 20  (zBuf, "invalid 
18a40 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c  page number %d",
18a50 20 69 50 61 67 65 29 3b 0a 20 20 20 20 63 68 65   iPage);.    che
18a60 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
18a70 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 7a 42  ck, zContext, zB
18a80 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  uf);.    return 
18a90 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68  1;.  }.  if( pCh
18aa0 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
18ab0 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  ]==1 ){.    char
18ac0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20   zBuf[100];.    
18ad0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 32  sprintf(zBuf, "2
18ae0 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  nd reference to 
18af0 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
18b00 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  ;.    checkAppen
18b10 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
18b20 6e 74 65 78 74 2c 20 7a 42 75 66 29 3b 0a 20 20  ntext, zBuf);.  
18b30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
18b40 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63    return  (pChec
18b50 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b  k->anRef[iPage]+
18b60 2b 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  +)>1;.}../*.** C
18b70 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
18b80 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
18b90 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72  st or of an over
18ba0 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a  flow page list..
18bb0 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
18bc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18bd0 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69  es on the list i
18be0 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  s N..*/.static v
18bf0 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20  oid checkList(. 
18c00 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
18c10 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72  heck,  /* Integr
18c20 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e  ity checking con
18c30 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  text */.  int is
18c40 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20  FreeList,       
18c50 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72  /* True for a fr
18c60 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66  eelist.  False f
18c70 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
18c80 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
18c90 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
18ca0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
18cb0 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69  for first page i
18cc0 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
18cd0 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
18ce0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
18cf0 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  d number of page
18d00 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  s in the list */
18d10 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  .  char *zContex
18d20 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  t        /* Cont
18d30 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
18d40 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssages */.){.  i
18d50 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 4d 73  nt i;.  char zMs
18d60 67 5b 31 30 30 5d 3b 0a 20 20 77 68 69 6c 65 28  g[100];.  while(
18d70 20 4e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   N-- > 0 ){.    
18d80 4f 76 65 72 66 6c 6f 77 50 61 67 65 20 2a 70 4f  OverflowPage *pO
18d90 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 69 50 61  vfl;.    if( iPa
18da0 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 73 70  ge<1 ){.      sp
18db0 72 69 6e 74 66 28 7a 4d 73 67 2c 20 22 25 64 20  rintf(zMsg, "%d 
18dc0 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72  pages missing fr
18dd0 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  om overflow list
18de0 22 2c 20 4e 2b 31 29 3b 0a 20 20 20 20 20 20 63  ", N+1);.      c
18df0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
18e00 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
18e10 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 62 72 65  zMsg);.      bre
18e20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
18e30 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
18e40 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
18e50 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
18e60 20 69 66 28 20 73 71 6c 69 74 65 70 61 67 65 72   if( sqlitepager
18e70 5f 67 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61  _get(pCheck->pPa
18e80 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  ger, (Pgno)iPage
18e90 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66 6c  , (void**)&pOvfl
18ea0 29 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  ) ){.      sprin
18eb0 74 66 28 7a 4d 73 67 2c 20 22 66 61 69 6c 65 64  tf(zMsg, "failed
18ec0 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22   to get page %d"
18ed0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
18ee0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
18ef0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
18f00 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 62 72   zMsg);.      br
18f10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
18f20 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b  f( isFreeList ){
18f30 0a 20 20 20 20 20 20 46 72 65 65 6c 69 73 74 49  .      FreelistI
18f40 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 28 46 72  nfo *pInfo = (Fr
18f50 65 65 6c 69 73 74 49 6e 66 6f 2a 29 70 4f 76 66  eelistInfo*)pOvf
18f60 6c 2d 3e 61 50 61 79 6c 6f 61 64 3b 0a 20 20 20  l->aPayload;.   
18f70 20 20 20 69 6e 74 20 6e 20 3d 20 53 57 41 42 33     int n = SWAB3
18f80 32 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 70  2(pCheck->pBt, p
18f90 49 6e 66 6f 2d 3e 6e 46 72 65 65 29 3b 0a 20 20  Info->nFree);.  
18fa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18fc0 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
18fd0 20 53 57 41 42 33 32 28 70 43 68 65 63 6b 2d 3e   SWAB32(pCheck->
18fe0 70 42 74 2c 20 70 49 6e 66 6f 2d 3e 61 46 72 65  pBt, pInfo->aFre
18ff0 65 5b 69 5d 29 2c 20 7a 43 6f 6e 74 65 78 74 29  e[i]), zContext)
19000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19010 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  N -= n;.    }.  
19020 20 20 69 50 61 67 65 20 3d 20 53 57 41 42 33 32    iPage = SWAB32
19030 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 70 4f  (pCheck->pBt, pO
19040 76 66 6c 2d 3e 69 4e 65 78 74 29 3b 0a 20 20 20  vfl->iNext);.   
19050 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
19060 65 66 28 70 4f 76 66 6c 29 3b 0a 20 20 7d 0a 7d  ef(pOvfl);.  }.}
19070 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ../*.** Return n
19080 65 67 61 74 69 76 65 20 69 66 20 7a 4b 65 79 31  egative if zKey1
19090 3c 7a 4b 65 79 32 2e 0a 2a 2a 20 52 65 74 75 72  <zKey2..** Retur
190a0 6e 20 7a 65 72 6f 20 69 66 20 7a 4b 65 79 31 3d  n zero if zKey1=
190b0 3d 7a 4b 65 79 32 2e 0a 2a 2a 20 52 65 74 75 72  =zKey2..** Retur
190c0 6e 20 70 6f 73 69 74 69 76 65 20 69 66 20 7a 4b  n positive if zK
190d0 65 79 31 3e 7a 4b 65 79 32 2e 0a 2a 2f 0a 73 74  ey1>zKey2..*/.st
190e0 61 74 69 63 20 69 6e 74 20 6b 65 79 43 6f 6d 70  atic int keyComp
190f0 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  are(.  const cha
19100 72 20 2a 7a 4b 65 79 31 2c 20 69 6e 74 20 6e 4b  r *zKey1, int nK
19110 65 79 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ey1,.  const cha
19120 72 20 2a 7a 4b 65 79 32 2c 20 69 6e 74 20 6e 4b  r *zKey2, int nK
19130 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 6d 69 6e  ey2.){.  int min
19140 20 3d 20 6e 4b 65 79 31 3e 6e 4b 65 79 32 20 3f   = nKey1>nKey2 ?
19150 20 6e 4b 65 79 32 20 3a 20 6e 4b 65 79 31 3b 0a   nKey2 : nKey1;.
19160 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70    int c = memcmp
19170 28 7a 4b 65 79 31 2c 20 7a 4b 65 79 32 2c 20 6d  (zKey1, zKey2, m
19180 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20  in);.  if( c==0 
19190 29 7b 0a 20 20 20 20 63 20 3d 20 6e 4b 65 79 31  ){.    c = nKey1
191a0 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20   - nKey2;.  }.  
191b0 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
191c0 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61  ** Do various sa
191d0 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61  nity checks on a
191e0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
191f0 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a  a tree.  Return.
19200 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74  ** the tree dept
19210 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72  h.  Root pages r
19220 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74  eturn 0.  Parent
19230 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a  s of root pages.
19240 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64  ** return 1, and
19250 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a   so forth..** .*
19260 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61  * These checks a
19270 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  re done:.**.**  
19280 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72      1.  Make sur
19290 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64  e that cells and
192a0 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e   freeblocks do n
192b0 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20  ot overlap.**   
192c0 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69         but combi
192d0 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ne to completely
192e0 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e   cover the page.
192f0 0a 2a 2a 20 20 20 20 20 20 32 2e 20 20 4d 61 6b  .**      2.  Mak
19300 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73  e sure cell keys
19310 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a   are in order..*
19320 2a 20 20 20 20 20 20 33 2e 20 20 4d 61 6b 65 20  *      3.  Make 
19330 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c  sure no key is l
19340 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
19350 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64  l to zLowerBound
19360 2e 0a 2a 2a 20 20 20 20 20 20 34 2e 20 20 4d 61  ..**      4.  Ma
19370 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
19380 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
19390 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65  r equal to zUppe
193a0 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20  rBound..**      
193b0 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e  5.  Check the in
193c0 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66  tegrity of overf
193d0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20  low pages..**   
193e0 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65     6.  Recursive
193f0 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65  ly call checkTre
19400 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69  ePage on all chi
19410 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37  ldren..**      7
19420 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
19430 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20  he depth of all 
19440 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20  children is the 
19450 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e  same..**      8.
19460 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
19470 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73   page is at leas
19480 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c  t 33% full or el
19490 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  se it is.**     
194a0 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66       the root of
194b0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74   the tree..*/.st
194c0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72  atic int checkTr
194d0 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72  eePage(.  Integr
194e0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
194f0 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74  /* Context for t
19500 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20  he sanity check 
19510 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
19520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
19530 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
19540 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a   page to check *
19550 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
19560 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
19570 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68  ent page */.  ch
19580 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
19590 78 74 2c 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt, /* Parent co
195a0 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20  ntext */.  char 
195b0 2a 7a 4c 6f 77 65 72 42 6f 75 6e 64 2c 20 20 20  *zLowerBound,   
195c0 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 73 68 6f   /* All keys sho
195d0 75 6c 64 20 62 65 20 67 72 65 61 74 65 72 20 74  uld be greater t
195e0 68 61 6e 20 74 68 69 73 2c 20 69 66 20 6e 6f 74  han this, if not
195f0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e   NULL */.  int n
19600 4c 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20 20  Lower,          
19610 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
19620 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4c 6f 77  aracters in zLow
19630 65 72 42 6f 75 6e 64 20 2a 2f 0a 20 20 63 68 61  erBound */.  cha
19640 72 20 2a 7a 55 70 70 65 72 42 6f 75 6e 64 2c 20  r *zUpperBound, 
19650 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 73     /* All keys s
19660 68 6f 75 6c 64 20 62 65 20 6c 65 73 73 20 74 68  hould be less th
19670 61 6e 20 74 68 69 73 2c 20 69 66 20 6e 6f 74 20  an this, if not 
19680 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  NULL */.  int nU
19690 70 70 65 72 20 20 20 20 20 20 20 20 20 20 20 20  pper            
196a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
196b0 72 61 63 74 65 72 73 20 69 6e 20 7a 55 70 70 65  racters in zUppe
196c0 72 42 6f 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20 4d  rBound */.){.  M
196d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
196e0 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74   int i, rc, dept
196f0 68 2c 20 64 32 2c 20 70 67 6e 6f 3b 0a 20 20 63  h, d2, pgno;.  c
19700 68 61 72 20 2a 7a 4b 65 79 31 2c 20 2a 7a 4b 65  har *zKey1, *zKe
19710 79 32 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  y2;.  int nKey1,
19720 20 6e 4b 65 79 32 3b 0a 20 20 42 74 43 75 72 73   nKey2;.  BtCurs
19730 6f 72 20 63 75 72 3b 0a 20 20 42 74 72 65 65 20  or cur;.  Btree 
19740 2a 70 42 74 3b 0a 20 20 63 68 61 72 20 7a 4d 73  *pBt;.  char zMs
19750 67 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a  g[100];.  char z
19760 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20  Context[100];.  
19770 63 68 61 72 20 68 69 74 5b 53 51 4c 49 54 45 5f  char hit[SQLITE_
19780 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2f  PAGE_SIZE];..  /
19790 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
197a0 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a   page exists.  *
197b0 2f 0a 20 20 63 75 72 2e 70 42 74 20 3d 20 70 42  /.  cur.pBt = pB
197c0 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b  t = pCheck->pBt;
197d0 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20  .  if( iPage==0 
197e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
197f0 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
19800 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e  k, iPage, zParen
19810 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75  tContext) ) retu
19820 72 6e 20 30 3b 0a 20 20 73 70 72 69 6e 74 66 28  rn 0;.  sprintf(
19830 7a 43 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72  zContext, "On tr
19840 65 65 20 70 61 67 65 20 25 64 3a 20 22 2c 20 69  ee page %d: ", i
19850 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 72 63  Page);.  if( (rc
19860 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67   = sqlitepager_g
19870 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65  et(pCheck->pPage
19880 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  r, (Pgno)iPage, 
19890 28 76 6f 69 64 2a 2a 29 26 70 50 61 67 65 29 29  (void**)&pPage))
198a0 21 3d 30 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  !=0 ){.    sprin
198b0 74 66 28 7a 4d 73 67 2c 20 22 75 6e 61 62 6c 65  tf(zMsg, "unable
198c0 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65   to get the page
198d0 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22  . error code=%d"
198e0 2c 20 72 63 29 3b 0a 20 20 20 20 63 68 65 63 6b  , rc);.    check
198f0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
19900 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 7a 4d 73 67  , zContext, zMsg
19910 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19920 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d  .  }.  if( (rc =
19930 20 69 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70   initPage(pBt, p
19940 50 61 67 65 2c 20 28 50 67 6e 6f 29 69 50 61 67  Page, (Pgno)iPag
19950 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20  e, pParent))!=0 
19960 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
19970 4d 73 67 2c 20 22 69 6e 69 74 50 61 67 65 28 29  Msg, "initPage()
19980 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63   returns error c
19990 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20  ode %d", rc);.  
199a0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
199b0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
199c0 74 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71  t, zMsg);.    sq
199d0 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28  litepager_unref(
199e0 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
199f0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
19a00 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68  Check out all th
19a10 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  e cells..  */.  
19a20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 69 66 28  depth = 0;.  if(
19a30 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 20 29 7b 0a   zLowerBound ){.
19a40 20 20 20 20 7a 4b 65 79 31 20 3d 20 73 71 6c 69      zKey1 = sqli
19a50 74 65 4d 61 6c 6c 6f 63 28 20 6e 4c 6f 77 65 72  teMalloc( nLower
19a60 2b 31 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1 );.    memcpy
19a70 28 7a 4b 65 79 31 2c 20 7a 4c 6f 77 65 72 42 6f  (zKey1, zLowerBo
19a80 75 6e 64 2c 20 6e 4c 6f 77 65 72 29 3b 0a 20 20  und, nLower);.  
19a90 20 20 7a 4b 65 79 31 5b 6e 4c 6f 77 65 72 5d 20    zKey1[nLower] 
19aa0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
19ab0 20 20 7a 4b 65 79 31 20 3d 20 30 3b 0a 20 20 7d    zKey1 = 0;.  }
19ac0 0a 20 20 6e 4b 65 79 31 20 3d 20 6e 4c 6f 77 65  .  nKey1 = nLowe
19ad0 72 3b 0a 20 20 63 75 72 2e 70 50 61 67 65 20 3d  r;.  cur.pPage =
19ae0 20 70 50 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d   pPage;.  for(i=
19af0 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
19b00 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 65 6c  l; i++){.    Cel
19b10 6c 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  l *pCell = pPage
19b20 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  ->apCell[i];.   
19b30 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 2f 2a   int sz;..    /*
19b40 20 43 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f   Check payload o
19b50 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20  verflow pages.  
19b60 20 20 2a 2f 0a 20 20 20 20 6e 4b 65 79 32 20 3d    */.    nKey2 =
19b70 20 4e 4b 45 59 28 70 42 74 2c 20 70 43 65 6c 6c   NKEY(pBt, pCell
19b80 2d 3e 68 29 3b 0a 20 20 20 20 73 7a 20 3d 20 6e  ->h);.    sz = n
19b90 4b 65 79 32 20 2b 20 4e 44 41 54 41 28 70 42 74  Key2 + NDATA(pBt
19ba0 2c 20 70 43 65 6c 6c 2d 3e 68 29 3b 0a 20 20 20  , pCell->h);.   
19bb0 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78   sprintf(zContex
19bc0 74 2c 20 22 4f 6e 20 70 61 67 65 20 25 64 20 63  t, "On page %d c
19bd0 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
19be0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 7a  , i);.    if( sz
19bf0 3e 4d 58 5f 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41  >MX_LOCAL_PAYLOA
19c00 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  D ){.      int n
19c10 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 4d 58 5f  Page = (sz - MX_
19c20 4c 4f 43 41 4c 5f 50 41 59 4c 4f 41 44 20 2b 20  LOCAL_PAYLOAD + 
19c30 4f 56 45 52 46 4c 4f 57 5f 53 49 5a 45 20 2d 20  OVERFLOW_SIZE - 
19c40 31 29 2f 4f 56 45 52 46 4c 4f 57 5f 53 49 5a 45  1)/OVERFLOW_SIZE
19c50 3b 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73  ;.      checkLis
19c60 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 53 57 41  t(pCheck, 0, SWA
19c70 42 33 32 28 70 42 74 2c 20 70 43 65 6c 6c 2d 3e  B32(pBt, pCell->
19c80 6f 76 66 6c 29 2c 20 6e 50 61 67 65 2c 20 7a 43  ovfl), nPage, zC
19c90 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a  ontext);.    }..
19ca0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
19cb0 74 20 6b 65 79 73 20 61 72 65 20 69 6e 20 74 68  t keys are in th
19cc0 65 20 72 69 67 68 74 20 6f 72 64 65 72 0a 20 20  e right order.  
19cd0 20 20 2a 2f 0a 20 20 20 20 63 75 72 2e 69 64 78    */.    cur.idx
19ce0 20 3d 20 69 3b 0a 20 20 20 20 7a 4b 65 79 32 20   = i;.    zKey2 
19cf0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
19d00 77 28 20 6e 4b 65 79 32 2b 31 20 29 3b 0a 20 20  w( nKey2+1 );.  
19d10 20 20 67 65 74 50 61 79 6c 6f 61 64 28 26 63 75    getPayload(&cu
19d20 72 2c 20 30 2c 20 6e 4b 65 79 32 2c 20 7a 4b 65  r, 0, nKey2, zKe
19d30 79 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b 65  y2);.    if( zKe
19d40 79 31 20 26 26 20 6b 65 79 43 6f 6d 70 61 72 65  y1 && keyCompare
19d50 28 7a 4b 65 79 31 2c 20 6e 4b 65 79 31 2c 20 7a  (zKey1, nKey1, z
19d60 4b 65 79 32 2c 20 6e 4b 65 79 32 29 3e 3d 30 20  Key2, nKey2)>=0 
19d70 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
19d80 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
19d90 7a 43 6f 6e 74 65 78 74 2c 20 22 4b 65 79 20 69  zContext, "Key i
19da0 73 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 22 29  s out of order")
19db0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19dc0 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20  Check sanity of 
19dd0 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e  left child page.
19de0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f  .    */.    pgno
19df0 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c 20 70   = SWAB32(pBt, p
19e00 43 65 6c 6c 2d 3e 68 2e 6c 65 66 74 43 68 69 6c  Cell->h.leftChil
19e10 64 29 3b 0a 20 20 20 20 64 32 20 3d 20 63 68 65  d);.    d2 = che
19e20 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
19e30 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20  k, pgno, pPage, 
19e40 7a 43 6f 6e 74 65 78 74 2c 20 7a 4b 65 79 31 2c  zContext, zKey1,
19e50 6e 4b 65 79 31 2c 7a 4b 65 79 32 2c 6e 4b 65 79  nKey1,zKey2,nKey
19e60 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20  2);.    if( i>0 
19e70 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a  && d2!=depth ){.
19e80 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
19e90 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
19ea0 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61  ntext, "Child pa
19eb0 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73  ge depth differs
19ec0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ");.    }.    de
19ed0 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 73 71  pth = d2;.    sq
19ee0 6c 69 74 65 46 72 65 65 28 7a 4b 65 79 31 29 3b  liteFree(zKey1);
19ef0 0a 20 20 20 20 7a 4b 65 79 31 20 3d 20 7a 4b 65  .    zKey1 = zKe
19f00 79 32 3b 0a 20 20 20 20 6e 4b 65 79 31 20 3d 20  y2;.    nKey1 = 
19f10 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 70 67 6e  nKey2;.  }.  pgn
19f20 6f 20 3d 20 53 57 41 42 33 32 28 70 42 74 2c 20  o = SWAB32(pBt, 
19f30 70 50 61 67 65 2d 3e 75 2e 68 64 72 2e 72 69 67  pPage->u.hdr.rig
19f40 68 74 43 68 69 6c 64 29 3b 0a 20 20 73 70 72 69  htChild);.  spri
19f50 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f  ntf(zContext, "O
19f60 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67  n page %d at rig
19f70 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61  ht child: ", iPa
19f80 67 65 29 3b 0a 20 20 63 68 65 63 6b 54 72 65 65  ge);.  checkTree
19f90 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
19fa0 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65  o, pPage, zConte
19fb0 78 74 2c 20 7a 4b 65 79 31 2c 6e 4b 65 79 31 2c  xt, zKey1,nKey1,
19fc0 7a 55 70 70 65 72 42 6f 75 6e 64 2c 6e 55 70 70  zUpperBound,nUpp
19fd0 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  er);.  sqliteFre
19fe0 65 28 7a 4b 65 79 31 29 3b 0a 20 0a 20 20 2f 2a  e(zKey1);. .  /*
19ff0 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c   Check for compl
1a000 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20  ete coverage of 
1a010 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  the page.  */.  
1a020 6d 65 6d 73 65 74 28 68 69 74 2c 20 30 2c 20 73  memset(hit, 0, s
1a030 69 7a 65 6f 66 28 68 69 74 29 29 3b 0a 20 20 6d  izeof(hit));.  m
1a040 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 73 69  emset(hit, 1, si
1a050 7a 65 6f 66 28 50 61 67 65 48 64 72 29 29 3b 0a  zeof(PageHdr));.
1a060 20 20 66 6f 72 28 69 3d 53 57 41 42 31 36 28 70    for(i=SWAB16(p
1a070 42 74 2c 20 70 50 61 67 65 2d 3e 75 2e 68 64 72  Bt, pPage->u.hdr
1a080 2e 66 69 72 73 74 43 65 6c 6c 29 3b 20 69 3e 30  .firstCell); i>0
1a090 20 26 26 20 69 3c 53 51 4c 49 54 45 5f 50 41 47   && i<SQLITE_PAG
1a0a0 45 5f 53 49 5a 45 3b 20 29 7b 0a 20 20 20 20 43  E_SIZE; ){.    C
1a0b0 65 6c 6c 20 2a 70 43 65 6c 6c 20 3d 20 28 43 65  ell *pCell = (Ce
1a0c0 6c 6c 2a 29 26 70 50 61 67 65 2d 3e 75 2e 61 44  ll*)&pPage->u.aD
1a0d0 69 73 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  isk[i];.    int 
1a0e0 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 63  j;.    for(j=i+c
1a0f0 65 6c 6c 53 69 7a 65 28 70 42 74 2c 20 70 43 65  ellSize(pBt, pCe
1a100 6c 6c 29 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d  ll)-1; j>=i; j--
1a110 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
1a120 69 20 3d 20 53 57 41 42 31 36 28 70 42 74 2c 20  i = SWAB16(pBt, 
1a130 70 43 65 6c 6c 2d 3e 68 2e 69 4e 65 78 74 29 3b  pCell->h.iNext);
1a140 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 53 57 41  .  }.  for(i=SWA
1a150 42 31 36 28 70 42 74 2c 70 50 61 67 65 2d 3e 75  B16(pBt,pPage->u
1a160 2e 68 64 72 2e 66 69 72 73 74 46 72 65 65 29 3b  .hdr.firstFree);
1a170 20 69 3e 30 20 26 26 20 69 3c 53 51 4c 49 54 45   i>0 && i<SQLITE
1a180 5f 50 41 47 45 5f 53 49 5a 45 3b 20 29 7b 0a 20  _PAGE_SIZE; ){. 
1a190 20 20 20 46 72 65 65 42 6c 6b 20 2a 70 46 42 6c     FreeBlk *pFBl
1a1a0 6b 20 3d 20 28 46 72 65 65 42 6c 6b 2a 29 26 70  k = (FreeBlk*)&p
1a1b0 50 61 67 65 2d 3e 75 2e 61 44 69 73 6b 5b 69 5d  Page->u.aDisk[i]
1a1c0 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  ;.    int j;.   
1a1d0 20 66 6f 72 28 6a 3d 69 2b 53 57 41 42 31 36 28   for(j=i+SWAB16(
1a1e0 70 42 74 2c 70 46 42 6c 6b 2d 3e 69 53 69 7a 65  pBt,pFBlk->iSize
1a1f0 29 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20  )-1; j>=i; j--) 
1a200 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 69 20  hit[j]++;.    i 
1a210 3d 20 53 57 41 42 31 36 28 70 42 74 2c 70 46 42  = SWAB16(pBt,pFB
1a220 6c 6b 2d 3e 69 4e 65 78 74 29 3b 0a 20 20 7d 0a  lk->iNext);.  }.
1a230 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c    for(i=0; i<SQL
1a240 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ITE_PAGE_SIZE; i
1a250 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 68 69 74  ++){.    if( hit
1a260 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
1a270 73 70 72 69 6e 74 66 28 7a 4d 73 67 2c 20 22 55  sprintf(zMsg, "U
1a280 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20 62  nused space at b
1a290 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
1a2a0 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
1a2b0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
1a2c0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 4d 73 67  Msg(pCheck, zMsg
1a2d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
1a2e0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1a2f0 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20   hit[i]>1 ){.   
1a300 20 20 20 73 70 72 69 6e 74 66 28 7a 4d 73 67 2c     sprintf(zMsg,
1a310 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20   "Multiple uses 
1a320 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70  for byte %d of p
1a330 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67  age %d", i, iPag
1a340 65 29 3b 0a 20 20 20 20 20 20 63 68 65 63 6b 41  e);.      checkA
1a350 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
1a360 20 7a 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20   zMsg, 0);.     
1a370 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a380 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  }..  /* Check th
1a390 61 74 20 66 72 65 65 20 73 70 61 63 65 20 69 73  at free space is
1a3a0 20 6b 65 70 74 20 74 6f 20 61 20 6d 69 6e 69 6d   kept to a minim
1a3b0 75 6d 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  um.  */.#if 0.  
1a3c0 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
1a3d0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3e 32 20  Parent->nCell>2 
1a3e0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
1a3f0 33 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  3*SQLITE_PAGE_SI
1a400 5a 45 2f 34 20 29 7b 0a 20 20 20 20 73 70 72 69  ZE/4 ){.    spri
1a410 6e 74 66 28 7a 4d 73 67 2c 20 22 66 72 65 65 20  ntf(zMsg, "free 
1a420 73 70 61 63 65 20 28 25 64 29 20 67 72 65 61 74  space (%d) great
1a430 65 72 20 74 68 61 6e 20 6d 61 78 20 28 25 64 29  er than max (%d)
1a440 22 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 2c  ", pPage->nFree,
1a450 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50  .       SQLITE_P
1a460 41 47 45 5f 53 49 5a 45 2f 33 29 3b 0a 20 20 20  AGE_SIZE/3);.   
1a470 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
1a480 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
1a490 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e  , zMsg);.  }.#en
1a4a0 64 69 66 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  dif..  /* Update
1a4b0 20 66 72 65 65 73 70 61 63 65 20 74 6f 74 61 6c   freespace total
1a4c0 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 68 65 63 6b  s..  */.  pCheck
1a4d0 2d 3e 6e 54 72 65 65 50 61 67 65 2b 2b 3b 0a 20  ->nTreePage++;. 
1a4e0 20 70 43 68 65 63 6b 2d 3e 6e 42 79 74 65 20 2b   pCheck->nByte +
1a4f0 3d 20 55 53 41 42 4c 45 5f 53 50 41 43 45 20 2d  = USABLE_SPACE -
1a500 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3b 0a 0a   pPage->nFree;..
1a510 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e    sqlitepager_un
1a520 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65  ref(pPage);.  re
1a530 74 75 72 6e 20 64 65 70 74 68 3b 0a 7d 0a 0a 2f  turn depth;.}../
1a540 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a550 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74  e does a complet
1a560 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67  e check of the g
1a570 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e  iven BTree file.
1a580 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20    aRoot[] is.** 
1a590 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65  an array of page
1a5a0 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65  s numbers were e
1a5b0 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ach page number 
1a5c0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
1a5d0 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20   of.** a table. 
1a5e0 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75   nRoot is the nu
1a5f0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1a600 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  in aRoot..**.** 
1a610 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68  If everything ch
1a620 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72  ecks out, this r
1a630 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
1a640 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69  ULL.  If somethi
1a650 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20  ng is.** amiss, 
1a660 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1a670 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1a680 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
1a690 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a   from malloc().*
1a6a0 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  * and a pointer 
1a6b0 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65  to that error me
1a6c0 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65  ssage is returne
1a6d0 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  d.  The calling 
1a6e0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
1a6f0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
1a700 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72  reeing the error
1a710 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74   message when it
1a720 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61   is done..*/.cha
1a730 72 20 2a 66 69 6c 65 42 74 72 65 65 49 6e 74 65  r *fileBtreeInte
1a740 67 72 69 74 79 43 68 65 63 6b 28 42 74 72 65 65  grityCheck(Btree
1a750 20 2a 70 42 74 2c 20 69 6e 74 20 2a 61 52 6f 6f   *pBt, int *aRoo
1a760 74 2c 20 69 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20  t, int nRoot){. 
1a770 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52   int i;.  int nR
1a780 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ef;.  IntegrityC
1a790 6b 20 73 43 68 65 63 6b 3b 0a 0a 20 20 6e 52 65  k sCheck;..  nRe
1a7a0 66 20 3d 20 2a 73 71 6c 69 74 65 70 61 67 65 72  f = *sqlitepager
1a7b0 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61 67  _stats(pBt->pPag
1a7c0 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
1a7d0 74 72 65 65 28 70 42 74 29 21 3d 53 51 4c 49 54  tree(pBt)!=SQLIT
1a7e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1a7f0 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75 70 28  rn sqliteStrDup(
1a800 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69  "Unable to acqui
1a810 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  re a read lock o
1a820 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29  n the database")
1a830 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70  ;.  }.  sCheck.p
1a840 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65  Bt = pBt;.  sChe
1a850 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d  ck.pPager = pBt-
1a860 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63  >pPager;.  sChec
1a870 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65  k.nPage = sqlite
1a880 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
1a890 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a  sCheck.pPager);.
1a8a0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61    if( sCheck.nPa
1a8b0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c  ge==0 ){.    unl
1a8c0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1a8d0 28 70 42 74 29 3b 0a 20 20 20 20 72 65 74 75 72  (pBt);.    retur
1a8e0 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  n 0;.  }.  sChec
1a8f0 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  k.anRef = sqlite
1a900 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43 68 65  MallocRaw( (sChe
1a910 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
1a920 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
1a930 30 5d 29 20 29 3b 0a 20 20 73 43 68 65 63 6b 2e  0]) );.  sCheck.
1a940 61 6e 52 65 66 5b 31 5d 20 3d 20 31 3b 0a 20 20  anRef[1] = 1;.  
1a950 66 6f 72 28 69 3d 32 3b 20 69 3c 3d 73 43 68 65  for(i=2; i<=sChe
1a960 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
1a970 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
1a980 3d 20 30 3b 20 7d 0a 20 20 73 43 68 65 63 6b 2e  = 0; }.  sCheck.
1a990 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
1a9a0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  /* Check the int
1a9b0 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
1a9c0 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68  eelist.  */.  ch
1a9d0 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c  eckList(&sCheck,
1a9e0 20 31 2c 20 53 57 41 42 33 32 28 70 42 74 2c 20   1, SWAB32(pBt, 
1a9f0 70 42 74 2d 3e 70 61 67 65 31 2d 3e 66 72 65 65  pBt->page1->free
1aa00 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20  List),.         
1aa10 20 20 20 53 57 41 42 33 32 28 70 42 74 2c 20 70     SWAB32(pBt, p
1aa20 42 74 2d 3e 70 61 67 65 31 2d 3e 6e 46 72 65 65  Bt->page1->nFree
1aa30 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73  ), "Main freelis
1aa40 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  t: ");..  /* Che
1aa50 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65  ck all the table
1aa60 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
1aa70 30 3b 20 69 3c 6e 52 6f 6f 74 3b 20 69 2b 2b 29  0; i<nRoot; i++)
1aa80 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b  {.    if( aRoot[
1aa90 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
1aaa0 3b 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  ;.    checkTreeP
1aab0 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  age(&sCheck, aRo
1aac0 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20  ot[i], 0, "List 
1aad0 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22  of tree roots: "
1aae0 2c 20 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a  , 0,0,0,0);.  }.
1aaf0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1ab00 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
1ab10 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65  e file is refere
1ab20 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nced.  */.  for(
1ab30 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=1; i<=sCheck.n
1ab40 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1ab50 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
1ab60 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
1ab70 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1ab80 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
1ab90 75 66 2c 20 22 50 61 67 65 20 25 64 20 69 73 20  uf, "Page %d is 
1aba0 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
1abb0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
1abc0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 7a  ndMsg(&sCheck, z
1abd0 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Buf, 0);.    }. 
1abe0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
1abf0 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  re this analysis
1ac00 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61   did not leave a
1ac10 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73  ny unref() pages
1ac20 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74  .  */.  unlockBt
1ac30 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1ac40 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20  ;.  if( nRef != 
1ac50 2a 73 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61  *sqlitepager_sta
1ac60 74 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ts(pBt->pPager) 
1ac70 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
1ac80 5b 31 30 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  [100];.    sprin
1ac90 74 66 28 7a 42 75 66 2c 20 0a 20 20 20 20 20 20  tf(zBuf, .      
1aca0 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67  "Outstanding pag
1acb0 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f  e count goes fro
1acc0 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e  m %d to %d durin
1acd0 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22  g this analysis"
1ace0 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 2a 73  ,.      nRef, *s
1acf0 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74 73  qlitepager_stats
1ad00 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20  (pBt->pPager).  
1ad10 20 20 29 3b 0a 20 20 20 20 63 68 65 63 6b 41 70    );.    checkAp
1ad20 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
1ad30 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a   zBuf, 0);.  }..
1ad40 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
1ad50 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
1ad60 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  ..  */.  sqliteF
1ad70 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  ree(sCheck.anRef
1ad80 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65  );.  return sChe
1ad90 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f  ck.zErrMsg;.}../
1ada0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1adb0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1adc0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1add0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ade0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
1adf0 68 61 72 20 2a 66 69 6c 65 42 74 72 65 65 47 65  har *fileBtreeGe
1ae00 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20  tFilename(Btree 
1ae10 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
1ae20 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20   pBt->pPager!=0 
1ae30 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1ae40 74 65 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  tepager_filename
1ae50 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  (pBt->pPager);.}
1ae60 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
1ae70 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
1ae80 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74  t of pBtFrom int
1ae90 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e  o pBtTo.  A tran
1aea0 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
1aeb0 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f  be active for bo
1aec0 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  th files..**.** 
1aed0 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65  The size of file
1aee0 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65 20   pBtFrom may be 
1aef0 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73 20  reduced by this 
1af00 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66  operation..** If
1af10 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1af20 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61  rong, the transa
1af30 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d  ction on pBtFrom
1af40 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1af50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1af60 69 6c 65 42 74 72 65 65 43 6f 70 79 46 69 6c 65  ileBtreeCopyFile
1af70 28 42 74 72 65 65 20 2a 70 42 74 54 6f 2c 20 42  (Btree *pBtTo, B
1af80 74 72 65 65 20 2a 70 42 74 46 72 6f 6d 29 7b 0a  tree *pBtFrom){.
1af90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1afa0 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20  E_OK;.  Pgno i, 
1afb0 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67 65 3b 0a  nPage, nToPage;.
1afc0 0a 20 20 69 66 28 20 21 70 42 74 54 6f 2d 3e 69  .  if( !pBtTo->i
1afd0 6e 54 72 61 6e 73 20 7c 7c 20 21 70 42 74 46 72  nTrans || !pBtFr
1afe0 6f 6d 2d 3e 69 6e 54 72 61 6e 73 20 29 20 72 65  om->inTrans ) re
1aff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b000 52 3b 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e  R;.  if( pBtTo->
1b010 6e 65 65 64 53 77 61 62 21 3d 70 42 74 46 72 6f  needSwab!=pBtFro
1b020 6d 2d 3e 6e 65 65 64 53 77 61 62 20 29 20 72 65  m->needSwab ) re
1b030 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b040 52 3b 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e  R;.  if( pBtTo->
1b050 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  pCursor ) return
1b060 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1b070 6d 65 6d 63 70 79 28 70 42 74 54 6f 2d 3e 70 61  memcpy(pBtTo->pa
1b080 67 65 31 2c 20 70 42 74 46 72 6f 6d 2d 3e 70 61  ge1, pBtFrom->pa
1b090 67 65 31 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ge1, SQLITE_PAGE
1b0a0 5f 53 49 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73  _SIZE);.  rc = s
1b0b0 71 6c 69 74 65 70 61 67 65 72 5f 6f 76 65 72 77  qlitepager_overw
1b0c0 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  rite(pBtTo->pPag
1b0d0 65 72 2c 20 31 2c 20 70 42 74 46 72 6f 6d 2d 3e  er, 1, pBtFrom->
1b0e0 70 61 67 65 31 29 3b 0a 20 20 6e 54 6f 50 61 67  page1);.  nToPag
1b0f0 65 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  e = sqlitepager_
1b100 70 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d  pagecount(pBtTo-
1b110 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67  >pPager);.  nPag
1b120 65 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  e = sqlitepager_
1b130 70 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f  pagecount(pBtFro
1b140 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 66 6f  m->pPager);.  fo
1b150 72 28 69 3d 32 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=2; rc==SQLIT
1b160 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65  E_OK && i<=nPage
1b170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64  ; i++){.    void
1b180 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 72 63 20   *pPage;.    rc 
1b190 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65  = sqlitepager_ge
1b1a0 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
1b1b0 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
1b1c0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
1b1d0 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
1b1e0 74 65 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  tepager_overwrit
1b1f0 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  e(pBtTo->pPager,
1b200 20 69 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20   i, pPage);.    
1b210 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
1b220 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
1b230 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
1b240 7d 0a 20 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b  }.  for(i=nPage+
1b250 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
1b260 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20   && i<=nToPage; 
1b270 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  i++){.    void *
1b280 70 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20  pPage;.    rc = 
1b290 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28  sqlitepager_get(
1b2a0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69  pBtTo->pPager, i
1b2b0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 69  , &pPage);.    i
1b2c0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
1b2d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
1b2e0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1b2f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67 65  ;.    sqlitepage
1b300 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1b310 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
1b320 64 6f 6e 74 5f 77 72 69 74 65 28 70 42 74 54 6f  dont_write(pBtTo
1b330 2d 3e 70 50 61 67 65 72 2c 20 69 29 3b 0a 20 20  ->pPager, i);.  
1b340 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20 6e  }.  if( !rc && n
1b350 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a  Page<nToPage ){.
1b360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
1b370 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 42  ager_truncate(pB
1b380 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50 61  tTo->pPager, nPa
1b390 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
1b3a0 63 20 29 7b 0a 20 20 20 20 66 69 6c 65 42 74 72  c ){.    fileBtr
1b3b0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 42 74 54 6f  eeRollback(pBtTo
1b3c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b3d0 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rc;  .}../*.** T
1b3e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
1b3f0 6c 65 73 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  les contain poin
1b400 74 65 72 73 20 74 6f 20 61 6c 6c 20 6f 66 20 74  ters to all of t
1b410 68 65 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 20  he interface.** 
1b420 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 69  routines for thi
1b430 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
1b440 20 6f 66 20 74 68 65 20 42 2a 54 72 65 65 20 62   of the B*Tree b
1b450 61 63 6b 65 6e 64 2e 20 20 54 6f 0a 2a 2a 20 73  ackend.  To.** s
1b460 75 62 73 74 69 74 75 74 65 20 61 20 64 69 66 66  ubstitute a diff
1b470 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 69  erent implementi
1b480 6f 6e 20 6f 66 20 74 68 65 20 62 61 63 6b 65 6e  on of the backen
1b490 64 2c 20 6f 6e 65 20 68 61 73 20 6d 65 72 65 6c  d, one has merel
1b4a0 79 0a 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20  y.** to provide 
1b4b0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 74 65  pointers to alte
1b4c0 72 6e 61 74 69 76 65 20 66 75 6e 63 74 69 6f 6e  rnative function
1b4d0 73 20 69 6e 20 73 69 6d 69 6c 61 72 20 74 61 62  s in similar tab
1b4e0 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  les..*/.static B
1b4f0 74 4f 70 73 20 73 71 6c 69 74 65 42 74 72 65 65  tOps sqliteBtree
1b500 4f 70 73 20 3d 20 7b 0a 20 20 20 20 66 69 6c 65  Ops = {.    file
1b510 42 74 72 65 65 43 6c 6f 73 65 2c 0a 20 20 20 20  BtreeClose,.    
1b520 66 69 6c 65 42 74 72 65 65 53 65 74 43 61 63 68  fileBtreeSetCach
1b530 65 53 69 7a 65 2c 0a 20 20 20 20 66 69 6c 65 42  eSize,.    fileB
1b540 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
1b550 65 6c 2c 0a 20 20 20 20 66 69 6c 65 42 74 72 65  el,.    fileBtre
1b560 65 42 65 67 69 6e 54 72 61 6e 73 2c 0a 20 20 20  eBeginTrans,.   
1b570 20 66 69 6c 65 42 74 72 65 65 43 6f 6d 6d 69 74   fileBtreeCommit
1b580 2c 0a 20 20 20 20 66 69 6c 65 42 74 72 65 65 52  ,.    fileBtreeR
1b590 6f 6c 6c 62 61 63 6b 2c 0a 20 20 20 20 66 69 6c  ollback,.    fil
1b5a0 65 42 74 72 65 65 42 65 67 69 6e 43 6b 70 74 2c  eBtreeBeginCkpt,
1b5b0 0a 20 20 20 20 66 69 6c 65 42 74 72 65 65 43 6f  .    fileBtreeCo
1b5c0 6d 6d 69 74 43 6b 70 74 2c 0a 20 20 20 20 66 69  mmitCkpt,.    fi
1b5d0 6c 65 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 43  leBtreeRollbackC
1b5e0 6b 70 74 2c 0a 20 20 20 20 66 69 6c 65 42 74 72  kpt,.    fileBtr
1b5f0 65 65 43 72 65 61 74 65 54 61 62 6c 65 2c 0a 20  eeCreateTable,. 
1b600 20 20 20 66 69 6c 65 42 74 72 65 65 43 72 65 61     fileBtreeCrea
1b610 74 65 54 61 62 6c 65 2c 20 20 2f 2a 20 52 65 61  teTable,  /* Rea
1b620 6c 6c 79 20 73 71 6c 69 74 65 42 74 72 65 65 43  lly sqliteBtreeC
1b630 72 65 61 74 65 49 6e 64 65 78 28 29 20 2a 2f 0a  reateIndex() */.
1b640 20 20 20 20 66 69 6c 65 42 74 72 65 65 44 72 6f      fileBtreeDro
1b650 70 54 61 62 6c 65 2c 0a 20 20 20 20 66 69 6c 65  pTable,.    file
1b660 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 2c  BtreeClearTable,
1b670 0a 20 20 20 20 66 69 6c 65 42 74 72 65 65 43 75  .    fileBtreeCu
1b680 72 73 6f 72 2c 0a 20 20 20 20 66 69 6c 65 42 74  rsor,.    fileBt
1b690 72 65 65 47 65 74 4d 65 74 61 2c 0a 20 20 20 20  reeGetMeta,.    
1b6a0 66 69 6c 65 42 74 72 65 65 55 70 64 61 74 65 4d  fileBtreeUpdateM
1b6b0 65 74 61 2c 0a 20 20 20 20 66 69 6c 65 42 74 72  eta,.    fileBtr
1b6c0 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  eeIntegrityCheck
1b6d0 2c 0a 20 20 20 20 66 69 6c 65 42 74 72 65 65 47  ,.    fileBtreeG
1b6e0 65 74 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  etFilename,.    
1b6f0 66 69 6c 65 42 74 72 65 65 43 6f 70 79 46 69 6c  fileBtreeCopyFil
1b700 65 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e,.#ifdef SQLITE
1b710 5f 54 45 53 54 0a 20 20 20 20 66 69 6c 65 42 74  _TEST.    fileBt
1b720 72 65 65 50 61 67 65 44 75 6d 70 2c 0a 20 20 20  reePageDump,.   
1b730 20 66 69 6c 65 42 74 72 65 65 50 61 67 65 72 0a   fileBtreePager.
1b740 23 65 6e 64 69 66 0a 7d 3b 0a 73 74 61 74 69 63  #endif.};.static
1b750 20 42 74 43 75 72 73 6f 72 4f 70 73 20 73 71 6c   BtCursorOps sql
1b760 69 74 65 42 74 72 65 65 43 75 72 73 6f 72 4f 70  iteBtreeCursorOp
1b770 73 20 3d 20 7b 0a 20 20 20 20 66 69 6c 65 42 74  s = {.    fileBt
1b780 72 65 65 4d 6f 76 65 74 6f 2c 0a 20 20 20 20 66  reeMoveto,.    f
1b790 69 6c 65 42 74 72 65 65 44 65 6c 65 74 65 2c 0a  ileBtreeDelete,.
1b7a0 20 20 20 20 66 69 6c 65 42 74 72 65 65 49 6e 73      fileBtreeIns
1b7b0 65 72 74 2c 0a 20 20 20 20 66 69 6c 65 42 74 72  ert,.    fileBtr
1b7c0 65 65 46 69 72 73 74 2c 0a 20 20 20 20 66 69 6c  eeFirst,.    fil
1b7d0 65 42 74 72 65 65 4c 61 73 74 2c 0a 20 20 20 20  eBtreeLast,.    
1b7e0 66 69 6c 65 42 74 72 65 65 4e 65 78 74 2c 0a 20  fileBtreeNext,. 
1b7f0 20 20 20 66 69 6c 65 42 74 72 65 65 50 72 65 76     fileBtreePrev
1b800 69 6f 75 73 2c 0a 20 20 20 20 66 69 6c 65 42 74  ious,.    fileBt
1b810 72 65 65 4b 65 79 53 69 7a 65 2c 0a 20 20 20 20  reeKeySize,.    
1b820 66 69 6c 65 42 74 72 65 65 4b 65 79 2c 0a 20 20  fileBtreeKey,.  
1b830 20 20 66 69 6c 65 42 74 72 65 65 4b 65 79 43 6f    fileBtreeKeyCo
1b840 6d 70 61 72 65 2c 0a 20 20 20 20 66 69 6c 65 42  mpare,.    fileB
1b850 74 72 65 65 44 61 74 61 53 69 7a 65 2c 0a 20 20  treeDataSize,.  
1b860 20 20 66 69 6c 65 42 74 72 65 65 44 61 74 61 2c    fileBtreeData,
1b870 0a 20 20 20 20 66 69 6c 65 42 74 72 65 65 43 6c  .    fileBtreeCl
1b880 6f 73 65 43 75 72 73 6f 72 2c 0a 23 69 66 64 65  oseCursor,.#ifde
1b890 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1b8a0 20 20 66 69 6c 65 42 74 72 65 65 43 75 72 73 6f    fileBtreeCurso
1b8b0 72 44 75 6d 70 2c 0a 23 65 6e 64 69 66 0a 7d 3b  rDump,.#endif.};
1b8c0 0a                                               .