System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 6d50e86545667d9ff5825ddcb3c5ddaf6862805b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 31 35 20 32 30 30 36 2f 30 31  c,v 1.15 2006/01
0190: 2f 31 31 20 30 33 3a 32 32 3a 32 39 20 72 6d 73  /11 03:22:29 rms
01a0: 69 6d 70 73 6f 6e 20 45 78 70 20 24 0a 2a 2a 0a  impson Exp $.**.
01b0: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70  ** This file imp
01c0: 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e  lements a extern
01d0: 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20  al (disk-based) 
01e0: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 42  database using B
01f0: 54 72 65 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 20  Trees..** For a 
0200: 64 65 74 61 69 6c 65 64 20 64 69 73 63 75 73 73  detailed discuss
0210: 69 6f 6e 20 6f 66 20 42 54 72 65 65 73 2c 20 72  ion of BTrees, r
0220: 65 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20  efer to.**.**   
0230: 20 20 44 6f 6e 61 6c 64 20 45 2e 20 4b 6e 75 74    Donald E. Knut
0240: 68 2c 20 54 48 45 20 41 52 54 20 4f 46 20 43 4f  h, THE ART OF CO
0250: 4d 50 55 54 45 52 20 50 52 4f 47 52 41 4d 4d 49  MPUTER PROGRAMMI
0260: 4e 47 2c 20 56 6f 6c 75 6d 65 20 33 3a 0a 2a 2a  NG, Volume 3:.**
0270: 20 20 20 20 20 22 53 6f 72 74 69 6e 67 20 41 6e       "Sorting An
0280: 64 20 53 65 61 72 63 68 69 6e 67 22 2c 20 70 61  d Searching", pa
0290: 67 65 73 20 34 37 33 2d 34 38 30 2e 20 41 64 64  ges 473-480. Add
02a0: 69 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a 2a 20 20  ison-Wesley.**  
02b0: 20 20 20 50 75 62 6c 69 73 68 69 6e 67 20 43 6f     Publishing Co
02c0: 6d 70 61 6e 79 2c 20 52 65 61 64 69 6e 67 2c 20  mpany, Reading, 
02d0: 4d 61 73 73 61 63 68 75 73 65 74 74 73 2e 0a 2a  Massachusetts..*
02e0: 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
02f0: 64 65 61 20 69 73 20 74 68 61 74 20 65 61 63 68  dea is that each
0300: 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
0310: 65 20 63 6f 6e 74 61 69 6e 73 20 4e 20 64 61 74  e contains N dat
0320: 61 62 61 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  abase.** entries
0330: 20 61 6e 64 20 4e 2b 31 20 70 6f 69 6e 74 65 72   and N+1 pointer
0340: 73 20 74 6f 20 73 75 62 70 61 67 65 73 2e 0a 2a  s to subpages..*
0350: 2a 0a 2a 2a 20 20 20 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 2d 0a 2a 2a 20 20 20 7c 20 20  -------.**   |  
03a0: 50 74 72 28 30 29 20 7c 20 4b 65 79 28 30 29 20  Ptr(0) | Key(0) 
03b0: 7c 20 50 74 72 28 31 29 20 7c 20 4b 65 79 28 31  | Ptr(1) | Key(1
03c0: 29 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79 28 4e 29  ) | ... | Key(N)
03d0: 20 7c 20 50 74 72 28 4e 2b 31 29 20 7c 0a 2a 2a   | Ptr(N+1) |.**
03e0: 20 20 20 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 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  ---.**.** All of
0430: 20 74 68 65 20 6b 65 79 73 20 6f 6e 20 74 68 65   the keys on the
0440: 20 70 61 67 65 20 74 68 61 74 20 50 74 72 28 30   page that Ptr(0
0450: 29 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 76 65  ) points to have
0460: 20 76 61 6c 75 65 73 20 6c 65 73 73 0a 2a 2a 20   values less.** 
0470: 74 68 61 6e 20 4b 65 79 28 30 29 2e 20 20 41 6c  than Key(0).  Al
0480: 6c 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e  l of the keys on
0490: 20 70 61 67 65 20 50 74 72 28 31 29 20 61 6e 64   page Ptr(1) and
04a0: 20 69 74 73 20 73 75 62 70 61 67 65 73 20 68 61   its subpages ha
04b0: 76 65 0a 2a 2a 20 76 61 6c 75 65 73 20 67 72 65  ve.** values gre
04c0: 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28 30 29  ater than Key(0)
04d0: 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 4b   and less than K
04e0: 65 79 28 31 29 2e 20 20 41 6c 6c 20 6f 66 20 74  ey(1).  All of t
04f0: 68 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e 20 50 74  he keys.** on Pt
0500: 72 28 4e 2b 31 29 20 61 6e 64 20 69 74 73 20 73  r(N+1) and its s
0510: 75 62 70 61 67 65 73 20 68 61 76 65 20 76 61 6c  ubpages have val
0520: 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ues greater than
0530: 20 4b 65 79 28 4e 29 2e 20 20 41 6e 64 0a 2a 2a   Key(N).  And.**
0540: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
0550: 20 46 69 6e 64 69 6e 67 20 61 20 70 61 72 74 69   Finding a parti
0560: 63 75 6c 61 72 20 6b 65 79 20 72 65 71 75 69 72  cular key requir
0570: 65 73 20 72 65 61 64 69 6e 67 20 4f 28 6c 6f 67  es reading O(log
0580: 28 4d 29 29 20 70 61 67 65 73 20 66 72 6f 6d 20  (M)) pages from 
0590: 74 68 65 20 0a 2a 2a 20 64 69 73 6b 20 77 68 65  the .** disk whe
05a0: 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62  re M is the numb
05b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
05c0: 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
05d0: 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65   In this impleme
05e0: 6e 74 61 74 69 6f 6e 2c 20 61 20 73 69 6e 67 6c  ntation, a singl
05f0: 65 20 66 69 6c 65 20 63 61 6e 20 68 6f 6c 64 20  e file can hold 
0600: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  one or more sepa
0610: 72 61 74 65 20 0a 2a 2a 20 42 54 72 65 65 73 2e  rate .** BTrees.
0620: 20 20 45 61 63 68 20 42 54 72 65 65 20 69 73 20    Each BTree is 
0630: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
0640: 65 20 69 6e 64 65 78 20 6f 66 20 69 74 73 20 72  e index of its r
0650: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 0a 2a  oot page.  The.*
0660: 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 66  * key and data f
0670: 6f 72 20 61 6e 79 20 65 6e 74 72 79 20 61 72 65  or any entry are
0680: 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72   combined to for
0690: 6d 20 74 68 65 20 22 70 61 79 6c 6f 61 64 22 2e  m the "payload".
06a0: 20 20 41 0a 2a 2a 20 66 69 78 65 64 20 61 6d 6f    A.** fixed amo
06b0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 63  unt of payload c
06c0: 61 6e 20 62 65 20 63 61 72 72 69 65 64 20 64 69  an be carried di
06d0: 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 64 61  rectly on the da
06e0: 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 2e 20  tabase.** page. 
06f0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
0700: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
0710: 68 65 20 70 72 65 73 65 74 20 61 6d 6f 75 6e 74  he preset amount
0720: 20 74 68 65 6e 20 73 75 72 70 6c 75 73 0a 2a 2a   then surplus.**
0730: 20 62 79 74 65 73 20 61 72 65 20 73 74 6f 72 65   bytes are store
0740: 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  d on overflow pa
0750: 67 65 73 2e 20 20 54 68 65 20 70 61 79 6c 6f 61  ges.  The payloa
0760: 64 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 0a 2a  d for an entry.*
0770: 2a 20 61 6e 64 20 74 68 65 20 70 72 65 63 65 64  * and the preced
0780: 69 6e 67 20 70 6f 69 6e 74 65 72 20 61 72 65 20  ing pointer are 
0790: 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72 6d  combined to form
07a0: 20 61 20 22 43 65 6c 6c 22 2e 20 20 45 61 63 68   a "Cell".  Each
07b0: 20 0a 2a 2a 20 70 61 67 65 20 68 61 73 20 61 20   .** page has a 
07c0: 73 6d 61 6c 6c 20 68 65 61 64 65 72 20 77 68 69  small header whi
07d0: 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ch contains the 
07e0: 50 74 72 28 4e 2b 31 29 20 70 6f 69 6e 74 65 72  Ptr(N+1) pointer
07f0: 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 69 6e   and other.** in
0800: 66 6f 72 6d 61 74 69 6f 6e 20 73 75 63 68 20 61  formation such a
0810: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6b 65  s the size of ke
0820: 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a  y and data..**.*
0830: 2a 20 46 4f 52 4d 41 54 20 44 45 54 41 49 4c 53  * FORMAT DETAILS
0840: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
0850: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
0860: 70 61 67 65 73 2e 20 20 54 68 65 20 66 69 72 73  pages.  The firs
0870: 74 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65 64  t page is called
0880: 20 70 61 67 65 20 31 2c 0a 2a 2a 20 74 68 65 20   page 1,.** the 
0890: 73 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20 32  second is page 2
08a0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
08b0: 20 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   A page number o
08c0: 66 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65 73  f zero indicates
08d0: 0a 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61 67  .** "no such pag
08e0: 65 22 2e 20 20 54 68 65 20 70 61 67 65 20 73 69  e".  The page si
08f0: 7a 65 20 63 61 6e 20 62 65 20 61 6e 79 74 68 69  ze can be anythi
0900: 6e 67 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  ng between 512 a
0910: 6e 64 20 36 35 35 33 36 2e 0a 2a 2a 20 45 61 63  nd 65536..** Eac
0920: 68 20 70 61 67 65 20 63 61 6e 20 62 65 20 65 69  h page can be ei
0930: 74 68 65 72 20 61 20 62 74 72 65 65 20 70 61 67  ther a btree pag
0940: 65 2c 20 61 20 66 72 65 65 6c 69 73 74 20 70 61  e, a freelist pa
0950: 67 65 20 6f 72 20 61 6e 20 6f 76 65 72 66 6c 6f  ge or an overflo
0960: 77 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  w.** page..**.**
0970: 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20   The first page 
0980: 69 73 20 61 6c 77 61 79 73 20 61 20 62 74 72 65  is always a btre
0990: 65 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  e page.  The fir
09a0: 73 74 20 31 30 30 20 62 79 74 65 73 20 6f 66 20  st 100 bytes of 
09b0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61 67  the first.** pag
09c0: 65 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63  e contain a spec
09d0: 69 61 6c 20 68 65 61 64 65 72 20 28 74 68 65 20  ial header (the 
09e0: 22 66 69 6c 65 20 68 65 61 64 65 72 22 29 20 74  "file header") t
09f0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
0a00: 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 66  e file..** The f
0a10: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 66 69 6c  ormat of the fil
0a20: 65 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  e header is as f
0a30: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
0a40: 4f 46 46 53 45 54 20 20 20 53 49 5a 45 20 20 20  OFFSET   SIZE   
0a50: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
0a60: 20 20 20 20 20 30 20 20 20 20 20 20 31 36 20 20       0      16  
0a70: 20 20 20 48 65 61 64 65 72 20 73 74 72 69 6e 67     Header string
0a80: 3a 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74  : "SQLite format
0a90: 20 33 5c 30 30 30 22 0a 2a 2a 20 20 20 20 20 31   3\000".**     1
0aa0: 36 20 20 20 20 20 20 20 32 20 20 20 20 20 50 61  6       2     Pa
0ab0: 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ge size in bytes
0ac0: 2e 20 20 0a 2a 2a 20 20 20 20 20 31 38 20 20 20  .  .**     18   
0ad0: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0ae0: 6f 72 6d 61 74 20 77 72 69 74 65 20 76 65 72 73  ormat write vers
0af0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 31 39 20 20 20  ion.**     19   
0b00: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0b10: 6f 72 6d 61 74 20 72 65 61 64 20 76 65 72 73 69  ormat read versi
0b20: 6f 6e 0a 2a 2a 20 20 20 20 20 32 30 20 20 20 20  on.**     20    
0b30: 20 20 20 31 20 20 20 20 20 42 79 74 65 73 20 6f     1     Bytes o
0b40: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  f unused space a
0b50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
0b60: 68 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 32 31  h page.**     21
0b70: 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 61 78         1     Max
0b80: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
0b90: 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  d fraction.**   
0ba0: 20 20 32 32 20 20 20 20 20 20 20 31 20 20 20 20    22       1    
0bb0: 20 4d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   Min embedded pa
0bc0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0bd0: 2a 20 20 20 20 20 32 33 20 20 20 20 20 20 20 31  *     23       1
0be0: 20 20 20 20 20 4d 69 6e 20 6c 65 61 66 20 70 61       Min leaf pa
0bf0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0c00: 2a 20 20 20 20 20 32 34 20 20 20 20 20 20 20 34  *     24       4
0c10: 20 20 20 20 20 46 69 6c 65 20 63 68 61 6e 67 65       File change
0c20: 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 20 20 20 20   counter.**     
0c30: 32 38 20 20 20 20 20 20 20 34 20 20 20 20 20 52  28       4     R
0c40: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
0c50: 72 65 20 75 73 65 0a 2a 2a 20 20 20 20 20 33 32  re use.**     32
0c60: 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69 72         4     Fir
0c70: 73 74 20 66 72 65 65 6c 69 73 74 20 70 61 67 65  st freelist page
0c80: 0a 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20 20  .**     36      
0c90: 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66   4     Number of
0ca0: 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 20   freelist pages 
0cb0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
0cc0: 20 20 20 34 30 20 20 20 20 20 20 36 30 20 20 20     40      60   
0cd0: 20 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74 61    15 4-byte meta
0ce0: 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20 74   values passed t
0cf0: 6f 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 0a  o higher layers.
0d00: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
0d10: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
0d20: 61 72 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 28  are big-endian (
0d30: 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
0d40: 20 62 79 74 65 20 66 69 72 73 74 29 2e 0a 2a 2a   byte first)..**
0d50: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 63 68 61  .** The file cha
0d60: 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 69  nge counter is i
0d70: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20  ncremented when 
0d80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
0d90: 63 68 61 6e 67 65 64 20 6d 6f 72 65 0a 2a 2a 20  changed more.** 
0da0: 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
0db0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e 64   the same second
0dc0: 2e 20 20 54 68 69 73 20 63 6f 75 6e 74 65 72 2c  .  This counter,
0dd0: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
0de0: 68 65 0a 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  he.** modificati
0df0: 6f 6e 20 74 69 6d 65 20 6f 66 20 74 68 65 20 66  on time of the f
0e00: 69 6c 65 2c 20 61 6c 6c 6f 77 73 20 6f 74 68 65  ile, allows othe
0e10: 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 6b  r processes to k
0e20: 6e 6f 77 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  now.** when the 
0e30: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
0e40: 20 61 6e 64 20 74 68 75 73 20 77 68 65 6e 20 74   and thus when t
0e50: 68 65 79 20 6e 65 65 64 20 74 6f 20 66 6c 75 73  hey need to flus
0e60: 68 20 74 68 65 69 72 0a 2a 2a 20 63 61 63 68 65  h their.** cache
0e70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 20  ..**.** The max 
0e80: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
0e90: 20 66 72 61 63 74 69 6f 6e 20 69 73 20 74 68 65   fraction is the
0ea0: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74   amount of the t
0eb0: 6f 74 61 6c 20 75 73 61 62 6c 65 0a 2a 2a 20 73  otal usable.** s
0ec0: 70 61 63 65 20 69 6e 20 61 20 70 61 67 65 20 74  pace in a page t
0ed0: 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 73 75  hat can be consu
0ee0: 6d 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20  med by a single 
0ef0: 63 65 6c 6c 20 66 6f 72 20 73 74 61 6e 64 61 72  cell for standar
0f00: 64 0a 2a 2a 20 42 2d 74 72 65 65 20 28 6e 6f 6e  d.** B-tree (non
0f10: 2d 4c 45 41 46 44 41 54 41 29 20 74 61 62 6c 65  -LEAFDATA) table
0f20: 73 2e 20 20 41 20 76 61 6c 75 65 20 6f 66 20 32  s.  A value of 2
0f30: 35 35 20 6d 65 61 6e 73 20 31 30 30 25 2e 20 20  55 means 100%.  
0f40: 54 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 69  The default.** i
0f50: 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6d  s to limit the m
0f60: 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  aximum cell size
0f70: 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
0f80: 74 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66  t 4 cells will f
0f90: 69 74 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67  it.** on one pag
0fa0: 65 2e 20 20 54 68 75 73 20 74 68 65 20 64 65 66  e.  Thus the def
0fb0: 61 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64 65  ault max embedde
0fc0: 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  d payload fracti
0fd0: 6f 6e 20 69 73 20 36 34 2e 0a 2a 2a 0a 2a 2a 20  on is 64..**.** 
0fe0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66  If the payload f
0ff0: 6f 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61 72  or a cell is lar
1000: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ger than the max
1010: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20 65   payload, then e
1020: 78 74 72 61 0a 2a 2a 20 70 61 79 6c 6f 61 64 20  xtra.** payload 
1030: 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 6f 76  is spilled to ov
1040: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 4f  erflow pages.  O
1050: 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
1060: 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
1070: 64 2c 0a 2a 2a 20 61 73 20 6d 61 6e 79 20 62 79  d,.** as many by
1080: 74 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  tes as possible 
1090: 61 72 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  are moved into t
10a0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
10b0: 73 20 77 69 74 68 6f 75 74 20 6c 65 74 74 69 6e  s without lettin
10c0: 67 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 73 69  g.** the cell si
10d0: 7a 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 74 68  ze drop below th
10e0: 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70  e min embedded p
10f0: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 2e  ayload fraction.
1100: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 20 6c  .**.** The min l
1110: 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
1120: 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 74 68 65  tion is like the
1130: 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   min embedded pa
1140: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
1150: 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  * except that it
1160: 20 61 70 70 6c 69 65 73 20 74 6f 20 6c 65 61 66   applies to leaf
1170: 20 6e 6f 64 65 73 20 69 6e 20 61 20 4c 45 41 46   nodes in a LEAF
1180: 44 41 54 41 20 74 72 65 65 2e 20 20 54 68 65 20  DATA tree.  The 
1190: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 70 61 79 6c 6f  maximum.** paylo
11a0: 61 64 20 66 72 61 63 74 69 6f 6e 20 66 6f 72 20  ad fraction for 
11b0: 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
11c0: 69 73 20 61 6c 77 61 79 73 20 31 30 30 25 20 28  is always 100% (
11d0: 6f 72 20 32 35 35 29 20 61 6e 64 20 69 74 0a 2a  or 255) and it.*
11e0: 2a 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  * not specified 
11f0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1200: 2a 0a 2a 2a 20 45 61 63 68 20 62 74 72 65 65 20  *.** Each btree 
1210: 70 61 67 65 73 20 69 73 20 64 69 76 69 64 65 64  pages is divided
1220: 20 69 6e 74 6f 20 74 68 72 65 65 20 73 65 63 74   into three sect
1230: 69 6f 6e 73 3a 20 20 54 68 65 20 68 65 61 64 65  ions:  The heade
1240: 72 2c 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 20 70  r, the.** cell p
1250: 6f 69 6e 74 65 72 20 61 72 72 61 79 2c 20 61 6e  ointer array, an
1260: 64 20 74 68 65 20 63 65 6c 6c 20 61 72 65 61 20  d the cell area 
1270: 61 72 65 61 2e 20 20 50 61 67 65 20 31 20 61 6c  area.  Page 1 al
1280: 73 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79 74  so has a 100-byt
1290: 65 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72  e.** file header
12a0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 62 65 66   that occurs bef
12b0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 68 65 61  ore the page hea
12c0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  der..**.**      
12d0: 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |---------------
12e0: 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 66 69 6c  -|.**      | fil
12f0: 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20 20  e header    |   
1300: 31 30 30 20 62 79 74 65 73 2e 20 20 50 61 67 65  100 bytes.  Page
1310: 20 31 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 20   1 only..**     
1320: 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   |--------------
1330: 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 70 61  --|.**      | pa
1340: 67 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20  ge header    |  
1350: 20 38 20 62 79 74 65 73 20 66 6f 72 20 6c 65 61   8 bytes for lea
1360: 76 65 73 2e 20 20 31 32 20 62 79 74 65 73 20 66  ves.  12 bytes f
1370: 6f 72 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  or interior node
1380: 73 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d  s.**      |-----
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20  -----------|.** 
13a0: 20 20 20 20 20 7c 20 63 65 6c 6c 20 70 6f 69 6e       | cell poin
13b0: 74 65 72 20 20 20 7c 20 20 20 7c 20 20 32 20 62  ter   |   |  2 b
13c0: 79 74 65 73 20 70 65 72 20 63 65 6c 6c 2e 20 20  ytes per cell.  
13d0: 53 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2a  Sorted order..**
13e0: 20 20 20 20 20 20 7c 20 61 72 72 61 79 20 20 20        | array   
13f0: 20 20 20 20 20 20 20 7c 20 20 20 7c 20 20 47 72         |   |  Gr
1400: 6f 77 73 20 64 6f 77 6e 77 61 72 64 0a 2a 2a 20  ows downward.** 
1410: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1420: 20 20 20 20 20 20 7c 20 20 20 76 0a 2a 2a 20 20        |   v.**  
1430: 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      |-----------
1440: 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c  -----|.**      |
1450: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 20 20 20   unallocated    
1460: 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 73 70 61 63  |.**      | spac
1470: 65 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20  e          |.** 
1480: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
1490: 2d 2d 2d 2d 2d 2d 7c 20 20 20 5e 20 20 47 72 6f  ------|   ^  Gro
14a0: 77 73 20 75 70 77 61 72 64 73 0a 2a 2a 20 20 20  ws upwards.**   
14b0: 20 20 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65 6e     | cell conten
14c0: 74 20 20 20 7c 20 20 20 7c 20 20 41 72 62 69 74  t   |   |  Arbit
14d0: 72 61 72 79 20 6f 72 64 65 72 20 69 6e 74 65 72  rary order inter
14e0: 73 70 65 72 73 65 64 20 77 69 74 68 20 66 72 65  spersed with fre
14f0: 65 62 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 20  eblocks..**     
1500: 20 7c 20 61 72 65 61 20 20 20 20 20 20 20 20 20   | area         
1510: 20 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72 65    |   |  and fre
1520: 65 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e 74  e space fragment
1530: 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  s..**      |----
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
1550: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 68 65 61  .** The page hea
1560: 64 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  ders looks like 
1570: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 46  this:.**.**   OF
1580: 46 53 45 54 20 20 20 53 49 5a 45 20 20 20 20 20  FSET   SIZE     
1590: 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20  DESCRIPTION.**  
15a0: 20 20 20 20 30 20 20 20 20 20 20 20 31 20 20 20      0       1   
15b0: 20 20 20 46 6c 61 67 73 2e 20 31 3a 20 69 6e 74     Flags. 1: int
15c0: 6b 65 79 2c 20 32 3a 20 7a 65 72 6f 64 61 74 61  key, 2: zerodata
15d0: 2c 20 34 3a 20 6c 65 61 66 64 61 74 61 2c 20 38  , 4: leafdata, 8
15e0: 3a 20 6c 65 61 66 0a 2a 2a 20 20 20 20 20 20 31  : leaf.**      1
15f0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 62 79         2      by
1600: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  te offset to the
1610: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
1620: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
1630: 20 32 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f   2      number o
1640: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73 20  f cells on this 
1650: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 35 20 20  page.**      5  
1660: 20 20 20 20 20 32 20 20 20 20 20 20 66 69 72 73       2      firs
1670: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
1680: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  ll content area.
1690: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
16a0: 31 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66  1      number of
16b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 66 72 65 65   fragmented free
16c0: 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 38   bytes.**      8
16d0: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 52 69         4      Ri
16e0: 67 68 74 20 63 68 69 6c 64 20 28 74 68 65 20 50  ght child (the P
16f0: 74 72 28 4e 2b 31 29 20 76 61 6c 75 65 29 2e 20  tr(N+1) value). 
1700: 20 4f 6d 69 74 74 65 64 20 6f 6e 20 6c 65 61 76   Omitted on leav
1710: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  es..**.** The fl
1720: 61 67 73 20 64 65 66 69 6e 65 20 74 68 65 20 66  ags define the f
1730: 6f 72 6d 61 74 20 6f 66 20 74 68 69 73 20 62 74  ormat of this bt
1740: 72 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 6c  ree page.  The l
1750: 65 61 66 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  eaf flag means t
1760: 68 61 74 0a 2a 2a 20 74 68 69 73 20 70 61 67 65  hat.** this page
1770: 20 68 61 73 20 6e 6f 20 63 68 69 6c 64 72 65 6e   has no children
1780: 2e 20 20 54 68 65 20 7a 65 72 6f 64 61 74 61 20  .  The zerodata 
1790: 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
17a0: 74 68 69 73 20 70 61 67 65 20 63 61 72 72 69 65  this page carrie
17b0: 73 0a 2a 2a 20 6f 6e 6c 79 20 6b 65 79 73 20 61  s.** only keys a
17c0: 6e 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65  nd no data.  The
17d0: 20 69 6e 74 6b 65 79 20 66 6c 61 67 20 6d 65 61   intkey flag mea
17e0: 6e 73 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  ns that the key 
17f0: 69 73 20 61 20 69 6e 74 65 67 65 72 0a 2a 2a 20  is a integer.** 
1800: 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
1810: 69 6e 20 74 68 65 20 6b 65 79 20 73 69 7a 65 20  in the key size 
1820: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 63 65 6c  entry of the cel
1830: 6c 20 68 65 61 64 65 72 20 72 61 74 68 65 72 20  l header rather 
1840: 74 68 61 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 70  than in.** the p
1850: 61 79 6c 6f 61 64 20 61 72 65 61 2e 0a 2a 2a 0a  ayload area..**.
1860: 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e  ** The cell poin
1870: 74 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73  ter array begins
1880: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79   on the first by
1890: 74 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67  te after the pag
18a0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 65  e header..** The
18b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
18c0: 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  ray contains zer
18d0: 6f 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 65  o or more 2-byte
18e0: 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
18f0: 72 65 0a 2a 2a 20 6f 66 66 73 65 74 73 20 66 72  re.** offsets fr
1900: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
1910: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
1920: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1930: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
1940: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
1950: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73  he cell pointers
1960: 20 6f 63 63 75 72 20 69 6e 20 73 6f 72 74 65 64   occur in sorted
1970: 20 6f 72 64 65 72 2e 20 20 54 68 65 20 73 79 73   order.  The sys
1980: 74 65 6d 20 73 74 72 69 76 65 73 0a 2a 2a 20 74  tem strives.** t
1990: 6f 20 6b 65 65 70 20 66 72 65 65 20 73 70 61 63  o keep free spac
19a0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
19b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 73 6f   cell pointer so
19c0: 20 74 68 61 74 20 6e 65 77 20 63 65 6c 6c 73 20   that new cells 
19d0: 63 61 6e 0a 2a 2a 20 62 65 20 65 61 73 69 6c 79  can.** be easily
19e0: 20 61 64 64 65 64 20 77 69 74 68 6f 75 74 20 68   added without h
19f0: 61 76 69 6e 67 20 74 6f 20 64 65 66 72 61 67 6d  aving to defragm
1a00: 65 6e 74 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ent the page..**
1a10: 0a 2a 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74  .** Cell content
1a20: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
1a30: 65 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68  e very end of th
1a40: 65 20 70 61 67 65 20 61 6e 64 20 67 72 6f 77 73  e page and grows
1a50: 20 74 6f 77 61 72 64 20 74 68 65 0a 2a 2a 20 62   toward the.** b
1a60: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1a70: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 55 6e 75 73  page..**.** Unus
1a80: 65 64 20 73 70 61 63 65 20 77 69 74 68 69 6e 20  ed space within 
1a90: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1aa0: 20 61 72 65 61 20 69 73 20 63 6f 6c 6c 65 63 74   area is collect
1ab0: 65 64 20 69 6e 74 6f 20 61 20 6c 69 6e 6b 65 64  ed into a linked
1ac0: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 66 72 65 65   list of.** free
1ad0: 62 6c 6f 63 6b 73 2e 20 20 45 61 63 68 20 66 72  blocks.  Each fr
1ae0: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 6c 65  eeblock is at le
1af0: 61 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73  ast 4 bytes in s
1b00: 69 7a 65 2e 20 20 54 68 65 20 62 79 74 65 20 6f  ize.  The byte o
1b10: 66 66 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  ffset.** to the 
1b20: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
1b30: 69 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  is given in the 
1b40: 68 65 61 64 65 72 2e 20 20 46 72 65 65 62 6c 6f  header.  Freeblo
1b50: 63 6b 73 20 6f 63 63 75 72 20 69 6e 0a 2a 2a 20  cks occur in.** 
1b60: 69 6e 63 72 65 61 73 69 6e 67 20 6f 72 64 65 72  increasing order
1b70: 2e 20 20 42 65 63 61 75 73 65 20 61 20 66 72 65  .  Because a fre
1b80: 65 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61  eblock must be a
1b90: 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
1ba0: 69 6e 20 73 69 7a 65 2c 0a 2a 2a 20 61 6e 79 20  in size,.** any 
1bb0: 67 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65  group of 3 or fe
1bc0: 77 65 72 20 75 6e 75 73 65 64 20 62 79 74 65 73  wer unused bytes
1bd0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   in the cell con
1be0: 74 65 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74  tent area cannot
1bf0: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
1c00: 20 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e   freeblock chain
1c10: 2e 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20  .  A group of 3 
1c20: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79  or fewer free by
1c30: 74 65 73 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tes is called.**
1c40: 20 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68   a fragment.  Th
1c50: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1c60: 66 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66  f bytes in all f
1c70: 72 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f  ragments is reco
1c80: 72 64 65 64 2e 0a 2a 2a 20 69 6e 20 74 68 65 20  rded..** in the 
1c90: 70 61 67 65 20 68 65 61 64 65 72 20 61 74 20 6f  page header at o
1ca0: 66 66 73 65 74 20 37 2e 0a 2a 2a 0a 2a 2a 20 20  ffset 7..**.**  
1cb0: 20 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49    SIZE    DESCRI
1cc0: 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 32 20  PTION.**      2 
1cd0: 20 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20      Byte offset 
1ce0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
1cf0: 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 20 32 20  block.**      2 
1d00: 20 20 20 20 42 79 74 65 73 20 69 6e 20 74 68 69      Bytes in thi
1d10: 73 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a  s freeblock.**.*
1d20: 2a 20 43 65 6c 6c 73 20 61 72 65 20 6f 66 20 76  * Cells are of v
1d30: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 2e 20  ariable length. 
1d40: 20 43 65 6c 6c 73 20 61 72 65 20 73 74 6f 72 65   Cells are store
1d50: 64 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f  d in the cell co
1d60: 6e 74 65 6e 74 20 61 72 65 61 20 61 74 0a 2a 2a  ntent area at.**
1d70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d80: 70 61 67 65 2e 20 20 50 6f 69 6e 74 65 72 73 20  page.  Pointers 
1d90: 74 6f 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  to the cells are
1da0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   in the cell poi
1db0: 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 74 68  nter array.** th
1dc0: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
1dd0: 6f 6c 6c 6f 77 73 20 74 68 65 20 70 61 67 65 20  ollows the page 
1de0: 68 65 61 64 65 72 2e 20 20 43 65 6c 6c 73 20 69  header.  Cells i
1df0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1e00: 79 0a 2a 2a 20 63 6f 6e 74 69 67 75 6f 75 73 20  y.** contiguous 
1e10: 6f 72 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74  or in order, but
1e20: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
1e30: 72 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 6e  re contiguous an
1e40: 64 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a  d in order..**.*
1e50: 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d  * Cell content m
1e60: 61 6b 65 73 20 75 73 65 20 6f 66 20 76 61 72 69  akes use of vari
1e70: 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
1e80: 67 65 72 73 2e 20 20 41 20 76 61 72 69 61 62 6c  gers.  A variabl
1e90: 65 0a 2a 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65  e.** length inte
1ea0: 67 65 72 20 69 73 20 31 20 74 6f 20 39 20 62 79  ger is 1 to 9 by
1eb0: 74 65 73 20 77 68 65 72 65 20 74 68 65 20 6c 6f  tes where the lo
1ec0: 77 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61  wer 7 bits of ea
1ed0: 63 68 20 0a 2a 2a 20 62 79 74 65 20 61 72 65 20  ch .** byte are 
1ee0: 75 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67  used.  The integ
1ef0: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1f00: 6c 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61  ll bytes that ha
1f10: 76 65 20 62 69 74 20 38 20 73 65 74 20 61 6e 64  ve bit 8 set and
1f20: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
1f30: 74 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c  te with bit 8 cl
1f40: 65 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73  ear.  The most s
1f50: 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20  ignificant byte 
1f60: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
1f70: 2a 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e  * appears first.
1f80: 20 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e    A variable-len
1f90: 67 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20  gth integer may 
1fa0: 6e 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  not be more than
1fb0: 20 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a   9 bytes long..*
1fc0: 2a 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 63  * As a special c
1fd0: 61 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 73  ase, all 8 bytes
1fe0: 20 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 65   of the 9th byte
1ff0: 20 61 72 65 20 75 73 65 64 20 61 73 20 64 61 74   are used as dat
2000: 61 2e 20 20 54 68 69 73 0a 2a 2a 20 61 6c 6c 6f  a.  This.** allo
2010: 77 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ws a 64-bit inte
2020: 67 65 72 20 74 6f 20 62 65 20 65 6e 63 6f 64 65  ger to be encode
2030: 64 20 69 6e 20 39 20 62 79 74 65 73 2e 0a 2a 2a  d in 9 bytes..**
2040: 0a 2a 2a 20 20 20 20 30 78 30 30 20 20 20 20 20  .**    0x00     
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2070: 30 30 30 30 0a 2a 2a 20 20 20 20 30 78 37 66 20  0000.**    0x7f 
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78       becomes  0x
20a0: 30 30 30 30 30 30 37 66 0a 2a 2a 20 20 20 20 30  0000007f.**    0
20b0: 78 38 31 20 30 78 30 30 20 20 20 20 20 20 20 20  x81 0x00        
20c0: 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73           becomes
20d0: 20 20 30 78 30 30 30 30 30 30 38 30 0a 2a 2a 20    0x00000080.** 
20e0: 20 20 20 30 78 38 32 20 30 78 30 30 20 20 20 20     0x82 0x00    
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63               bec
2100: 6f 6d 65 73 20 20 30 78 30 30 30 30 30 31 30 30  omes  0x00000100
2110: 0a 2a 2a 20 20 20 20 30 78 38 30 20 30 78 37 66  .**    0x80 0x7f
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2140: 30 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 61 20  007f.**    0x8a 
2150: 30 78 39 31 20 30 78 64 31 20 30 78 61 63 20 30  0x91 0xd1 0xac 0
2160: 78 37 38 20 20 62 65 63 6f 6d 65 73 20 20 30 78  x78  becomes  0x
2170: 31 32 33 34 35 36 37 38 0a 2a 2a 20 20 20 20 30  12345678.**    0
2180: 78 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78  x81 0x81 0x81 0x
2190: 38 31 20 30 78 30 31 20 20 62 65 63 6f 6d 65 73  81 0x01  becomes
21a0: 20 20 30 78 31 30 32 30 34 30 38 31 0a 2a 2a 0a    0x10204081.**.
21b0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 6c 65 6e 67  ** Variable leng
21c0: 74 68 20 69 6e 74 65 67 65 72 73 20 61 72 65 20  th integers are 
21d0: 75 73 65 64 20 66 6f 72 20 72 6f 77 69 64 73 20  used for rowids 
21e0: 61 6e 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  and to hold the 
21f0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74  number of.** byt
2200: 65 73 20 6f 66 20 6b 65 79 20 61 6e 64 20 64 61  es of key and da
2210: 74 61 20 69 6e 20 61 20 62 74 72 65 65 20 63 65  ta in a btree ce
2220: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ll..**.** The co
2230: 6e 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20  ntent of a cell 
2240: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
2250: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
2260: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
2270: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
2280: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
2290: 65 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 74 74  eft child. Omitt
22a0: 65 64 20 69 66 20 6c 65 61 66 20 66 6c 61 67 20  ed if leaf flag 
22b0: 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20 20 76  is set..**     v
22c0: 61 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  ar    Number of 
22d0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 4f  bytes of data. O
22e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 7a 65  mitted if the ze
22f0: 72 6f 64 61 74 61 20 66 6c 61 67 20 69 73 20 73  rodata flag is s
2300: 65 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20  et..**     var  
2310: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
2320: 73 20 6f 66 20 6b 65 79 2e 20 4f 72 20 74 68 65  s of key. Or the
2330: 20 6b 65 79 20 69 74 73 65 6c 66 20 69 66 20 69   key itself if i
2340: 6e 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65  ntkey flag is se
2350: 74 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20  t..**      *    
2360: 20 50 61 79 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   Payload.**     
2370: 20 34 20 20 20 20 20 46 69 72 73 74 20 70 61 67   4     First pag
2380: 65 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  e of the overflo
2390: 77 20 63 68 61 69 6e 2e 20 20 4f 6d 69 74 74 65  w chain.  Omitte
23a0: 64 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  d if no overflow
23b0: 0a 2a 2a 0a 2a 2a 20 4f 76 65 72 66 6c 6f 77 20  .**.** Overflow 
23c0: 70 61 67 65 73 20 66 6f 72 6d 20 61 20 6c 69 6e  pages form a lin
23d0: 6b 65 64 20 6c 69 73 74 2e 20 20 45 61 63 68 20  ked list.  Each 
23e0: 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
23f0: 6c 61 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65  last is complete
2400: 6c 79 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74  ly.** filled wit
2410: 68 20 64 61 74 61 20 28 70 61 67 65 73 69 7a 65  h data (pagesize
2420: 20 2d 20 34 20 62 79 74 65 73 29 2e 20 20 54 68   - 4 bytes).  Th
2430: 65 20 6c 61 73 74 20 70 61 67 65 20 63 61 6e 20  e last page can 
2440: 68 61 76 65 20 61 73 20 6c 69 74 74 6c 65 0a 2a  have as little.*
2450: 2a 20 61 73 20 31 20 62 79 74 65 20 6f 66 20 64  * as 1 byte of d
2460: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49  ata..**.**    SI
2470: 5a 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f  ZE    DESCRIPTIO
2480: 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  N.**      4     
2490: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e  Page number of n
24a0: 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24b0: 65 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20  e.**      *     
24c0: 44 61 74 61 0a 2a 2a 0a 2a 2a 20 46 72 65 65 6c  Data.**.** Freel
24d0: 69 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69  ist pages come i
24e0: 6e 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20  n two subtypes: 
24f0: 74 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20  trunk pages and 
2500: 6c 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65  leaf pages.  The
2510: 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20  .** file header 
2520: 70 6f 69 6e 74 73 20 74 6f 20 66 69 72 73 74 20  points to first 
2530: 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
2540: 20 6f 66 20 74 72 75 6e 6b 20 70 61 67 65 2e 20   of trunk page. 
2550: 20 45 61 63 68 20 74 72 75 6e 6b 0a 2a 2a 20 70   Each trunk.** p
2560: 61 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 6d 75  age points to mu
2570: 6c 74 69 70 6c 65 20 6c 65 61 66 20 70 61 67 65  ltiple leaf page
2580: 73 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  s.  The content 
2590: 6f 66 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  of a leaf page i
25a0: 73 0a 2a 2a 20 75 6e 73 70 65 63 69 66 69 65 64  s.** unspecified
25b0: 2e 20 20 41 20 74 72 75 6e 6b 20 70 61 67 65 20  .  A trunk page 
25c0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
25d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
25e0: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
25f0: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
2600: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20   number of next 
2610: 74 72 75 6e 6b 20 70 61 67 65 0a 2a 2a 20 20 20  trunk page.**   
2620: 20 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20     4     Number 
2630: 6f 66 20 6c 65 61 66 20 70 6f 69 6e 74 65 72 73  of leaf pointers
2640: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a   on this page.**
2650: 20 20 20 20 20 20 2a 20 20 20 20 20 7a 65 72 6f        *     zero
2660: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 6e   or more pages n
2670: 75 6d 62 65 72 73 20 6f 66 20 6c 65 61 76 65 73  umbers of leaves
2680: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
2690: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
26a0: 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69  ude "pager.h".#i
26b0: 6e 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68 22  nclude "btree.h"
26c0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
26d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
26e0: 74 2e 68 3e 0a 0a 2f 2a 20 52 6f 75 6e 64 20 75  t.h>../* Round u
26f0: 70 20 61 20 6e 75 6d 62 65 72 20 74 6f 20 74 68  p a number to th
2700: 65 20 6e 65 78 74 20 6c 61 72 67 65 72 20 6d 75  e next larger mu
2710: 6c 74 69 70 6c 65 20 6f 66 20 38 2e 20 20 54 68  ltiple of 8.  Th
2720: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
2730: 20 66 6f 72 63 65 20 38 2d 62 79 74 65 20 61 6c   force 8-byte al
2740: 69 67 6e 6d 65 6e 74 20 6f 6e 20 36 34 2d 62 69  ignment on 64-bi
2750: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  t architectures.
2760: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e  .*/.#define ROUN
2770: 44 38 28 78 29 20 20 20 28 28 78 2b 37 29 26 7e  D8(x)   ((x+7)&~
2780: 37 29 0a 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  7).../* The foll
2790: 6f 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 74  owing value is t
27a0: 68 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20  he maximum cell 
27b0: 73 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 20  size assuming a 
27c0: 6d 61 78 69 6d 75 6d 20 70 61 67 65 0a 2a 2a 20  maximum page.** 
27d0: 73 69 7a 65 20 67 69 76 65 20 61 62 6f 76 65 2e  size give above.
27e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
27f0: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 20 28  ELL_SIZE(pBt)  (
2800: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29  pBt->pageSize-8)
2810: 0a 0a 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  ../* The maximum
2820: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2830: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
2840: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2850: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 61 73 73 75  e.  This.** assu
2860: 6d 65 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65  mes a minimum ce
2870: 6c 6c 20 73 69 7a 65 20 6f 66 20 33 20 62 79 74  ll size of 3 byt
2880: 65 73 2e 20 20 53 75 63 68 20 73 6d 61 6c 6c 20  es.  Such small 
2890: 63 65 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  cells will be.**
28a0: 20 65 78 63 65 65 64 69 6e 67 6c 79 20 72 61 72   exceedingly rar
28b0: 65 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20  e, but they are 
28c0: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 64 65  possible..*/.#de
28d0: 66 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 42 74  fine MX_CELL(pBt
28e0: 29 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  ) ((pBt->pageSiz
28f0: 65 2d 38 29 2f 33 29 0a 0a 2f 2a 20 46 6f 72 77  e-8)/3)../* Forw
2900: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
2910: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2920: 63 74 20 4d 65 6d 50 61 67 65 20 4d 65 6d 50 61  ct MemPage MemPa
2930: 67 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ge;.typedef stru
2940: 63 74 20 42 74 4c 6f 63 6b 20 42 74 4c 6f 63 6b  ct BtLock BtLock
2950: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
2960: 20 61 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20   a magic string 
2970: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
2980: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2990: 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69 74 65   every.** SQLite
29a0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64   database in ord
29b0: 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  er to identify t
29c0: 68 65 20 66 69 6c 65 20 61 73 20 61 20 72 65 61  he file as a rea
29d0: 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  l database..**.*
29e0: 2a 20 59 6f 75 20 63 61 6e 20 63 68 61 6e 67 65  * You can change
29f0: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 63   this value at c
2a00: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 73  ompile-time by s
2a10: 70 65 63 69 66 79 69 6e 67 20 61 0a 2a 2a 20 2d  pecifying a.** -
2a20: 44 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41  DSQLITE_FILE_HEA
2a30: 44 45 52 3d 22 2e 2e 2e 22 20 6f 6e 20 74 68 65  DER="..." on the
2a40: 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e   compiler comman
2a50: 64 2d 6c 69 6e 65 2e 20 20 54 68 65 0a 2a 2a 20  d-line.  The.** 
2a60: 68 65 61 64 65 72 20 6d 75 73 74 20 62 65 20 65  header must be e
2a70: 78 61 63 74 6c 79 20 31 36 20 62 79 74 65 73 20  xactly 16 bytes 
2a80: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 7a 65  including the ze
2a90: 72 6f 2d 74 65 72 6d 69 6e 61 74 6f 72 20 73 6f  ro-terminator so
2aa0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
2ab0: 74 73 65 6c 66 20 73 68 6f 75 6c 64 20 62 65 20  tself should be 
2ac0: 31 35 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  15 characters lo
2ad0: 6e 67 2e 20 20 49 66 20 79 6f 75 20 63 68 61 6e  ng.  If you chan
2ae0: 67 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  ge.** the header
2af0: 2c 20 74 68 65 6e 20 79 6f 75 72 20 63 75 73 74  , then your cust
2b00: 6f 6d 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20  om library will 
2b10: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72  not be able to r
2b20: 65 61 64 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  ead .** database
2b30: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
2b40: 68 65 20 73 74 61 6e 64 61 72 64 20 74 6f 6f 6c  he standard tool
2b50: 73 20 61 6e 64 20 74 68 65 20 73 74 61 6e 64 61  s and the standa
2b60: 72 64 20 74 6f 6f 6c 73 0a 2a 2a 20 77 69 6c 6c  rd tools.** will
2b70: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
2b80: 72 65 61 64 20 64 61 74 61 62 61 73 65 73 20 63  read databases c
2b90: 72 65 61 74 65 64 20 62 79 20 79 6f 75 72 20 63  reated by your c
2ba0: 75 73 74 6f 6d 20 6c 69 62 72 61 72 79 2e 0a 2a  ustom library..*
2bb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2bc0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 20 2f 2a 20  _FILE_HEADER /* 
2bd0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
2be0: 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 53 51   */.#  define SQ
2bf0: 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  LITE_FILE_HEADER
2c00: 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20   "SQLite format 
2c10: 33 22 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  3".#endif.static
2c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67   const char zMag
2c30: 69 63 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c  icHeader[] = SQL
2c40: 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b  ITE_FILE_HEADER;
2c50: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 74 79 70  ../*.** Page typ
2c60: 65 20 66 6c 61 67 73 2e 20 20 41 6e 20 4f 52 65  e flags.  An ORe
2c70: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
2c80: 20 74 68 65 73 65 20 66 6c 61 67 73 20 61 70 70   these flags app
2c90: 65 61 72 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  ear as the.** fi
2ca0: 72 73 74 20 62 79 74 65 20 6f 66 20 65 76 65 72  rst byte of ever
2cb0: 79 20 42 54 72 65 65 20 70 61 67 65 2e 0a 2a 2f  y BTree page..*/
2cc0: 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 49 4e 54  .#define PTF_INT
2cd0: 4b 45 59 20 20 20 20 30 78 30 31 0a 23 64 65 66  KEY    0x01.#def
2ce0: 69 6e 65 20 50 54 46 5f 5a 45 52 4f 44 41 54 41  ine PTF_ZERODATA
2cf0: 20 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 50    0x02.#define P
2d00: 54 46 5f 4c 45 41 46 44 41 54 41 20 20 30 78 30  TF_LEAFDATA  0x0
2d10: 34 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45  4.#define PTF_LE
2d20: 41 46 20 20 20 20 20 20 30 78 30 38 0a 0a 2f 2a  AF      0x08../*
2d30: 0a 2a 2a 20 41 73 20 65 61 63 68 20 70 61 67 65  .** As each page
2d40: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
2d50: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
2d60: 72 79 2c 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ry, an instance 
2d70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2d80: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
2d90: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 69 6e   appended and in
2da0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
2db0: 6f 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  o.  This structu
2dc0: 72 65 20 73 74 6f 72 65 73 0a 2a 2a 20 69 6e 66  re stores.** inf
2dd0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
2de0: 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20  he page that is 
2df0: 64 65 63 6f 64 65 64 20 66 72 6f 6d 20 74 68 65  decoded from the
2e00: 20 72 61 77 20 66 69 6c 65 20 70 61 67 65 2e 0a   raw file page..
2e10: 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
2e20: 74 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 62  t field points b
2e30: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2e40: 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 61 6c  t page.  This al
2e50: 6c 6f 77 73 20 75 73 20 74 6f 0a 2a 2a 20 77 61  lows us to.** wa
2e60: 6c 6b 20 75 70 20 74 68 65 20 42 54 72 65 65 20  lk up the BTree 
2e70: 66 72 6f 6d 20 61 6e 79 20 6c 65 61 66 20 74 6f  from any leaf to
2e80: 20 74 68 65 20 72 6f 6f 74 2e 20 20 43 61 72 65   the root.  Care
2e90: 20 6d 75 73 74 20 62 65 20 74 61 6b 65 6e 20 74   must be taken t
2ea0: 6f 0a 2a 2a 20 75 6e 72 65 66 28 29 20 74 68 65  o.** unref() the
2eb0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 70 6f 69   parent page poi
2ec0: 6e 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 70  nter when this p
2ed0: 61 67 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  age is no longer
2ee0: 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20   referenced..** 
2ef0: 54 68 65 20 70 61 67 65 44 65 73 74 72 75 63 74  The pageDestruct
2f00: 6f 72 28 29 20 72 6f 75 74 69 6e 65 20 68 61 6e  or() routine han
2f10: 64 6c 65 73 20 74 68 61 74 20 63 68 6f 72 65 2e  dles that chore.
2f20: 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 50 61  .*/.struct MemPa
2f30: 67 65 20 7b 0a 20 20 75 38 20 69 73 49 6e 69 74  ge {.  u8 isInit
2f40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2f50: 72 75 65 20 69 66 20 70 72 65 76 69 6f 75 73 6c  rue if previousl
2f60: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 4d  y initialized. M
2f70: 55 53 54 20 42 45 20 46 49 52 53 54 21 20 2a 2f  UST BE FIRST! */
2f80: 0a 20 20 75 38 20 69 64 78 53 68 69 66 74 3b 20  .  u8 idxShift; 
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fa0: 69 66 20 43 65 6c 6c 20 69 6e 64 69 63 65 73 20  if Cell indices 
2fb0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2fc0: 20 20 75 38 20 6e 4f 76 65 72 66 6c 6f 77 3b 20    u8 nOverflow; 
2fd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2fe0: 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   of overflow cel
2ff0: 6c 20 62 6f 64 69 65 73 20 69 6e 20 61 43 65 6c  l bodies in aCel
3000: 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 6e 74 4b  l[] */.  u8 intK
3010: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey;           /*
3020: 20 54 72 75 65 20 69 66 20 69 6e 74 6b 65 79 20   True if intkey 
3030: 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 20  flag is set */. 
3040: 20 75 38 20 6c 65 61 66 3b 20 20 20 20 20 20 20   u8 leaf;       
3050: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3060: 20 6c 65 61 66 20 66 6c 61 67 20 69 73 20 73 65   leaf flag is se
3070: 74 20 2a 2f 0a 20 20 75 38 20 7a 65 72 6f 44 61  t */.  u8 zeroDa
3080: 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
3090: 72 75 65 20 69 66 20 74 61 62 6c 65 20 73 74 6f  rue if table sto
30a0: 72 65 73 20 6b 65 79 73 20 6f 6e 6c 79 20 2a 2f  res keys only */
30b0: 0a 20 20 75 38 20 6c 65 61 66 44 61 74 61 3b 20  .  u8 leafData; 
30c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30d0: 69 66 20 74 61 62 6c 65 73 20 73 74 6f 72 65 73  if tables stores
30e0: 20 64 61 74 61 20 6f 6e 20 6c 65 61 76 65 73 20   data on leaves 
30f0: 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 68 61 73  only */.  u8 has
3100: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  Data;          /
3110: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 70  * True if this p
3120: 61 67 65 20 73 74 6f 72 65 73 20 64 61 74 61 20  age stores data 
3130: 2a 2f 0a 20 20 75 38 20 68 64 72 4f 66 66 73 65  */.  u8 hdrOffse
3140: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 30 30  t;        /* 100
3150: 20 66 6f 72 20 70 61 67 65 20 31 2e 20 20 30 20   for page 1.  0 
3160: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
3170: 38 20 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  8 childPtrSize; 
3180: 20 20 20 20 2f 2a 20 30 20 69 66 20 6c 65 61 66      /* 0 if leaf
3190: 3d 3d 31 2e 20 20 34 20 69 66 20 6c 65 61 66 3d  ==1.  4 if leaf=
31a0: 3d 30 20 2a 2f 0a 20 20 75 31 36 20 6d 61 78 4c  =0 */.  u16 maxL
31b0: 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  ocal;        /* 
31c0: 43 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 61  Copy of Btree.ma
31d0: 78 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e  xLocal or Btree.
31e0: 6d 61 78 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36  maxLeaf */.  u16
31f0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20   minLocal;      
3200: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42 74 72    /* Copy of Btr
3210: 65 65 2e 6d 69 6e 4c 6f 63 61 6c 20 6f 72 20 42  ee.minLocal or B
3220: 74 72 65 65 2e 6d 69 6e 4c 65 61 66 20 2a 2f 0a  tree.minLeaf */.
3230: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
3240: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  ;      /* Index 
3250: 69 6e 20 61 44 61 74 61 20 6f 66 20 66 69 72 73  in aData of firs
3260: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
3270: 2f 0a 20 20 75 31 36 20 69 64 78 50 61 72 65 6e  /.  u16 idxParen
3280: 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  t;       /* Inde
3290: 78 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 74  x in parent of t
32a0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 31  his node */.  u1
32b0: 36 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  6 nFree;        
32c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32d0: 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68  free bytes on th
32e0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20  e page */.  u16 
32f0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
3300: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
3310: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  lls on this page
3320: 2c 20 6c 6f 63 61 6c 20 61 6e 64 20 6f 76 66 6c  , local and ovfl
3330: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 5f 4f 76   */.  struct _Ov
3340: 66 6c 43 65 6c 6c 20 7b 20 20 20 2f 2a 20 43 65  flCell {   /* Ce
3350: 6c 6c 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  lls that will no
3360: 74 20 66 69 74 20 6f 6e 20 61 44 61 74 61 5b 5d  t fit on aData[]
3370: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 43 65 6c   */.    u8 *pCel
3380: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  l;          /* P
3390: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 62  ointers to the b
33a0: 6f 64 79 20 6f 66 20 74 68 65 20 6f 76 65 72 66  ody of the overf
33b0: 6c 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  low cell */.    
33c0: 75 31 36 20 69 64 78 3b 20 20 20 20 20 20 20 20  u16 idx;        
33d0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
33e0: 69 73 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 69  is cell before i
33f0: 64 78 2d 74 68 20 6e 6f 6e 2d 6f 76 65 72 66 6c  dx-th non-overfl
3400: 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 7d 20 61  ow cell */.  } a
3410: 4f 76 66 6c 5b 35 5d 3b 0a 20 20 42 74 53 68 61  Ovfl[5];.  BtSha
3420: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
3430: 2f 2a 20 50 6f 69 6e 74 65 72 20 62 61 63 6b 20  /* Pointer back 
3440: 74 6f 20 42 54 72 65 65 20 73 74 72 75 63 74 75  to BTree structu
3450: 72 65 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  re */.  u8 *aDat
3460: 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
3470: 50 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20  Pointer back to 
3480: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
3490: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
34a0: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
34b0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
34c0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
34d0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
34e0: 6e 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61  nt;    /* The pa
34f0: 72 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  rent of this pag
3500: 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f  e.  NULL for roo
3510: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  t */.};../*.** T
3520: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61  he in-memory ima
3530: 67 65 20 6f 66 20 61 20 64 69 73 6b 20 70 61 67  ge of a disk pag
3540: 65 20 68 61 73 20 74 68 65 20 61 75 78 69 6c 69  e has the auxili
3550: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
3560: 61 70 70 65 6e 64 65 64 0a 2a 2a 20 74 6f 20 74  appended.** to t
3570: 68 65 20 65 6e 64 2e 20 20 45 58 54 52 41 5f 53  he end.  EXTRA_S
3580: 49 5a 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65  IZE is the numbe
3590: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
35a0: 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ace needed to ho
35b0: 6c 64 0a 2a 2a 20 74 68 61 74 20 65 78 74 72 61  ld.** that extra
35c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
35d0: 0a 23 64 65 66 69 6e 65 20 45 58 54 52 41 5f 53  .#define EXTRA_S
35e0: 49 5a 45 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  IZE sizeof(MemPa
35f0: 67 65 29 0a 0a 2f 2a 20 42 74 72 65 65 20 68 61  ge)../* Btree ha
3600: 6e 64 6c 65 20 2a 2f 0a 73 74 72 75 63 74 20 42  ndle */.struct B
3610: 74 72 65 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tree {.  sqlite3
3620: 20 2a 70 53 71 6c 69 74 65 3b 0a 20 20 42 74 53   *pSqlite;.  BtS
3630: 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 75 38  hared *pBt;.  u8
3640: 20 69 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20   inTrans;       
3650: 20 20 20 20 20 2f 2a 20 54 52 41 4e 53 5f 4e 4f       /* TRANS_NO
3660: 4e 45 2c 20 54 52 41 4e 53 5f 52 45 41 44 20 6f  NE, TRANS_READ o
3670: 72 20 54 52 41 4e 53 5f 57 52 49 54 45 20 2a 2f  r TRANS_WRITE */
3680: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 74 72 65 65  .};../*.** Btree
3690: 2e 69 6e 54 72 61 6e 73 20 6d 61 79 20 74 61 6b  .inTrans may tak
36a0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  e one of the fol
36b0: 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a  lowing values..*
36c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
36d0: 65 64 2d 64 61 74 61 20 65 78 74 65 6e 73 69 6f  ed-data extensio
36e0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
36f0: 65 72 65 20 6d 61 79 20 62 65 20 6d 75 6c 74 69  ere may be multi
3700: 70 6c 65 20 75 73 65 72 73 0a 2a 2a 20 6f 66 20  ple users.** of 
3710: 74 68 65 20 42 74 72 65 65 20 73 74 72 75 63 74  the Btree struct
3720: 75 72 65 2e 20 41 74 20 6d 6f 73 74 20 6f 6e 65  ure. At most one
3730: 20 6f 66 20 74 68 65 73 65 20 6d 61 79 20 6f 70   of these may op
3740: 65 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  en a write trans
3750: 61 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 61  action,.** but a
3760: 6e 79 20 6e 75 6d 62 65 72 20 6d 61 79 20 68 61  ny number may ha
3770: 76 65 20 61 63 74 69 76 65 20 72 65 61 64 20 74  ve active read t
3780: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 56 61 72  ransactions. Var
3790: 69 61 62 6c 65 20 42 74 72 65 65 2e 70 44 62 20  iable Btree.pDb 
37a0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
37b0: 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
37c0: 6e 73 20 61 6e 79 20 63 75 72 72 65 6e 74 20 77  ns any current w
37d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 52 41  ..*/.#define TRA
37f0: 4e 53 5f 4e 4f 4e 45 20 20 30 0a 23 64 65 66 69  NS_NONE  0.#defi
3800: 6e 65 20 54 52 41 4e 53 5f 52 45 41 44 20 20 31  ne TRANS_READ  1
3810: 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 57  .#define TRANS_W
3820: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 45 76  RITE 2../*.** Ev
3830: 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64  erything we need
3840: 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 20 61   to know about a
3850: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  n open database.
3860: 2a 2f 0a 73 74 72 75 63 74 20 42 74 53 68 61 72  */.struct BtShar
3870: 65 64 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ed {.  Pager *pP
3880: 61 67 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ager;        /* 
3890: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 2a  The page cache *
38a0: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
38b0: 75 72 73 6f 72 3b 20 20 20 20 2f 2a 20 41 20 6c  ursor;    /* A l
38c0: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
38d0: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 4d 65 6d  cursors */.  Mem
38e0: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
38f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
3900: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3910: 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b   */.  u8 inStmt;
3920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3930: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 69 6e  rue if we are in
3940: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3950: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3960: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
3970: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3980: 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
3990: 20 66 69 6c 65 20 69 73 20 72 65 61 64 6f 6e 6c   file is readonl
39a0: 79 20 2a 2f 0a 20 20 75 38 20 6d 61 78 45 6d 62  y */.  u8 maxEmb
39b0: 65 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20  edFrac;      /* 
39c0: 4d 61 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20  Maximum payload 
39d0: 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61  as % of total pa
39e0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20  ge size */.  u8 
39f0: 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 20 20 20  minEmbedFrac;   
3a00: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 70 61     /* Minimum pa
3a10: 79 6c 6f 61 64 20 61 73 20 25 20 6f 66 20 74 6f  yload as % of to
3a20: 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tal page size */
3a30: 0a 20 20 75 38 20 6d 69 6e 4c 65 61 66 46 72 61  .  u8 minLeafFra
3a40: 63 3b 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  c;       /* Mini
3a50: 6d 75 6d 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  mum leaf payload
3a60: 20 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70   as % of total p
3a70: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38  age size */.  u8
3a80: 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 3b 20   pageSizeFixed; 
3a90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3aa0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 6e  he page size can
3ab0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
3ac0: 61 6e 67 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  anged */.#ifndef
3ad0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3ae0: 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 61 75 74  OVACUUM.  u8 aut
3af0: 6f 56 61 63 75 75 6d 3b 20 20 20 20 20 20 20 20  oVacuum;        
3b00: 2f 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62  /* True if datab
3b10: 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
3b20: 6f 2d 76 61 63 75 75 6d 20 2a 2f 0a 23 65 6e 64  o-vacuum */.#end
3b30: 69 66 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  if.  u16 pageSiz
3b40: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  e;         /* To
3b50: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
3b60: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
3b70: 0a 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a  .  u16 usableSiz
3b80: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  e;       /* Numb
3b90: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
3ba0: 65 73 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  es on each page 
3bb0: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
3bc0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  l;         /* Ma
3bd0: 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c  ximum local payl
3be0: 6f 61 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46 44  oad in non-LEAFD
3bf0: 41 54 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ATA tables */.  
3c00: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20  int minLocal;   
3c10: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
3c20: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3c30: 6e 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74  n non-LEAFDATA t
3c40: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  ables */.  int m
3c50: 61 78 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  axLeaf;         
3c60: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61   /* Maximum loca
3c70: 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c  l payload in a L
3c80: 45 41 46 44 41 54 41 20 74 61 62 6c 65 20 2a 2f  EAFDATA table */
3c90: 0a 20 20 69 6e 74 20 6d 69 6e 4c 65 61 66 3b 20  .  int minLeaf; 
3ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
3cb0: 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  mum local payloa
3cc0: 64 20 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20  d in a LEAFDATA 
3cd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 42 75 73 79 48  table */.  BusyH
3ce0: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
3cf0: 64 6c 65 72 3b 20 20 20 2f 2a 20 43 61 6c 6c 62  dler;   /* Callb
3d00: 61 63 6b 20 66 6f 72 20 77 68 65 6e 20 74 68 65  ack for when the
3d10: 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
3d20: 6e 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 6e  ntion */.  u8 in
3d30: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20  Transaction;    
3d40: 20 2f 2a 20 54 72 61 6e 73 61 63 74 69 6f 6e 20   /* Transaction 
3d50: 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  state */.  int n
3d60: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
3d70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3d80: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
3d90: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3da0: 69 6e 74 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  int nTransaction
3db0: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3dc0: 6f 66 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  of open transact
3dd0: 69 6f 6e 73 20 28 72 65 61 64 20 2b 20 77 72 69  ions (read + wri
3de0: 74 65 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  te) */.  void *p
3df0: 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20 20 2f  Schema;        /
3e00: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 70 61  * Pointer to spa
3e10: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ce allocated by 
3e20: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
3e30: 6d 61 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  ma() */.  void (
3e40: 2a 78 46 72 65 65 53 63 68 65 6d 61 29 28 76 6f  *xFreeSchema)(vo
3e50: 69 64 2a 29 3b 20 20 2f 2a 20 44 65 73 74 72 75  id*);  /* Destru
3e60: 63 74 6f 72 20 66 6f 72 20 42 74 53 68 61 72 65  ctor for BtShare
3e70: 64 2e 70 53 63 68 65 6d 61 20 2a 2f 0a 23 69 66  d.pSchema */.#if
3e80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e90: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
3ea0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 20 20  BtLock *pLock;  
3eb0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3ec0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 6f 6e 20 74   locks held on t
3ed0: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
3ee0: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 42 74 53   struct */.  BtS
3ef0: 68 61 72 65 64 20 2a 70 4e 65 78 74 3b 20 20 20  hared *pNext;   
3f00: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 54 68     /* Next in Th
3f10: 72 65 61 64 44 61 74 61 2e 70 42 74 72 65 65 20  readData.pBtree 
3f20: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 23  linked list */.#
3f30: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
3f40: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3f50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3f60: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
3f70: 6f 20 68 6f 6c 64 20 69 6e 66 6f 72 6d 61 74 69  o hold informati
3f80: 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 61 20 63 65  on.** about a ce
3f90: 6c 6c 2e 20 20 54 68 65 20 70 61 72 73 65 43 65  ll.  The parseCe
3fa0: 6c 6c 50 74 72 28 29 20 66 75 6e 63 74 69 6f 6e  llPtr() function
3fb0: 20 66 69 6c 6c 73 20 69 6e 20 74 68 69 73 20 73   fills in this s
3fc0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 61 73 65  tructure.** base
3fd0: 64 20 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  d on information
3fe0: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 74 68   extract from th
3ff0: 65 20 72 61 77 20 64 69 73 6b 20 70 61 67 65 2e  e raw disk page.
4000: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
4010: 63 74 20 43 65 6c 6c 49 6e 66 6f 20 43 65 6c 6c  ct CellInfo Cell
4020: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 43 65 6c  Info;.struct Cel
4030: 6c 49 6e 66 6f 20 7b 0a 20 20 75 38 20 2a 70 43  lInfo {.  u8 *pC
4040: 65 6c 6c 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ell;     /* Poin
4050: 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ter to the start
4060: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
4070: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 3b 20   */.  i64 nKey; 
4080: 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
4090: 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  for INTKEY table
40a0: 73 2c 20 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  s, or number of 
40b0: 62 79 74 65 73 20 69 6e 20 6b 65 79 20 2a 2f 0a  bytes in key */.
40c0: 20 20 75 33 32 20 6e 44 61 74 61 3b 20 20 20 20    u32 nData;    
40d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
40e0: 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  tes of data */. 
40f0: 20 75 31 36 20 6e 48 65 61 64 65 72 3b 20 20 20   u16 nHeader;   
4100: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63  /* Size of the c
4110: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
4120: 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
4130: 20 75 31 36 20 6e 4c 6f 63 61 6c 3b 20 20 20 20   u16 nLocal;    
4140: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 70 61 79  /* Amount of pay
4150: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
4160: 79 20 2a 2f 0a 20 20 75 31 36 20 69 4f 76 65 72  y */.  u16 iOver
4170: 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66 73 65 74 20  flow; /* Offset 
4180: 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
4190: 20 6e 75 6d 62 65 72 2e 20 20 5a 65 72 6f 20 69   number.  Zero i
41a0: 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 2a 2f  f no overflow */
41b0: 0a 20 20 75 31 36 20 6e 53 69 7a 65 3b 20 20 20  .  u16 nSize;   
41c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
41d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 6e   cell content on
41e0: 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
41f0: 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   page */.};../*.
4200: 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 61  ** A cursor is a
4210: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 61   pointer to a pa
4220: 72 74 69 63 75 6c 61 72 20 65 6e 74 72 79 20 69  rticular entry i
4230: 6e 20 74 68 65 20 42 54 72 65 65 2e 0a 2a 2a 20  n the BTree..** 
4240: 54 68 65 20 65 6e 74 72 79 20 69 73 20 69 64 65  The entry is ide
4250: 6e 74 69 66 69 65 64 20 62 79 20 69 74 73 20 4d  ntified by its M
4260: 65 6d 50 61 67 65 20 61 6e 64 20 74 68 65 20 69  emPage and the i
4270: 6e 64 65 78 20 69 6e 0a 2a 2a 20 4d 65 6d 50 61  ndex in.** MemPa
4280: 67 65 2e 61 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  ge.aCell[] of th
4290: 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 72 75  e entry..*/.stru
42a0: 63 74 20 42 74 43 75 72 73 6f 72 20 7b 0a 20 20  ct BtCursor {.  
42b0: 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 20 20  Btree *pBtree;  
42c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
42d0: 20 42 74 72 65 65 20 74 6f 20 77 68 69 63 68 20   Btree to which 
42e0: 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
42f0: 6e 67 73 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ngs */.  BtCurso
4300: 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76  r *pNext, *pPrev
4310: 3b 20 20 2f 2a 20 46 6f 72 6d 73 20 61 20 6c 69  ;  /* Forms a li
4320: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c  nked list of all
4330: 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 69 6e   cursors */.  in
4340: 74 20 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  t (*xCompare)(vo
4350: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
4360: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
4370: 69 64 2a 29 3b 20 2f 2a 20 4b 65 79 20 63 6f 6d  id*); /* Key com
4380: 70 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64  p func */.  void
4390: 20 2a 70 41 72 67 3b 20 20 20 20 20 20 20 20 20   *pArg;         
43a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
43b0: 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
43c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52   */.  Pgno pgnoR
43d0: 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  oot;            
43e0: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
43f0: 20 6f 66 20 74 68 69 73 20 74 72 65 65 20 2a 2f   of this tree */
4400: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
4410: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
4420: 50 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Page that contai
4430: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 2a 2f 0a  ns the entry */.
4440: 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
4460: 6e 64 65 78 20 6f 66 20 74 68 65 20 65 6e 74 72  ndex of the entr
4470: 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
4480: 6c 5b 5d 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  l[] */.  CellInf
4490: 6f 20 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  o info;         
44a0: 20 20 20 2f 2a 20 41 20 70 61 72 73 65 20 6f 66     /* A parse of
44b0: 20 74 68 65 20 63 65 6c 6c 20 77 65 20 61 72 65   the cell we are
44c0: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 2a 2f 0a   pointing at */.
44d0: 20 20 75 38 20 77 72 46 6c 61 67 3b 20 20 20 20    u8 wrFlag;    
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
44f0: 72 75 65 20 69 66 20 77 72 69 74 61 62 6c 65 20  rue if writable 
4500: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 55 52  * One of the CUR
4530: 53 4f 52 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74  SOR_XXX constant
4540: 73 20 28 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f  s (see below) */
4550: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4560: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
4570: 45 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a  E.  void *pKey;.
4580: 20 20 69 36 34 20 6e 4b 65 79 3b 0a 20 20 69 6e    i64 nKey;.  in
4590: 74 20 73 6b 69 70 3b 20 20 20 20 20 20 20 20 2f  t skip;        /
45a0: 2a 20 28 73 6b 69 70 3c 30 29 20 2d 3e 20 50 72  * (skip<0) -> Pr
45b0: 65 76 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  ev() is a no-op.
45c0: 20 28 73 6b 69 70 3e 30 29 20 2d 3e 20 4e 65 78   (skip>0) -> Nex
45d0: 74 28 29 20 69 73 20 2a 2f 0a 23 65 6e 64 69 66  t() is */.#endif
45e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 6f 74 65 6e  .};../*.** Poten
45f0: 74 69 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  tial values for 
4600: 42 74 43 75 72 73 6f 72 2e 65 53 74 61 74 65 2e  BtCursor.eState.
4610: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 76   The first two v
4620: 61 6c 75 65 73 20 28 56 41 4c 49 44 20 61 6e 64  alues (VALID and
4630: 20 0a 2a 2a 20 49 4e 56 41 4c 49 44 29 20 6d 61   .** INVALID) ma
4640: 79 20 6f 63 63 75 72 20 69 6e 20 61 6e 79 20 62  y occur in any b
4650: 75 69 6c 64 2e 20 54 68 65 20 74 68 69 72 64 20  uild. The third 
4660: 28 52 45 51 55 49 52 45 53 45 45 4b 29 20 6d 61  (REQUIRESEEK) ma
4670: 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 0a 2a 2a  y only occur .**
4680: 20 69 66 20 73 71 6c 69 74 65 20 77 61 73 20 63   if sqlite was c
4690: 6f 6d 70 69 6c 65 64 20 77 69 74 68 6f 75 74 20  ompiled without 
46a0: 74 68 65 20 4f 4d 49 54 5f 53 48 41 52 45 44 5f  the OMIT_SHARED_
46b0: 43 41 43 48 45 20 73 79 6d 62 6f 6c 20 64 65 66  CACHE symbol def
46c0: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53  ined..**.** CURS
46d0: 4f 52 5f 56 41 4c 49 44 3a 0a 2a 2a 20 20 20 43  OR_VALID:.**   C
46e0: 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
46f0: 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 67  a valid entry. g
4700: 65 74 50 61 79 6c 6f 61 64 28 29 20 65 74 63 2e  etPayload() etc.
4710: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 2e 0a   may be called..
4720: 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  **.** CURSOR_INV
4730: 41 4c 49 44 3a 0a 2a 2a 20 20 20 43 75 72 73 6f  ALID:.**   Curso
4740: 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74  r does not point
4750: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4760: 79 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  y. This can happ
4770: 65 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  en (for example)
4780: 20 0a 2a 2a 20 20 20 62 65 63 61 75 73 65 20 74   .**   because t
4790: 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
47a0: 79 20 6f 72 20 62 65 63 61 75 73 65 20 42 74 72  y or because Btr
47b0: 65 65 43 75 72 73 6f 72 46 69 72 73 74 28 29 20  eeCursorFirst() 
47c0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20  has not been.** 
47d0: 20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20    called..**.** 
47e0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
47f0: 45 4b 3a 0a 2a 2a 20 20 20 54 68 65 20 74 61 62  EK:.**   The tab
4800: 6c 65 20 74 68 61 74 20 74 68 69 73 20 63 75 72  le that this cur
4810: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
4820: 6e 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2c 20  n still exists, 
4830: 62 75 74 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a  but has been .**
4840: 20 20 20 6d 6f 64 69 66 69 65 64 20 73 69 6e 63     modified sinc
4850: 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  e the cursor was
4860: 20 6c 61 73 74 20 75 73 65 64 2e 20 54 68 65 20   last used. The 
4870: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4880: 69 73 20 73 61 76 65 64 0a 2a 2a 20 20 20 69 6e  is saved.**   in
4890: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
48a0: 73 6f 72 2e 70 4b 65 79 20 61 6e 64 20 42 74 43  sor.pKey and BtC
48b0: 75 72 73 6f 72 2e 6e 4b 65 79 2e 20 57 68 65 6e  ursor.nKey. When
48c0: 20 61 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20   a cursor is in 
48d0: 0a 2a 2a 20 20 20 74 68 69 73 20 73 74 61 74 65  .**   this state
48e0: 2c 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  , restoreCursorP
48f0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6e 20 62 65  osition() can be
4900: 20 63 61 6c 6c 65 64 20 74 6f 20 61 74 74 65 6d   called to attem
4910: 70 74 20 74 6f 20 73 65 65 6b 20 0a 2a 2a 20 20  pt to seek .**  
4920: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
4930: 68 65 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  he saved positio
4940: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 55  n..*/.#define CU
4950: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 20 20 20  RSOR_INVALID    
4960: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
4970: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
4980: 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66            1.#def
4990: 69 6e 65 20 43 55 52 53 4f 52 5f 52 45 51 55 49  ine CURSOR_REQUI
49a0: 52 45 53 45 45 4b 20 20 20 20 20 20 20 32 0a 0a  RESEEK       2..
49b0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 52 41 43 45 20  /*.** The TRACE 
49c0: 6d 61 63 72 6f 20 77 69 6c 6c 20 70 72 69 6e 74  macro will print
49d0: 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 74 61 74   high-level stat
49e0: 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  us information a
49f0: 62 6f 75 74 20 74 68 65 0a 2a 2a 20 62 74 72 65  bout the.** btre
4a00: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e  e operation when
4a10: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
4a20: 61 62 6c 65 20 73 71 6c 69 74 65 33 5f 62 74 72  able sqlite3_btr
4a30: 65 65 5f 74 72 61 63 65 20 69 73 0a 2a 2a 20 65  ee_trace is.** e
4a40: 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 23 69 66 20 53  nabled..*/.#if S
4a50: 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66  QLITE_TEST.# def
4a60: 69 6e 65 20 54 52 41 43 45 28 58 29 20 20 20 69  ine TRACE(X)   i
4a70: 66 28 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65  f( sqlite3_btree
4a80: 5f 74 72 61 63 65 20 29 5c 0a 20 20 20 20 20 20  _trace )\.      
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67    { sqlite3Debug
4ab0: 50 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68  Printf X; fflush
4ac0: 28 73 74 64 6f 75 74 29 3b 20 7d 0a 23 65 6c 73  (stdout); }.#els
4ad0: 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45  e.# define TRACE
4ae0: 28 58 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73  (X).#endif.int s
4af0: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
4b00: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
4b10: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
4b20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61   */../*.** Forwa
4b30: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
4b40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4b50: 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 53 68  ckReadLocks(BtSh
4b60: 61 72 65 64 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  ared*,Pgno,BtCur
4b70: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  sor*);../*.** Re
4b80: 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 74 77  ad or write a tw
4b90: 6f 2d 20 61 6e 64 20 66 6f 75 72 2d 62 79 74 65  o- and four-byte
4ba0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
4bb0: 67 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ger values..*/.s
4bc0: 74 61 74 69 63 20 75 33 32 20 67 65 74 32 62 79  tatic u32 get2by
4bd0: 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  te(unsigned char
4be0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
4bf0: 70 5b 30 5d 3c 3c 38 29 20 7c 20 70 5b 31 5d 3b  p[0]<<8) | p[1];
4c00: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 67 65  .}.static u32 ge
4c10: 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t4byte(unsigned 
4c20: 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  char *p){.  retu
4c30: 72 6e 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c 20  rn (p[0]<<24) | 
4c40: 28 70 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70 5b  (p[1]<<16) | (p[
4c50: 32 5d 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d  2]<<8) | p[3];.}
4c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74  .static void put
4c70: 32 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63  2byte(unsigned c
4c80: 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a  har *p, u32 v){.
4c90: 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 38 3b 0a 20    p[0] = v>>8;. 
4ca0: 20 70 5b 31 5d 20 3d 20 76 3b 0a 7d 0a 73 74 61   p[1] = v;.}.sta
4cb0: 74 69 63 20 76 6f 69 64 20 70 75 74 34 62 79 74  tic void put4byt
4cc0: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4cd0: 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b  *p, u32 v){.  p[
4ce0: 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b  0] = v>>24;.  p[
4cf0: 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b  1] = v>>16;.  p[
4d00: 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33  2] = v>>8;.  p[3
4d10: 5d 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = v;.}../*.** 
4d20: 52 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61 64  Routines to read
4d30: 20 61 6e 64 20 77 72 69 74 65 20 76 61 72 69 61   and write varia
4d40: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
4d50: 65 72 73 2e 20 20 54 68 65 73 65 20 75 73 65 64  ers.  These used
4d60: 20 74 6f 0a 2a 2a 20 62 65 20 64 65 66 69 6e 65   to.** be define
4d70: 64 20 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 20 6e  d locally, but n
4d80: 6f 77 20 77 65 20 75 73 65 20 74 68 65 20 76 61  ow we use the va
4d90: 72 69 6e 74 20 72 6f 75 74 69 6e 65 73 20 69 6e  rint routines in
4da0: 20 74 68 65 20 75 74 69 6c 2e 63 0a 2a 2a 20 66   the util.c.** f
4db0: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
4dc0: 67 65 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c  getVarint    sql
4dd0: 69 74 65 33 47 65 74 56 61 72 69 6e 74 0a 23 64  ite3GetVarint.#d
4de0: 65 66 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33  efine getVarint3
4df0: 32 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  2  sqlite3GetVar
4e00: 69 6e 74 33 32 0a 23 64 65 66 69 6e 65 20 70 75  int32.#define pu
4e10: 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c 69 74  tVarint    sqlit
4e20: 65 33 50 75 74 56 61 72 69 6e 74 0a 0a 2f 2a 20  e3PutVarint../* 
4e30: 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  The database pag
4e40: 65 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  e the PENDING_BY
4e50: 54 45 20 6f 63 63 75 70 69 65 73 2e 20 54 68 69  TE occupies. Thi
4e60: 73 20 70 61 67 65 20 69 73 20 6e 65 76 65 72 20  s page is never 
4e70: 75 73 65 64 2e 0a 2a 2a 20 54 4f 44 4f 3a 20 54  used..** TODO: T
4e80: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 76 65 72  his macro is ver
4e90: 79 20 73 69 6d 69 6c 61 72 79 20 74 6f 20 50 41  y similary to PA
4ea0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 29 20 69 6e  GER_MJ_PGNO() in
4eb0: 20 70 61 67 65 72 2e 63 2e 20 54 68 65 79 0a 2a   pager.c. They.*
4ec0: 2a 20 73 68 6f 75 6c 64 20 70 6f 73 73 69 62 6c  * should possibl
4ed0: 79 20 62 65 20 63 6f 6e 73 6f 6c 69 64 61 74 65  y be consolidate
4ee0: 64 20 28 70 72 65 73 75 6d 61 62 6c 79 20 69 6e  d (presumably in
4ef0: 20 70 61 67 65 72 2e 68 29 2e 0a 2a 2f 0a 23 64   pager.h)..*/.#d
4f00: 65 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59  efine PENDING_BY
4f10: 54 45 5f 50 41 47 45 28 70 42 74 29 20 28 28 50  TE_PAGE(pBt) ((P
4f20: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 70 42 74  ENDING_BYTE/(pBt
4f30: 29 2d 3e 70 61 67 65 53 69 7a 65 29 2b 31 29 0a  )->pageSize)+1).
4f40: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64 20  ./*.** A linked 
4f50: 6c 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  list of the foll
4f60: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 73  owing structures
4f70: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 42 74   is stored at Bt
4f80: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a 2a  Shared.pLock..**
4f90: 20 4c 6f 63 6b 73 20 61 72 65 20 61 64 64 65 64   Locks are added
4fa0: 20 28 6f 72 20 75 70 67 72 61 64 65 64 20 66 72   (or upgraded fr
4fb0: 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74 6f 20  om READ_LOCK to 
4fc0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68 65 6e  WRITE_LOCK) when
4fd0: 20 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20 69 73   a cursor .** is
4fe0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 74   opened on the t
4ff0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
5000: 61 67 65 20 42 74 53 68 61 72 65 64 2e 69 54 61  age BtShared.iTa
5010: 62 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65 20 72  ble. Locks are r
5020: 65 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  emoved.** from t
5030: 68 69 73 20 6c 69 73 74 20 77 68 65 6e 20 61 20  his list when a 
5040: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5050: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
5060: 65 64 20 62 61 63 6b 2c 20 6f 72 20 77 68 65 6e  ed back, or when
5070: 0a 2a 2a 20 61 20 62 74 72 65 65 20 68 61 6e 64  .** a btree hand
5080: 6c 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  le is closed..*/
5090: 0a 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20 7b  .struct BtLock {
50a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
50b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  ;        /* Btre
50c0: 65 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69 6e 67  e handle holding
50d0: 20 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20 20   this lock */.  
50e0: 50 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20 20 20  Pgno iTable;    
50f0: 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
5100: 67 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  ge of table */. 
5110: 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20   u8 eLock;      
5120: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 44 5f 4c         /* READ_L
5130: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
5140: 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  K */.  BtLock *p
5150: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Next;        /* 
5160: 4e 65 78 74 20 69 6e 20 42 74 53 68 61 72 65 64  Next in BtShared
5170: 2e 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a 7d  .pLock list */.}
5180: 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74 65 20  ;../* Candidate 
5190: 76 61 6c 75 65 73 20 66 6f 72 20 42 74 4c 6f 63  values for BtLoc
51a0: 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69  k.eLock */.#defi
51b0: 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20 20 20  ne READ_LOCK    
51c0: 20 31 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45   1.#define WRITE
51d0: 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69 66 64  _LOCK    2..#ifd
51e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
51f0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
5200: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
5210: 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  ons queryTableLo
5220: 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28  ck(), lockTable(
5230: 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54  ) and unlockAllT
5240: 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e  ables().  ** man
5250: 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20  ipulate entries 
5260: 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  in the BtShared.
5270: 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73  pLock linked lis
5280: 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  t used to store.
5290: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
52a0: 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f  e table level lo
52b0: 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72  cks. If the libr
52c0: 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ary is compiled 
52d0: 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68  with the.  ** sh
52e0: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
52f0: 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  re disabled, the
5300: 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  n there is only 
5310: 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20  ever one user.  
5320: 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61  ** of each BtSha
5330: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e  red structure an
5340: 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e  d so this lockin
5350: 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  g is not necessa
5360: 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66  ry. .  ** So def
5370: 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c  ine the lock rel
5380: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61  ated functions a
5390: 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20  s no-ops..  */. 
53a0: 20 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61   #define queryTa
53b0: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
53c0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
53d0: 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62  ne lockTable(a,b
53e0: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
53f0: 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c  #define unlockAl
5400: 6c 54 61 62 6c 65 73 28 61 29 0a 20 20 23 64 65  lTables(a).  #de
5410: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5420: 6f 72 50 6f 73 69 74 69 6f 6e 28 61 2c 62 29 20  orPosition(a,b) 
5430: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
5440: 69 6e 65 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  ine saveAllCurso
5450: 72 73 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  rs(a,b,c) SQLITE
5460: 5f 4f 4b 0a 0a 23 65 6c 73 65 0a 0a 2f 2a 0a 2a  _OK..#else../*.*
5470: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
5480: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
5490: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
54a0: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
54b0: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
54c0: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
54d0: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
54e0: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
54f0: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
5500: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
5510: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
5520: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5530: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5540: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5550: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5560: 3e 65 53 74 61 74 65 7c 7c 20 43 55 52 53 4f 52  >eState|| CURSOR
5570: 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
5580: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5590: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
55a0: 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  y );..  if( pCur
55b0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
55c0: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63  _VALID ){.    rc
55d0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
55e0: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
55f0: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 20 20  ur->nKey);..    
5600: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
5610: 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74   intKey table, t
5620: 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61  hen the above ca
5630: 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69  ll to BtreeKeySi
5640: 7a 65 28 29 0a 20 20 20 20 2a 2a 20 73 74 6f 72  ze().    ** stor
5650: 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  es the integer k
5660: 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ey in pCur->nKey
5670: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
5680: 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 20  his value is.   
5690: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
56a0: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
56b0: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
56c0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
56d0: 6e 74 4b 65 79 0a 20 20 20 20 2a 2a 20 74 61 62  ntKey.    ** tab
56e0: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
56f0: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
5700: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
5710: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
5720: 0a 20 20 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20  .    ** data..  
5730: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
5740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
5750: 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  =pCur->pPage->in
5760: 74 4b 65 79 29 7b 0a 20 20 20 20 20 20 76 6f 69  tKey){.      voi
5770: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
5780: 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65  Malloc(pCur->nKe
5790: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b  y);.      if( pK
57a0: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ey ){.        rc
57b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
57c0: 65 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75 72  ey(pCur, 0, pCur
57d0: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
57e0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
57f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5800: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5810: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 20   = pKey;.       
5820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5830: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
5840: 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
5850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5870: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
5880: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5890: 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  !pCur->pPage->in
58a0: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
58b0: 4b 65 79 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Key );..    /* T
58c0: 6f 64 6f 3a 20 53 68 6f 75 6c 64 20 77 65 20 64  odo: Should we d
58d0: 72 6f 70 20 74 68 65 20 72 65 66 65 72 65 6e 63  rop the referenc
58e0: 65 20 74 6f 20 70 43 75 72 2d 3e 70 50 61 67 65  e to pCur->pPage
58f0: 20 68 65 72 65 3f 20 2a 2f 0a 0a 20 20 20 20 69   here? */..    i
5900: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5910: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
5920: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5930: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 20  REQUIRESEEK;.   
5940: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
5950: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5960: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5970: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5980: 65 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f  except pExcept o
5990: 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  pen on the table
59a0: 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70   .** with root-p
59b0: 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c  age iRoot. Usual
59c0: 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ly, this is call
59d0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
59e0: 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74  ursor.** pExcept
59f0: 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69   is used to modi
5a00: 66 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74  fy the table (Bt
5a10: 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
5a20: 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a  treeInsert())..*
5a30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
5a40: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
5a50: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5a60: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
5a70: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
5a80: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20  ursor *p;.  if( 
5a90: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
5aa0: 61 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61  a()->useSharedDa
5ab0: 74 61 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d  ta ){.    for(p=
5ac0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
5ad0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
5ae0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5af0: 70 74 20 26 26 20 70 2d 3e 70 67 6e 6f 52 6f 6f  pt && p->pgnoRoo
5b00: 74 3d 3d 69 52 6f 6f 74 20 26 26 20 70 2d 3e 65  t==iRoot && p->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5b20: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5b30: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5b40: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5b50: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5b60: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5b70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5b80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5ba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
5bc0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
5bd0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5be0: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5bf0: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5c00: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5c10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5c20: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5c30: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5c40: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5c50: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5c60: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5c70: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5c80: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
5c90: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
5ca0: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
5cb0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5cc0: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
5cd0: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5ce0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5cf0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
5d00: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 72 67  ond argument arg
5d10: 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65 6b 20 2d  ument - doSeek -
5d20: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
5d30: 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 72  instead of .** r
5d40: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 63 75 72  eturning the cur
5d50: 73 6f 72 20 74 6f 20 69 74 27 73 20 73 61 76 65  sor to it's save
5d60: 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 79 20  d position, any 
5d70: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
5d80: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  s deleted.** and
5d90: 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
5da0: 65 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  e set to CURSOR_
5db0: 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 73 74 61 74  INVALID..*/.stat
5dc0: 69 63 20 69 6e 74 20 72 65 73 74 6f 72 65 43 75  ic int restoreCu
5dd0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5de0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5df0: 20 64 6f 53 65 65 6b 29 7b 0a 20 20 69 6e 74 20   doSeek){.  int 
5e00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5e10: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5e20: 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te==CURSOR_REQUI
5e30: 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 61 73  RESEEK ){.    as
5e40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 54 68 72  sert( sqlite3Thr
5e50: 65 61 64 44 61 74 61 28 29 2d 3e 75 73 65 53 68  eadData()->useSh
5e60: 61 72 65 64 44 61 74 61 20 29 3b 0a 20 20 20 20  aredData );.    
5e70: 69 66 28 20 64 6f 53 65 65 6b 20 29 7b 0a 20 20  if( doSeek ){.  
5e80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5e90: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
5ea0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
5eb0: 75 72 2d 3e 6e 4b 65 79 2c 20 26 70 43 75 72 2d  ur->nKey, &pCur-
5ec0: 3e 73 6b 69 70 29 3b 0a 20 20 20 20 7d 65 6c 73  >skip);.    }els
5ed0: 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  e{.      pCur->e
5ee0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5ef0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20  NVALID;.    }.  
5f00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5f10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
5f20: 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  iteFree(pCur->pK
5f30: 65 79 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ey);.      pCur-
5f40: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 20  >pKey = 0;.     
5f50: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
5f60: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
5f70: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 49 4e  ate || CURSOR_IN
5f80: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
5f90: 61 74 65 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ate );.    }.  }
5fa0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5fb0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
5fc0: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
5fd0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
5fe0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
5ff0: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
6000: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
6010: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
6020: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
6030: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
6040: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
6050: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
6060: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
6070: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
6080: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
6090: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
60a0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
60b0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
60c0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
60d0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
60e0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
60f0: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
6100: 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69  er;..  /* This i
6110: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
6120: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
6130: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
6140: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
6150: 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 75 73  ThreadData()->us
6160: 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20  eSharedData ){. 
6170: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6180: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
6190: 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20  his (along with 
61a0: 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20  lockTable()) is 
61b0: 77 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e  where the ReadUn
61c0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
61d0: 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  s.  ** dealt wit
61e0: 68 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  h. If the caller
61f0: 20 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72   is querying for
6200: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64   a read-lock and
6210: 20 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a   the flag is.  *
6220: 2a 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63  * set, it is unc
6230: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61  onditionally gra
6240: 6e 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74  nted - even if t
6250: 68 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c  here are write-l
6260: 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ocks.  ** on the
6270: 20 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69   table. If a wri
6280: 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  te-lock is reque
6290: 73 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e  sted, the ReadUn
62a0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20  committed flag. 
62b0: 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69   ** is not consi
62c0: 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dered..  **.  **
62d0: 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63   In function loc
62e0: 6b 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72  kTable(), if a r
62f0: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61  ead-lock is dema
6300: 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20  nded and the .  
6310: 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  ** ReadUncommitt
6320: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
6330: 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65  no entry is adde
6340: 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c  d to the locks l
6350: 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61  ist .  ** (BtSha
6360: 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a  red.pLock)..  **
6370: 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69  .  ** To summari
6380: 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55  ze: If the ReadU
6390: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
63a0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61  is set, then rea
63b0: 64 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a  d cursors do.  *
63c0: 2a 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20  * not create or 
63d0: 72 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f  respect table lo
63e0: 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67  cks. The locking
63f0: 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61   procedure for a
6400: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72   .  ** write-cur
6410: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  sor does not cha
6420: 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
6430: 0a 20 20 20 20 21 70 2d 3e 70 53 71 6c 69 74 65  .    !p->pSqlite
6440: 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e   || .    0==(p->
6450: 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53  pSqlite->flags&S
6460: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
6470: 69 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65  itted) || .    e
6480: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
6490: 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41   ||.    iTab==MA
64a0: 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20  STER_ROOT.  ){. 
64b0: 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
64c0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
64d0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
64e0: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
64f0: 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
6500: 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  && pIter->iTable
6510: 3d 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20 20  ==iTab && .     
6520: 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f       (pIter->eLo
6530: 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f  ck!=eLock || eLo
6540: 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29  ck!=READ_LOCK) )
6550: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6560: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
6570: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6580: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6590: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
65a0: 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dd a lock on the
65b0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
65c0: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20  -page iTable to 
65d0: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
65e0: 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65   used.** by Btre
65f0: 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61  e handle p. Para
6600: 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74  meter eLock must
6610: 20 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f   be either READ_
6620: 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54  LOCK or .** WRIT
6630: 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51  E_LOCK..**.** SQ
6640: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6650: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
6660: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
6670: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55  fully. SQLITE_BU
6680: 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  SY and.** SQLITE
6690: 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20  _NOMEM may also 
66a0: 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  be returned..*/.
66b0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
66c0: 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50  able(Btree *p, P
66d0: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
66e0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
66f0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
6700: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
6710: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
6720: 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69  pIter;..  /* Thi
6730: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
6740: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
6750: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
6760: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
6770: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d  te3ThreadData()-
6780: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 29  >useSharedData )
6790: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
67a0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
67b0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b  ssert( SQLITE_OK
67c0: 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  ==queryTableLock
67d0: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
67e0: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
67f0: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
6800: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
6810: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
6820: 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a 20 20  is requested,.  
6830: 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20  ** return early 
6840: 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61  without adding a
6850: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42  n entry to the B
6860: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
6870: 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d  st. See.  ** com
6880: 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ment in function
6890: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
68a0: 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20  ) for more info 
68b0: 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a  on handling .  *
68c0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
68d0: 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f  itted flag..  */
68e0: 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e  .  if( .    (p->
68f0: 70 53 71 6c 69 74 65 29 20 26 26 20 0a 20 20 20  pSqlite) && .   
6900: 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c   (p->pSqlite->fl
6910: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
6920: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a  ncommitted) && .
6930: 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44      (eLock==READ
6940: 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54  _LOCK) &&.    iT
6950: 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f  able!=MASTER_ROO
6960: 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  T.  ){.    retur
6970: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6980: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61  ..  /* First sea
6990: 72 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72  rch the list for
69a0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63   an existing loc
69b0: 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  k on this table.
69c0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   */.  for(pIter=
69d0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
69e0: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
69f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6a00: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
6a10: 54 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e  Table && pIter->
6a20: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
6a30: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72     pLock = pIter
6a40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6a50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
6a60: 66 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72  f the above sear
6a70: 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  ch did not find 
6a80: 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20  a BtLock struct 
6a90: 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65  associating Btre
6aa0: 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61  e p.  ** with ta
6ab0: 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f  ble iTable, allo
6ac0: 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e  cate one and lin
6ad0: 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  k it into the li
6ae0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  st..  */.  if( !
6af0: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
6b00: 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73  ck = (BtLock *)s
6b10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
6b20: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
6b30: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
6b40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6b50: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6b60: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
6b70: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
6b80: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
6b90: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
6ba0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
6bb0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
6bc0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
6bd0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
6be0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
6bf0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
6c00: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
6c10: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
6c20: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
6c30: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
6c40: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
6c50: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
6c60: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
6c70: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
6c80: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
6c90: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
6ca0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
6cb0: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
6cc0: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
6cd0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
6ce0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
6cf0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
6d00: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
6d10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6d20: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
6d30: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
6d40: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
6d50: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74  d via calls to t
6d60: 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a  he lockTable().*
6d70: 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  * procedure) hel
6d80: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
6d90: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
6da0: 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  oid unlockAllTab
6db0: 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  les(Btree *p){. 
6dc0: 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72   BtLock **ppIter
6dd0: 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70 4c 6f 63   = &p->pBt->pLoc
6de0: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  k;..  /* If the 
6df0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 65 78 74  shared-cache ext
6e00: 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74 20 65 6e  ension is not en
6e10: 61 62 6c 65 64 2c 20 74 68 65 72 65 20 73 68 6f  abled, there sho
6e20: 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a 2a 20 6c  uld be no.  ** l
6e30: 6f 63 6b 73 20 69 6e 20 74 68 65 20 42 74 53 68  ocks in the BtSh
6e40: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2c  ared.pLock list,
6e50: 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 70 72 6f   making this pro
6e60: 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f 70 2e 20  cedure a no-op. 
6e70: 41 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74  Assert.  ** that
6e80: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
6e90: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
6ea0: 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  ( sqlite3ThreadD
6eb0: 61 74 61 28 29 2d 3e 75 73 65 53 68 61 72 65 64  ata()->useShared
6ec0: 44 61 74 61 20 7c 7c 20 30 3d 3d 2a 70 70 49 74  Data || 0==*ppIt
6ed0: 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  er );..  while( 
6ee0: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
6ef0: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
6f00: 70 70 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20  ppIter;.    if( 
6f10: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
6f20: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65   ){.      *ppIte
6f30: 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  r = pLock->pNext
6f40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
6f50: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ee(pLock);.    }
6f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74  else{.      ppIt
6f70: 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65  er = &pLock->pNe
6f80: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
6f90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6fa0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
6fb0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
6fc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6fd0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ACUUM./*.** Thes
6fe0: 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20  e macros define 
6ff0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
7000: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
7010: 65 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a 20  entry for a .** 
7020: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
7030: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7040: 74 20 74 6f 20 65 61 63 68 20 69 73 20 74 68 65  t to each is the
7050: 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   number of usabl
7060: 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65 61  e.** bytes on ea
7070: 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ch page of the d
7080: 61 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20 31  atabase (often 1
7090: 30 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  024). The second
70a0: 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
70b0: 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20 75  number to look u
70c0: 70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  p in the pointer
70d0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d   map..**.** PTRM
70e0: 41 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72 6e  AP_PAGENO return
70f0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  s the database p
7100: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
7110: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
7120: 20 70 61 67 65 20 74 68 61 74 20 73 74 6f 72 65   page that store
7130: 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 70  s the required p
7140: 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f 50  ointer. PTRMAP_P
7150: 54 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e 73  TROFFSET returns
7160: 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f  .** the offset o
7170: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
7180: 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  map entry..**.**
7190: 20 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72 67   If the pgno arg
71a0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
71b0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69 73  PTRMAP_PAGENO is
71c0: 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
71d0: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67 6e  age,.** then pgn
71e0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 53  o is returned. S
71f0: 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  o (pgno==PTRMAP_
7200: 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e  PAGENO(pgsz, pgn
7210: 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75 73  o)) can be.** us
7220: 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 70 67  ed to test if pg
7230: 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d  no is a pointer-
7240: 6d 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41 50  map page. PTRMAP
7250: 5f 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65 6e  _ISPAGE implemen
7260: 74 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74 2e  ts.** this test.
7270: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  .*/.#define PTRM
7280: 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20  AP_PAGENO(pgsz, 
7290: 70 67 6e 6f 29 20 28 28 28 70 67 6e 6f 2d 32 29  pgno) (((pgno-2)
72a0: 2f 28 70 67 73 7a 2f 35 2b 31 29 29 2a 28 70 67  /(pgsz/5+1))*(pg
72b0: 73 7a 2f 35 2b 31 29 2b 32 29 0a 23 64 65 66 69  sz/5+1)+2).#defi
72c0: 6e 65 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46  ne PTRMAP_PTROFF
72d0: 53 45 54 28 70 67 73 7a 2c 20 70 67 6e 6f 29 20  SET(pgsz, pgno) 
72e0: 28 28 28 70 67 6e 6f 2d 32 29 25 28 70 67 73 7a  (((pgno-2)%(pgsz
72f0: 2f 35 2b 31 29 2d 31 29 2a 35 29 0a 23 64 65 66  /5+1)-1)*5).#def
7300: 69 6e 65 20 50 54 52 4d 41 50 5f 49 53 50 41 47  ine PTRMAP_ISPAG
7310: 45 28 70 67 73 7a 2c 20 70 67 6e 6f 29 20 28 50  E(pgsz, pgno) (P
7320: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73  TRMAP_PAGENO(pgs
7330: 7a 2c 70 67 6e 6f 29 3d 3d 70 67 6e 6f 29 0a 0a  z,pgno)==pgno)..
7340: 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  /*.** The pointe
7350: 72 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75  r map is a looku
7360: 70 20 74 61 62 6c 65 20 74 68 61 74 20 69 64 65  p table that ide
7370: 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65  ntifies the pare
7380: 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65  nt page for.** e
7390: 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 69  ach child page i
73a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
73b0: 69 6c 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74  ile.  The parent
73c0: 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
73d0: 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69  e that.** contai
73e0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
73f0: 74 68 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72  the child.  Ever
7400: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  y page in the da
7410: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a  tabase contains.
7420: 2a 2a 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74  ** 0 or 1 parent
7430: 20 70 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69   pages.  (In thi
7440: 73 20 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62  s context 'datab
7450: 61 73 65 20 70 61 67 65 27 20 72 65 66 65 72 73  ase page' refers
7460: 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20  .** to any page 
7470: 74 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74  that is not part
7480: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
7490: 6d 61 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61  map itself.)  Ea
74a0: 63 68 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a  ch pointer map.*
74b0: 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73  * entry consists
74c0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74   of a single byt
74d0: 65 20 27 74 79 70 65 27 20 61 6e 64 20 61 20 34  e 'type' and a 4
74e0: 20 62 79 74 65 20 70 61 72 65 6e 74 20 70 61 67   byte parent pag
74f0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65  e number..** The
7500: 20 50 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e   PTRMAP_XXX iden
7510: 74 69 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72  tifiers below ar
7520: 65 20 74 68 65 20 76 61 6c 69 64 20 74 79 70 65  e the valid type
7530: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72  s..**.** The pur
7540: 70 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  pose of the poin
7550: 74 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61  ter map is to fa
7560: 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61  cility moving pa
7570: 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ges from one.** 
7580: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
7590: 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  file to another 
75a0: 61 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76  as part of autov
75b0: 61 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70  acuum.  When a p
75c0: 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c  age.** is moved,
75d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20   the pointer in 
75e0: 69 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20  its parent must 
75f0: 62 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f  be updated to po
7600: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65  int to the.** ne
7610: 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65  w location.  The
7620: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
7630: 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
7640: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 71  he parent page q
7650: 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54  uickly..**.** PT
7660: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54  RMAP_ROOTPAGE: T
7670: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
7680: 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e   is a root-page.
7690: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
76a0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64              used
76c0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
76d0: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45  *.** PTRMAP_FREE
76e0: 50 41 47 45 3a 20 54 68 65 20 64 61 74 61 62 61  PAGE: The databa
76f0: 73 65 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e  se page is an un
7700: 75 73 65 64 20 28 66 72 65 65 29 20 70 61 67 65  used (free) page
7710: 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  . The page-numbe
7720: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
7730: 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73         is not us
7740: 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
7750: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
7760: 45 52 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74  ERFLOW1: The dat
7770: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68  abase page is th
7780: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
7790: 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20  a list of .**   
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77b0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
77c0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
77d0: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
77e0: 61 67 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  age that.**     
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7800: 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
7810: 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74  with a pointer t
7820: 6f 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  o this overflow 
7830: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  page..**.** PTRM
7840: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68  AP_OVERFLOW2: Th
7850: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7860: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  is the second or
7870: 20 6c 61 74 65 72 20 70 61 67 65 20 69 6e 20 61   later page in a
7880: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
78a0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
78b0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64  e page-number id
78c0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65  entifies the pre
78d0: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  vious.**        
78e0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
78f0: 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
7900: 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  page list..**.**
7910: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54   PTRMAP_BTREE: T
7920: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
7930: 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62   is a non-root b
7940: 74 72 65 65 20 70 61 67 65 2e 20 54 68 65 20 70  tree page. The p
7950: 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  age number.**   
7960: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e              iden
7970: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e  tifies the paren
7980: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 74  t page in the bt
7990: 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ree..*/.#define 
79a0: 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
79b0: 31 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  1.#define PTRMAP
79c0: 5f 46 52 45 45 50 41 47 45 20 32 0a 23 64 65 66  _FREEPAGE 2.#def
79d0: 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  ine PTRMAP_OVERF
79e0: 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50  LOW1 3.#define P
79f0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
7a00: 34 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  4.#define PTRMAP
7a10: 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20  _BTREE 5../*.** 
7a20: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7a30: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7a40: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7a50: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7a60: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7a70: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7a80: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7a90: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7aa0: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7ab0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7ac0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7ad0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7ae0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
7af0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7b00: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7b10: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7b20: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
7b30: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7b40: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
7b50: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
7b60: 7b 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  {.  u8 *pPtrmap;
7b70: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7b80: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7b90: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7ba0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7bb0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
7bc0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
7bd0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7be0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7bf0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ge */.  int rc;.
7c00: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7c10: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7c20: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7c30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c40: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7c50: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
7c60: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2d  RMAP_PAGENO(pBt-
7c70: 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 6b 65 79  >usableSize, key
7c80: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7c90: 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
7ca0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
7cb0: 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d   (void **)&pPtrm
7cc0: 61 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ap);.  if( rc!=S
7cd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7ce0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7cf0: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
7d00: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2d 3e  _PTROFFSET(pBt->
7d10: 75 73 61 62 6c 65 53 69 7a 65 2c 20 6b 65 79 29  usableSize, key)
7d20: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
7d30: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
7d40: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
7d50: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
7d60: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
7d70: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
7d80: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
7d90: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
7da0: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
7db0: 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
7dc0: 72 5f 77 72 69 74 65 28 70 50 74 72 6d 61 70 29  r_write(pPtrmap)
7dd0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
7de0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7df0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
7e00: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
7e10: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
7e20: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
7e30: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
7e40: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
7e50: 75 6e 72 65 66 28 70 50 74 72 6d 61 70 29 3b 0a  unref(pPtrmap);.
7e60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7e70: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
7e80: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
7e90: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
7ea0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
7eb0: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
7ec0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
7ed0: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
7ee0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
7ef0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
7f00: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
7f10: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
7f20: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
7f30: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
7f40: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
7f50: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7f60: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
7f70: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
7f80: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
7f90: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7fa0: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
7fb0: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
7fc0: 7b 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  {.  int iPtrmap;
7fd0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7fe0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
7ff0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
8000: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8010: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
8020: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
8030: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
8040: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
8050: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
8060: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 50 74 72   int rc;..  iPtr
8070: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
8080: 45 4e 4f 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  ENO(pBt->usableS
8090: 69 7a 65 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  ize, key);.  rc 
80a0: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
80b0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
80c0: 69 50 74 72 6d 61 70 2c 20 28 76 6f 69 64 20 2a  iPtrmap, (void *
80d0: 2a 29 26 70 50 74 72 6d 61 70 29 3b 0a 20 20 69  *)&pPtrmap);.  i
80e0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
80f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
8100: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
8110: 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2d  P_PTROFFSET(pBt-
8120: 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 6b 65 79  >usableSize, key
8130: 29 3b 0a 20 20 69 66 28 20 70 45 54 79 70 65 20  );.  if( pEType 
8140: 29 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72  ) *pEType = pPtr
8150: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
8160: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
8170: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
8180: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
8190: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  ;..  sqlite3page
81a0: 72 5f 75 6e 72 65 66 28 70 50 74 72 6d 61 70 29  r_unref(pPtrmap)
81b0: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
81c0: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
81d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
81e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
81f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8200: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
8210: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8220: 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  CUUM */../*.** G
8230: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
8240: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
8250: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
8260: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
8270: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
8280: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
8290: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
82a0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
82b0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
82c0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
82d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
82e0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
82f0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8300: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8310: 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
8320: 20 75 38 20 2a 66 69 6e 64 43 65 6c 6c 28 4d 65   u8 *findCell(Me
8330: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8340: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a  t iCell){.  u8 *
8350: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8360: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ata;.  assert( i
8370: 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Cell>=0 );.  ass
8380: 65 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62  ert( iCell<get2b
8390: 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
83a0: 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29  >hdrOffset+3]) )
83b0: 3b 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 20  ;.  return data 
83c0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
83d0: 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
83e0: 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a  et+2*iCell]);.}.
83f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
8400: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
8410: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
8420: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
8430: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
8440: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
8450: 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e  w cells.  See in
8460: 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sert.*/.static u
8470: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
8480: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
8490: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
84a0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
84b0: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
84c0: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
84d0: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
84e0: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
84f0: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
8500: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
8510: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
8520: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
8530: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
8540: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
8550: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
8560: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
8570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8580: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
8590: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
85a0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
85b0: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
85c0: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
85d0: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
85e0: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
85f0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8600: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
8610: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
8620: 75 6e 63 74 69 6f 6e 2e 20 20 70 61 72 73 65 43  unction.  parseC
8630: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 63 65  ell() takes a ce
8640: 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74  ll index.** as t
8650: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8660: 6e 74 20 61 6e 64 20 70 61 72 73 65 43 65 6c 6c  nt and parseCell
8670: 50 74 72 28 29 20 74 61 6b 65 73 20 61 20 70 6f  Ptr() takes a po
8680: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
8690: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
86a0: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
86b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
86c0: 69 63 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c  ic void parseCel
86d0: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
86e0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
86f0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8700: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8710: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8730: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8740: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8750: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
8760: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8770: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8780: 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  ){.  int n;     
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87a0: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
87b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
87c0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
87d0: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
87e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
87f0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
8800: 6f 61 64 20 2a 2f 0a 0a 20 20 70 49 6e 66 6f 2d  oad */..  pInfo-
8810: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
8820: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8830: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
8840: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
8850: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
8860: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
8870: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
8880: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
8890: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
88a0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
88b0: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
88c0: 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d   &nPayload);.  }
88d0: 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  else{.    nPaylo
88e0: 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 20  ad = 0;.  }.  n 
88f0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43  += getVarint(&pC
8900: 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26  ell[n], (u64 *)&
8910: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
8920: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
8930: 20 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61   n;.  pInfo->nDa
8940: 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ta = nPayload;. 
8950: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
8960: 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c  Key ){.    nPayl
8970: 6f 61 64 20 2b 3d 20 70 49 6e 66 6f 2d 3e 6e 4b  oad += pInfo->nK
8980: 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
8990: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
89a0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
89b0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
89c0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
89d0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
89e0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
89f0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8a00: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8a10: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8a20: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
8a30: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
8a40: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
8a50: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
8a60: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
8a70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8a80: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
8a90: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
8aa0: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
8ab0: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
8ac0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8ad0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
8ae0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
8af0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
8b00: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
8b10: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
8b20: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
8b30: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8b40: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8b50: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8b60: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8b70: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8b80: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8b90: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8ba0: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8bb0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8bc0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
8bd0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
8be0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
8bf0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
8c00: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8c10: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8c20: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8c30: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8c40: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8c50: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8c60: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8c70: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8c80: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8c90: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8ca0: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8cb0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8cc0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
8cd0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8ce0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8cf0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8d00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8d10: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8d20: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8d30: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8d40: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8d50: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8d60: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8d70: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8d80: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8d90: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8da0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8db0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8dc0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8dd0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8de0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8df0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
8e00: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8e10: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8e20: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8e30: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8e40: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8e50: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
8e60: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
8e70: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
8e80: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8e90: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
8ea0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
8eb0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
8ec0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
8ed0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
8ee0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
8ef0: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
8f00: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
8f10: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
8f20: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
8f30: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
8f40: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8f50: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8f60: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8f70: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f90: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
8fa0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
8fb0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8fc0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8fd0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
8fe0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
8ff0: 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
9000: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9010: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9020: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
9030: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9040: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9050: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9060: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9070: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9080: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9090: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
90a0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
90b0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
90c0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
90d0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
90e0: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
90f0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9100: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9110: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ll pointer..*/.#
9120: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
9130: 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a  atic int cellSiz
9140: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9150: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
9160: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
9170: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
9180: 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , iCell, &info);
9190: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
91a0: 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73  Size;.}.#endif.s
91b0: 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69  tatic int cellSi
91c0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
91d0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
91e0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
91f0: 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74  o;.  parseCellPt
9200: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
9210: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
9220: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
9230: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9240: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
9250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
9260: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
9270: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
9280: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
9290: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
92a0: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
92b0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
92c0: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
92d0: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
92e0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
92f0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
9300: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
9310: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
9320: 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20    if( pCell ){. 
9330: 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
9340: 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50  ;.    parseCellP
9350: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
9360: 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28   &info);.    if(
9370: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
9380: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
9390: 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
93a0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50  Local ){.      P
93b0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
93c0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
93d0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
93e0: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
93f0: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
9400: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
9410: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
9420: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
9430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9440: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
9450: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
9460: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
9470: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
9480: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9490: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
94a0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
94b0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
94c0: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
94d0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
94e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
94f0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
9500: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9510: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
9520: 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  Cell;.  pCell = 
9530: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
9540: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
9550: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
9560: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
9570: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   pCell);.}.#endi
9580: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 73 61 6e  f.../*.** Do san
9590: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
95a0: 61 20 70 61 67 65 2e 20 20 54 68 72 6f 77 20 61  a page.  Throw a
95b0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 61  n exception if a
95c0: 6e 79 74 68 69 6e 67 20 69 73 0a 2a 2a 20 6e 6f  nything is.** no
95d0: 74 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 54  t right..**.** T
95e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
95f0: 73 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  sed for internal
9600: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
9610: 6f 6e 6c 79 2e 20 20 49 74 20 69 73 20 6f 6d 69  only.  It is omi
9620: 74 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 6f 73  tted.** from mos
9630: 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  t builds..*/.#if
9640: 20 64 65 66 69 6e 65 64 28 42 54 52 45 45 5f 44   defined(BTREE_D
9650: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
9660: 64 28 4e 44 45 42 55 47 29 20 26 26 20 30 0a 73  d(NDEBUG) && 0.s
9670: 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
9680: 49 6e 74 65 67 72 69 74 79 28 4d 65 6d 50 61 67  Integrity(MemPag
9690: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
96a0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75   usableSize;.  u
96b0: 38 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 69  8 *data;.  int i
96c0: 2c 20 6a 2c 20 69 64 78 2c 20 63 2c 20 70 63 2c  , j, idx, c, pc,
96d0: 20 68 64 72 2c 20 6e 46 72 65 65 3b 0a 20 20 69   hdr, nFree;.  i
96e0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  nt cellOffset;. 
96f0: 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 63 65 6c 6c   int nCell, cell
9700: 4c 69 6d 69 74 3b 0a 20 20 75 38 20 2a 75 73 65  Limit;.  u8 *use
9710: 64 3b 0a 0a 20 20 75 73 65 64 20 3d 20 73 71 6c  d;..  used = sql
9720: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
9730: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
9740: 7a 65 20 29 3b 0a 20 20 69 66 28 20 75 73 65 64  ze );.  if( used
9750: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9760: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
9770: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9780: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
9790: 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 26 28 28  Page->aData==&((
97a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
97b0: 50 61 67 65 29 5b 2d 70 50 61 67 65 2d 3e 70 42  Page)[-pPage->pB
97c0: 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b 0a  t->pageSize] );.
97d0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
97e0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65  drOffset;.  asse
97f0: 72 74 28 20 68 64 72 3d 3d 28 70 50 61 67 65 2d  rt( hdr==(pPage-
9800: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
9810: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
9820: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
9830: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
9840: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61  umber(pPage->aDa
9850: 74 61 29 20 29 3b 0a 20 20 63 20 3d 20 70 50 61  ta) );.  c = pPa
9860: 67 65 2d 3e 61 44 61 74 61 5b 68 64 72 5d 3b 0a  ge->aData[hdr];.
9870: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
9880: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
9890: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  t( pPage->leaf =
98a0: 3d 20 28 28 63 20 26 20 50 54 46 5f 4c 45 41 46  = ((c & PTF_LEAF
98b0: 29 21 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  )!=0) );.    ass
98c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 7a 65 72 6f  ert( pPage->zero
98d0: 44 61 74 61 20 3d 3d 20 28 28 63 20 26 20 50 54  Data == ((c & PT
98e0: 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 29 20  F_ZERODATA)!=0) 
98f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9900: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
9910: 3d 20 28 28 63 20 26 20 50 54 46 5f 4c 45 41 46  = ((c & PTF_LEAF
9920: 44 41 54 41 29 21 3d 30 29 20 29 3b 0a 20 20 20  DATA)!=0) );.   
9930: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9940: 69 6e 74 4b 65 79 20 3d 3d 20 28 28 63 20 26 20  intKey == ((c & 
9950: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
9960: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 29 20 29  LEAFDATA))!=0) )
9970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9980: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 3d 0a  age->hasData ==.
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 21 28 70               !(p
99a0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c  Page->zeroData |
99b0: 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  | (!pPage->leaf 
99c0: 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  && pPage->leafDa
99d0: 74 61 29 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ta)) );.    asse
99e0: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
99f0: 66 66 73 65 74 3d 3d 70 50 61 67 65 2d 3e 68 64  ffset==pPage->hd
9a00: 72 4f 66 66 73 65 74 2b 31 32 2d 34 2a 70 50 61  rOffset+12-4*pPa
9a10: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
9a20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9a30: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
9a40: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 68 64  &pPage->aData[hd
9a50: 72 2b 33 5d 29 20 29 3b 0a 20 20 7d 0a 20 20 64  r+3]) );.  }.  d
9a60: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9a70: 74 61 3b 0a 20 20 6d 65 6d 73 65 74 28 75 73 65  ta;.  memset(use
9a80: 64 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65  d, 0, usableSize
9a90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
9aa0: 68 64 72 2b 31 30 2d 70 50 61 67 65 2d 3e 6c 65  hdr+10-pPage->le
9ab0: 61 66 2a 34 3b 20 69 2b 2b 29 20 75 73 65 64 5b  af*4; i++) used[
9ac0: 69 5d 20 3d 20 31 3b 0a 20 20 6e 46 72 65 65 20  i] = 1;.  nFree 
9ad0: 3d 20 30 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  = 0;.  pc = get2
9ae0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
9af0: 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 20  ]);.  while( pc 
9b00: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
9b10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
9b20: 30 20 26 26 20 70 63 3c 75 73 61 62 6c 65 53 69  0 && pc<usableSi
9b30: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 73 69 7a 65  ze-4 );.    size
9b40: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9b50: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 61 73  a[pc+2]);.    as
9b60: 73 65 72 74 28 20 70 63 2b 73 69 7a 65 3c 3d 75  sert( pc+size<=u
9b70: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9b80: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
9b90: 20 20 20 20 66 6f 72 28 69 3d 70 63 3b 20 69 3c      for(i=pc; i<
9ba0: 70 63 2b 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20  pc+size; i++){. 
9bb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65       assert( use
9bc0: 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  d[i]==0 );.     
9bd0: 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20   used[i] = 1;.  
9be0: 20 20 7d 0a 20 20 20 20 70 63 20 3d 20 67 65 74    }.    pc = get
9bf0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
9c00: 3b 0a 20 20 7d 0a 20 20 69 64 78 20 3d 20 30 3b  ;.  }.  idx = 0;
9c10: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
9c20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
9c30: 29 3b 0a 20 20 63 65 6c 6c 4c 69 6d 69 74 20 3d  );.  cellLimit =
9c40: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9c50: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
9c60: 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
9c70: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
9c80: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 6e   pPage->nFree==n
9c90: 46 72 65 65 2b 64 61 74 61 5b 68 64 72 2b 37 5d  Free+data[hdr+7]
9ca0: 2b 63 65 6c 6c 4c 69 6d 69 74 2d 28 63 65 6c 6c  +cellLimit-(cell
9cb0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 29 20  Offset+2*nCell) 
9cc0: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
9cd0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9ce0: 73 65 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  set;.  for(i=0; 
9cf0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
9d00: 20 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 20     int size;.   
9d10: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
9d20: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
9d30: 32 2a 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  2*i]);.    asser
9d40: 74 28 20 70 63 3e 30 20 26 26 20 70 63 3c 75 73  t( pc>0 && pc<us
9d50: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
9d60: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
9d70: 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  e(pPage, &data[p
9d80: 63 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c]);.    assert(
9d90: 20 70 63 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65   pc+size<=usable
9da0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 66 6f 72 28  Size );.    for(
9db0: 6a 3d 70 63 3b 20 6a 3c 70 63 2b 73 69 7a 65 3b  j=pc; j<pc+size;
9dc0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
9dd0: 65 72 74 28 20 75 73 65 64 5b 6a 5d 3d 3d 30 20  ert( used[j]==0 
9de0: 29 3b 0a 20 20 20 20 20 20 75 73 65 64 5b 6a 5d  );.      used[j]
9df0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
9e00: 20 20 66 6f 72 28 69 3d 63 65 6c 6c 4f 66 66 73    for(i=cellOffs
9e10: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 20 69 3c 63 65  et+2*nCell; i<ce
9e20: 6c 6c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20  llimit; i++){.  
9e30: 20 20 61 73 73 65 72 74 28 20 75 73 65 64 5b 69    assert( used[i
9e40: 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 65 64  ]==0 );.    used
9e50: 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e  [i] = 1;.  }.  n
9e60: 46 72 65 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Free = 0;.  for(
9e70: 69 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  i=0; i<usableSiz
9e80: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  e; i++){.    ass
9e90: 65 72 74 28 20 75 73 65 64 5b 69 5d 3c 3d 31 20  ert( used[i]<=1 
9ea0: 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 64 5b  );.    if( used[
9eb0: 69 5d 3d 3d 30 20 29 20 6e 46 72 65 65 2b 2b 3b  i]==0 ) nFree++;
9ec0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
9ed0: 46 72 65 65 3d 3d 64 61 74 61 5b 68 64 72 2b 37  Free==data[hdr+7
9ee0: 5d 20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ] );.  sqliteFre
9ef0: 65 28 75 73 65 64 29 3b 0a 7d 0a 23 64 65 66 69  e(used);.}.#defi
9f00: 6e 65 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  ne pageIntegrity
9f10: 28 58 29 20 5f 70 61 67 65 49 6e 74 65 67 72 69  (X) _pageIntegri
9f20: 74 79 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ty(X).#else.# de
9f30: 66 69 6e 65 20 70 61 67 65 49 6e 74 65 67 72 69  fine pageIntegri
9f40: 74 79 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ty(X).#endif../*
9f50: 20 41 20 62 75 6e 63 68 20 6f 66 20 61 73 73 65   A bunch of asse
9f60: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
9f70: 74 6f 20 63 68 65 63 6b 20 74 68 65 20 74 72 61  to check the tra
9f80: 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 76  nsaction state v
9f90: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 68  ariables.** of h
9fa0: 61 6e 64 6c 65 20 70 20 28 74 79 70 65 20 42 74  andle p (type Bt
9fb0: 72 65 65 2a 29 20 61 72 65 20 69 6e 74 65 72 6e  ree*) are intern
9fc0: 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
9fd0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62 74 72 65  .*/.#define btre
9fe0: 65 49 6e 74 65 67 72 69 74 79 28 70 29 20 5c 0a  eIntegrity(p) \.
9ff0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
a000: 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
a010: 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61   || p->pBt->nTra
a020: 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e 70 42 74 2d  nsaction<p->pBt-
a030: 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73 73  >nRef ); \.  ass
a040: 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 6e 54 72  ert( p->pBt->nTr
a050: 61 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d 3e 70 42  ansaction<=p->pB
a060: 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61  t->nRef ); \.  a
a070: 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69  ssert( p->pBt->i
a080: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
a090: 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70  ANS_NONE || p->p
a0a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
a0b0: 3d 3d 30 20 29 3b 20 5c 0a 20 20 61 73 73 65 72  ==0 ); \.  asser
a0c0: 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  t( p->pBt->inTra
a0d0: 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e 54  nsaction>=p->inT
a0e0: 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20  rans ); ../*.** 
a0f0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
a100: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
a110: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
a120: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
a130: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
a140: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
a150: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
a160: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
a170: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
a180: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
a190: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
a1a0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
a1b0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
a1c0: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
a1d0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
a1e0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
a1f0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a220: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
a250: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
a260: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a280: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
a290: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
a2a0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
a2b0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a2d0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
a2e0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
a2f0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
a300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a310: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
a320: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
a330: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a340: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
a350: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
a360: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
a370: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
a380: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
a390: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
a3a0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
a3b0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
a3c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a3d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
a3e0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
a3f0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
a400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a410: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
a420: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
a430: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a440: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
a450: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
a460: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
a470: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
a480: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
a490: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
a4a0: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
a4b0: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 50  r_iswriteable(pP
a4c0: 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
a4d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a4e0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
a4f0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
a500: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
a510: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
a520: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
a530: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
a540: 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ==0 );.  temp = 
a550: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
a560: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
a570: 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70  ze );.  if( temp
a580: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
a590: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74  ITE_NOMEM;.  dat
a5a0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a5b0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
a5c0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
a5d0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a5e0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a5f0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
a600: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
a610: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
a620: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
a630: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
a640: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a650: 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20  leSize;.  brk = 
a660: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a670: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
a680: 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61  (&temp[brk], &da
a690: 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  ta[brk], usableS
a6a0: 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72  ize - brk);.  br
a6b0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
a6c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
a6d0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
a6e0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
a6f0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
a700: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
a710: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
a720: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
a730: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
a740: 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65  pAddr);.    asse
a750: 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42  rt( pc<pPage->pB
a760: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
a770: 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c  .    size = cell
a780: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
a790: 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62  temp[pc]);.    b
a7a0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
a7b0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b  memcpy(&data[brk
a7c0: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
a7d0: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
a7e0: 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20  e(pAddr, brk);. 
a7f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b   }.  assert( brk
a800: 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  >=cellOffset+2*n
a810: 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79  Cell );.  put2by
a820: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a830: 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64   brk);.  data[hd
a840: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
a850: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
a860: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
a870: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
a880: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
a890: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
a8a0: 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b  ], 0, brk-addr);
a8b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65  .  sqliteFree(te
a8c0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mp);.  return SQ
a8d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a8e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
a8f0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
a900: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
a910: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
a920: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
a930: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
a940: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
a950: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
a960: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
a970: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
a980: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
a990: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
a9a0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
a9b0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
a9c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
a9d0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
a9e0: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
a9f0: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
aa00: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
aa10: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
aa20: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
aa30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
aa40: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
aa50: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
aa60: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
aa70: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
aa80: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
aa90: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
aaa0: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
aab0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
aac0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
aad0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
aae0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
aaf0: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
ab00: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
ab10: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
ab20: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
ab30: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
ab40: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
ab50: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
ab60: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
ab70: 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  rt( sqlite3pager
ab80: 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61 74  _iswriteable(dat
ab90: 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a) );.  assert( 
aba0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
abb0: 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42  if( nByte<4 ) nB
abc0: 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70  yte = 4;.  if( p
abd0: 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74  Page->nFree<nByt
abe0: 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  e || pPage->nOve
abf0: 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e  rflow>0 ) return
ac00: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   0;.  pPage->nFr
ac10: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68  ee -= nByte;.  h
ac20: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
ac30: 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20  ffset;..  nFrag 
ac40: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
ac50: 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b   if( nFrag<60 ){
ac60: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
ac70: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
ac80: 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62  ing for a slot b
ac90: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
aca0: 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  isfy the.    ** 
acb0: 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a  space request. *
acc0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72  /.    addr = hdr
acd0: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +1;.    while( (
ace0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
acf0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
ad00: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
ad10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
ad20: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2]);.      if( s
ad30: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
ad40: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e        if( size<n
ad50: 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20  Byte+4 ){.      
ad60: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
ad70: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
ad80: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
ad90: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e   data[hdr+7] = n
ada0: 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42  Frag + size - nB
adb0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  yte;.          r
adc0: 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20  eturn pc;.      
add0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ade0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
adf0: 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42  a[pc+2], size-nB
ae00: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  yte);.          
ae10: 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65  return pc + size
ae20: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
ae30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ae40: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
ae50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
ae60: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
ae70: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
ae80: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
ae90: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
aea0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
aeb0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
aec0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
aed0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
aee0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
aef0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
af00: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
af10: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
af20: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
af30: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
af40: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
af50: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
af60: 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74    if( defragment
af70: 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65  Page(pPage) ) re
af80: 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20  turn 0;.    top 
af90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
afa0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
afb0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
afc0: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
afd0: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
afe0: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
aff0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b000: 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  top);.  return t
b010: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
b020: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
b030: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
b040: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
b050: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
b060: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
b070: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
b080: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
b090: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
b0a0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
b0b0: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
b0c0: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
b0d0: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
b0e0: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
b0f0: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
b100: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
b110: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
b120: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
b130: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
b140: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
b150: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
b160: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
b170: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
b180: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
b190: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
b1a0: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
b1b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b1c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b1d0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
b1e0: 77 72 69 74 65 61 62 6c 65 28 64 61 74 61 29 20  writeable(data) 
b1f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
b200: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
b210: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
b220: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
b230: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
b240: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
b250: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
b260: 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73    if( size<4 ) s
b270: 69 7a 65 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 41  ize = 4;..  /* A
b280: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
b290: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
b2a0: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
b2b0: 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20  ocks */.  hdr = 
b2c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b2d0: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
b2e0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
b2f0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
b300: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
b310: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
b320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b330: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
b340: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
b350: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b360: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
b370: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
b380: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
b390: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
b3a0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
b3b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 62 65  );.  assert( pbe
b3c0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
b3d0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
b3e0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
b3f0: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
b400: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
b410: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
b420: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
b430: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
b440: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73  Page->nFree += s
b450: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
b460: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
b470: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
b480: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b490: 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69  ffset + 1;.  whi
b4a0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
b4b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
b4c0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
b4d0: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a  t pnext, psize;.
b4e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
b4f0: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
b500: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
b510: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b520: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
b530: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
b540: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
b550: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
b560: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b570: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
b580: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
b590: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
b5a0: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
b5b0: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
b5c0: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
b5d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b5e0: 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65  frag<=data[pPage
b5f0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29  ->hdrOffset+7] )
b600: 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  ;.      data[pPa
b610: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
b620: 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20   -= frag;.      
b630: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
b640: 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65  begin], get2byte
b650: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b  (&data[pnext]));
b660: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
b670: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
b680: 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28   pnext+get2byte(
b690: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d  &data[pnext+2])-
b6a0: 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c  pbegin);.    }el
b6b0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
b6c0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
b6d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
b6e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
b6f0: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
b700: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
b710: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
b720: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
b730: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
b740: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
b750: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
b760: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
b770: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b780: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
b790: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
b7a0: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
b7b0: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
b7c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b7d0: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  r+5]);.    put2b
b7e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b7f0: 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65  , top + get2byte
b800: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
b810: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
b820: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
b830: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
b840: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
b850: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
b860: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
b870: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
b880: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
b890: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
b8a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
b8b0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
b8c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
b8d0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
b8e0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
b8f0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
b900: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
b910: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
b920: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
b930: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
b940: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e  ) );.  pPage->in
b950: 74 4b 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65  tKey = (flagByte
b960: 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50   & (PTF_INTKEY|P
b970: 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30  TF_LEAFDATA))!=0
b980: 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44  ;.  pPage->zeroD
b990: 61 74 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20  ata = (flagByte 
b9a0: 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
b9b0: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61  =0;.  pPage->lea
b9c0: 66 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  f = (flagByte & 
b9d0: 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20  PTF_LEAF)!=0;.  
b9e0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b9f0: 69 7a 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e  ize = 4*(pPage->
ba00: 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20  leaf==0);.  pBt 
ba10: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
ba20: 69 66 28 20 66 6c 61 67 42 79 74 65 20 26 20 50  if( flagByte & P
ba30: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20  TF_LEAFDATA ){. 
ba40: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
ba50: 74 61 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ta = 1;.    pPag
ba60: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
ba70: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
ba80: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ba90: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
baa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
bab0: 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30  ge->leafData = 0
bac0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
bad0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
bae0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
baf0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
bb00: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->minLocal;.  }.
bb10: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
bb20: 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f   = !(pPage->zero
bb30: 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d  Data || (!pPage-
bb40: 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e  >leaf && pPage->
bb50: 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f  leafData));.}../
bb60: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
bb70: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
bb80: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
bb90: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
bba0: 2a 20 54 68 65 20 70 50 61 72 65 6e 74 20 70 61  * The pParent pa
bbb0: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
bbc0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
bbd0: 20 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a   MemPage which.*
bbe0: 2a 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  * is the parent 
bbf0: 6f 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  of the page bein
bc00: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  g initialized.  
bc10: 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a  The root of a.**
bc20: 20 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61   BTree has no pa
bc30: 72 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20  rent and so for 
bc40: 74 68 61 74 20 70 61 67 65 2c 20 70 50 61 72 65  that page, pPare
bc50: 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  nt==NULL..**.** 
bc60: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
bc70: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
bc80: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
bc90: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
bca0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
bcb0: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
bcc0: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
bcd0: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
bce0: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
bcf0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
bd00: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
bd10: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
bd20: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
bd30: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
bd40: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
bd50: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
bd60: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
bd70: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
bd80: 20 69 6e 74 20 69 6e 69 74 50 61 67 65 28 0a 20   int initPage(. 
bd90: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
bda0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
bdb0: 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  age to be initia
bdc0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  lized */.  MemPa
bdd0: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
bde0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e    /* The parent.
bdf0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
be00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
be10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
be20: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
be30: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
be40: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
be50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
be60: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
be70: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
be80: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
be90: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
bea0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
beb0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
bec0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
bed0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
bee0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
bef0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
bf00: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
bf10: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
bf20: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
bf30: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
bf40: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
bf50: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
bf60: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
bf70: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
bf80: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
bf90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bfa0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
bfb0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
bfc0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
bfd0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
bfe0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
bff0: 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42  nt area */..  pB
c000: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
c010: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
c020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
c030: 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72  arent==0 || pPar
c040: 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ent->pBt==pBt );
c050: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c060: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70  ->pgno==sqlite3p
c070: 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
c080: 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b  pPage->aData) );
c090: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c0a0: 2d 3e 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e  ->aData == &((un
c0b0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61  signed char*)pPa
c0c0: 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69  ge)[-pBt->pageSi
c0d0: 7a 65 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ze] );.  if( pPa
c0e0: 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61  ge->pParent!=pPa
c0f0: 72 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e  rent && (pPage->
c100: 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50  pParent!=0 || pP
c110: 61 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a  age->isInit) ){.
c120: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
c130: 74 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65  t page should ne
c140: 76 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73  ver change unles
c150: 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f  s the file is co
c160: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
c170: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c180: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
c190: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
c1a0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c1b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
c1c0: 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20  ->pParent==0 && 
c1d0: 70 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20  pParent!=0 ){.  
c1e0: 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
c1f0: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
c200: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
c210: 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
c220: 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50  ;.  }.  hdr = pP
c230: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c240: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
c250: 61 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46  aData;.  decodeF
c260: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
c270: 5b 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d  [hdr]);.  pPage-
c280: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c290: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
c2a0: 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  t = 0;.  usableS
c2b0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
c2c0: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
c2d0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
c2e0: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
c2f0: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
c300: 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32  af;.  top = get2
c310: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c320: 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  ]);.  pPage->nCe
c330: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
c340: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69  ata[hdr+3]);.  i
c350: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
c360: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
c370: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
c380: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
c390: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
c3a0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c3b0: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
c3c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c3d0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
c3e0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Page->nCell==0 &
c3f0: 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20  & pParent!=0 && 
c400: 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
c410: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70   ){.    /* All p
c420: 61 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61  ages must have a
c430: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
c440: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f  , except for roo
c450: 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  t pages */.    r
c460: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c470: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
c480: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
c490: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
c4a0: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
c4b0: 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
c4c0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c4d0: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
c4e0: 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63  dr+7] + top - (c
c4f0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c500: 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77  age->nCell);.  w
c510: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
c520: 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65    int next, size
c530: 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61  ;.    if( pc>usa
c540: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
c550: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c560: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
c570: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
c580: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c590: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c5a0: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
c5b0: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
c5c0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
c5d0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
c5e0: 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26     if( next>0 &&
c5f0: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
c600: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
c610: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c620: 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
c630: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  der */.      ret
c640: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c650: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
c660: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a      nFree += siz
c670: 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74  e;.    pc = next
c680: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
c690: 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20  Free = nFree;.  
c6a0: 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c  if( nFree>=usabl
c6b0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  eSize ){.    /* 
c6c0: 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f  Free space canno
c6d0: 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70  t exceed total p
c6e0: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
c6f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c700: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
c710: 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ..  pPage->isIni
c720: 74 20 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e 74  t = 1;.  pageInt
c730: 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20  egrity(pPage);. 
c740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c750: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c760: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c770: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c780: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c790: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c7a0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c7b0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c7c0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c7d0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c7e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c7f0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c800: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c810: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c820: 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70  t;.  int hdr = p
c830: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c840: 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20  .  int first;.. 
c850: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c860: 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72  pager_pagenumber
c870: 28 64 61 74 61 29 3d 3d 70 50 61 67 65 2d 3e 70  (data)==pPage->p
c880: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c890: 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65   &data[pBt->page
c8a0: 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e  Size] == (unsign
c8b0: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29  ed char*)pPage )
c8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c8d0: 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
c8e0: 61 62 6c 65 28 64 61 74 61 29 20 29 3b 0a 20 20  able(data) );.  
c8f0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
c900: 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
c910: 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
c920: 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67  data[hdr] = flag
c930: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
c940: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
c950: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a  &PTF_LEAF)==0);.
c960: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c970: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
c980: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
c990: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
c9a0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
c9b0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
c9c0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
c9d0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
c9e0: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
c9f0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
ca00: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
ca10: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
ca20: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
ca30: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
ca40: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
ca50: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
ca60: 69 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ift = 0;.  pPage
ca70: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
ca80: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
ca90: 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74  ;.  pageIntegrit
caa0: 79 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  y(pPage);.}../*.
cab0: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
cac0: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
cad0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
cae0: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
caf0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
cb00: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
cb10: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cb20: 20 67 65 74 50 61 67 65 28 42 74 53 68 61 72 65   getPage(BtShare
cb30: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
cb40: 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  o, MemPage **ppP
cb50: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
cb60: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
cb70: 2a 61 44 61 74 61 3b 0a 20 20 4d 65 6d 50 61 67  *aData;.  MemPag
cb80: 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 63 20 3d  e *pPage;.  rc =
cb90: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
cba0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
cbb0: 67 6e 6f 2c 20 28 76 6f 69 64 2a 2a 29 26 61 44  gno, (void**)&aD
cbc0: 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ata);.  if( rc )
cbd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
cbe0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
cbf0: 26 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  &aData[pBt->page
cc00: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
cc10: 61 44 61 74 61 20 3d 20 61 44 61 74 61 3b 0a 20  aData = aData;. 
cc20: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
cc30: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
cc40: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
cc50: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
cc60: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
cc70: 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67  00 : 0;.  *ppPag
cc80: 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74  e = pPage;.  ret
cc90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cca0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
ccb0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
ccc0: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
ccd0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
cce0: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
ccf0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
cd00: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
cd10: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
cd20: 67 65 74 50 61 67 65 28 29 20 61 6e 64 20 69 6e  getPage() and in
cd30: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
cd40: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
cd50: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
cd60: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
cd70: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
cd80: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
cd90: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
cda0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
cdb0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
cdc0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
cdd0: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
cde0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
cdf0: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
ce00: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
ce10: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
ce20: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
ce30: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 67 6e  nt rc;.  if( pgn
ce40: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
ce50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ce60: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72  T_BKPT; .  }.  r
ce70: 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
ce80: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a   pgno, ppPage);.
ce90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cea0: 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29  _OK && (*ppPage)
ceb0: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
cec0: 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65     rc = initPage
ced0: 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e  (*ppPage, pParen
cee0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
cef0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
cf00: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
cf10: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
cf20: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
cf30: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
cf40: 61 6c 6c 20 74 6f 20 67 65 74 50 61 67 65 2e 0a  all to getPage..
cf50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
cf60: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
cf70: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
cf80: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
cf90: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
cfa0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
cfb0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
cfc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 50  .    assert( &pP
cfd0: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
cfe0: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  ->pBt->pageSize]
cff0: 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ==(unsigned char
d000: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 73  *)pPage );.    s
d010: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
d020: 66 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  f(pPage->aData);
d030: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
d040: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d050: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 65  lled when the re
d060: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
d070: 72 20 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63  r a page.** reac
d080: 68 65 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65  hes zero.  We ne
d090: 65 64 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20  ed to unref the 
d0a0: 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
d0b0: 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70  when that.** hap
d0c0: 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pens..*/.static 
d0d0: 76 6f 69 64 20 70 61 67 65 44 65 73 74 72 75 63  void pageDestruc
d0e0: 74 6f 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  tor(void *pData,
d0f0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
d100: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
d110: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
d120: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
d130: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
d140: 61 67 65 2a 29 26 28 28 63 68 61 72 2a 29 70 44  age*)&((char*)pD
d150: 61 74 61 29 5b 70 61 67 65 53 69 7a 65 5d 3b 0a  ata)[pageSize];.
d160: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
d170: 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50  rent ){.    MemP
d180: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  age *pParent = p
d190: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
d1a0: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
d1b0: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  t = 0;.    relea
d1c0: 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
d1d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73  .  }.  pPage->is
d1e0: 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Init = 0;.}../*.
d1f0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
d200: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
d210: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
d220: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
d230: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
d240: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
d250: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
d260: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
d270: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
d280: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
d290: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
d2a0: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
d2b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d2c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
d2d0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
d2e0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
d2f0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
d300: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
d310: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
d320: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
d330: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
d340: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
d350: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
d360: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
d370: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
d380: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
d390: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
d3a0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
d3b0: 29 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  )&((char*)pData)
d3c0: 5b 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 69 66  [pageSize];.  if
d3d0: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
d3e0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
d3f0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Init = 0;.    in
d400: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
d410: 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
d420: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
d430: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
d440: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
d450: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
d460: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
d470: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
d480: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20  me is NULL.** a 
d490: 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74  new database wit
d4a0: 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20  h a random name 
d4b0: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69  is created.  Thi
d4c0: 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64  s randomly named
d4d0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
d4e0: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
d4f0: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  d when sqlite3Bt
d500: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
d510: 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lled..*/.int sql
d520: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d540: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d550: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d560: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d570: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d580: 73 71 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65  sqlite3 *pSqlite
d590: 2c 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63  ,       /* Assoc
d5a0: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d5b0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d5c0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d5d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d5e0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d5f0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d600: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
d610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d620: 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42  ptions */.){.  B
d630: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
d640: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
d650: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
d660: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
d670: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
d680: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
d690: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
d6a0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65  nt rc;.  int nRe
d6b0: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
d6c0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
d6d0: 5b 31 30 30 5d 3b 0a 23 69 66 6e 64 65 66 20 53  [100];.#ifndef S
d6e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
d6f0: 44 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61 64  D_CACHE.  Thread
d700: 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
d710: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
d720: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
d730: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
d740: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
d750: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
d760: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
d770: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
d780: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
d790: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
d7a0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
d7b0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
d7c0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
d7d0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
d7e0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
d7f0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
d800: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
d810: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
d820: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
d830: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
d840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d850: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
d860: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
d870: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
d880: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
d890: 62 20 3d 20 21 7a 46 69 6c 65 6e 61 6d 65 3b 0a  b = !zFilename;.
d8a0: 20 20 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20    #else.  const 
d8b0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 21 7a  int isMemdb = !z
d8c0: 46 69 6c 65 6e 61 6d 65 20 7c 7c 20 28 73 74 72  Filename || (str
d8d0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
d8e0: 3a 6d 65 6d 6f 72 79 3a 22 29 3f 30 3a 31 29 3b  :memory:")?0:1);
d8f0: 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .  #endif.#endif
d900: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61  ..  p = sqliteMa
d910: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72 65  lloc(sizeof(Btre
d920: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
d930: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d940: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
d950: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
d960: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53  NS_NONE;.  p->pS
d970: 71 6c 69 74 65 20 3d 20 70 53 71 6c 69 74 65 3b  qlite = pSqlite;
d980: 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  ..  /* Try to fi
d990: 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 42  nd an existing B
d9a0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 6f  tree structure o
d9b0: 70 65 6e 65 64 20 6f 6e 20 7a 46 69 6c 65 6e 61  pened on zFilena
d9c0: 6d 65 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  me. */.#if !defi
d9d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d9e0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
d9f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
da00: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
da10: 69 66 28 20 70 54 73 64 2d 3e 75 73 65 53 68 61  if( pTsd->useSha
da20: 72 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65  redData && zFile
da30: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
da40: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   ){.    char *zF
da50: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
da60: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
da70: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
da80: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
da90: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
daa0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
dab0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
dac0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
dad0: 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 73 64      for(pBt=pTsd
dae0: 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70  ->pBtree; pBt; p
daf0: 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
db00: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
db10: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
db20: 65 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  e, sqlite3pager_
db30: 66 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  filename(pBt->pP
db40: 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20  ager)) ){.      
db50: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
db60: 20 20 20 20 20 20 20 20 2a 70 70 42 74 72 65 65          *ppBtree
db70: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 42   = p;.        pB
db80: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
db90: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
dba0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
dbb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
dbc0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
dbd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
dbe0: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
dbf0: 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
dc00: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
dc10: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
dc20: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
dc30: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
dc40: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
dc50: 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
dc60: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
dc70: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
dc80: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
dc90: 74 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68  t result.  ** wh
dca0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
dcb0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
dcc0: 69 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  itecture..  */. 
dcd0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
dce0: 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 61 73 73  i64)==8 );.  ass
dcf0: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
dd00: 3d 3d 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==8 );.  assert(
dd10: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
dd20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
dd30: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
dd40: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
dd50: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70  Pgno)==4 );..  p
dd60: 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Bt = sqliteMallo
dd70: 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  c( sizeof(*pBt) 
dd80: 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  );.  if( pBt==0 
dd90: 29 7b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  ){.    *ppBtree 
dda0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  = 0;.    sqliteF
ddb0: 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ree(p);.    retu
ddc0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ddd0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
dde0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 26 70  te3pager_open(&p
ddf0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
de00: 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a  ename, EXTRA_SIZ
de10: 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  E, flags);.  if(
de20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
de30: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  {.    if( pBt->p
de40: 50 61 67 65 72 20 29 20 73 71 6c 69 74 65 33 70  Pager ) sqlite3p
de50: 61 67 65 72 5f 63 6c 6f 73 65 28 70 42 74 2d 3e  ager_close(pBt->
de60: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
de70: 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20  iteFree(pBt);.  
de80: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
de90: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
dea0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  0;.    return rc
deb0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42 74 20 3d  ;.  }.  p->pBt =
dec0: 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33   pBt;..  sqlite3
ded0: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
dee0: 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ctor(pBt->pPager
def0: 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72  , pageDestructor
df00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
df10: 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 70  r_set_reiniter(p
df20: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
df30: 52 65 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d 3e  Reinit);.  pBt->
df40: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70  pCursor = 0;.  p
df50: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
df60: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
df70: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  = sqlite3pager_i
df80: 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
df90: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
dfa0: 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65  3pager_read_file
dfb0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
dfc0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 44 62 48 65  er, sizeof(zDbHe
dfd0: 61 64 65 72 29 2c 20 7a 44 62 48 65 61 64 65 72  ader), zDbHeader
dfe0: 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
dff0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
e000: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
e010: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
e020: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
e030: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
e040: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
e050: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
e060: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
e070: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
e080: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
e090: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
e0a0: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
e0b0: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
e0c0: 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20 32 35  ac = 64;   /* 25
e0d0: 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69  % */.    pBt->mi
e0e0: 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33 32 3b  nEmbedFrac = 32;
e0f0: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 20     /* 12.5% */. 
e100: 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46     pBt->minLeafF
e110: 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20  rac = 32;    /* 
e120: 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66  12.5% */.#ifndef
e130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e140: 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49  OVACUUM.    /* I
e150: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
e160: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
e170: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
e180: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
e190: 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  hen.    ** do no
e1a0: 74 20 73 65 74 20 74 68 65 20 61 75 74 6f 2d 76  t set the auto-v
e1b0: 61 63 75 75 6d 20 66 6c 61 67 2c 20 65 76 65 6e  acuum flag, even
e1c0: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55   if SQLITE_DEFAU
e1d0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  LT_AUTOVACUUM.  
e1e0: 20 20 2a 2a 20 69 73 20 74 72 75 65 2e 20 4f 6e    ** is true. On
e1f0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
e200: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
e210: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
e220: 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20 20 20 2a  n defined,.    *
e230: 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  * then ":memory:
e240: 22 20 69 73 20 6a 75 73 74 20 61 20 72 65 67 75  " is just a regu
e250: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 52  lar file-name. R
e260: 65 73 70 65 63 74 20 74 68 65 20 61 75 74 6f 2d  espect the auto-
e270: 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 64 65  vacuum.    ** de
e280: 66 61 75 6c 74 20 69 6e 20 74 68 69 73 20 63 61  fault in this ca
e290: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
e2a0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
e2b0: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
e2c0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
e2d0: 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  m = SQLITE_DEFAU
e2e0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b 0a 20  LT_AUTOVACUUM;. 
e2f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
e300: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
e310: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65  }else{.    nRese
e320: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
e330: 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  20];.    pBt->ma
e340: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62  xEmbedFrac = zDb
e350: 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20  Header[21];.    
e360: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
e370: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32  c = zDbHeader[22
e380: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
e390: 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61  eafFrac = zDbHea
e3a0: 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74  der[23];.    pBt
e3b0: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
e3c0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
e3d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e3e0: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
e3f0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
e400: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
e410: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
e420: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74  #endif.  }.  pBt
e430: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
e440: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
e450: 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73 65 72  Reserve;.  asser
e460: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
e470: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
e480: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
e490: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
e4a0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
e4b0: 73 65 74 5f 70 61 67 65 73 69 7a 65 28 70 42 74  set_pagesize(pBt
e4c0: 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 70  ->pPager, pBt->p
e4d0: 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64  ageSize);..#ifnd
e4e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e4f0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
e500: 20 41 64 64 20 74 68 65 20 6e 65 77 20 62 74 72   Add the new btr
e510: 65 65 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ee to the linked
e520: 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
e530: 74 20 54 68 72 65 61 64 44 61 74 61 2e 70 42 74  t ThreadData.pBt
e540: 72 65 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 73  ree */.  if( pTs
e550: 64 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  d->useSharedData
e560: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26   && zFilename &&
e570: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
e580: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 70 54   pBt->pNext = pT
e590: 73 64 2d 3e 70 42 74 72 65 65 3b 0a 20 20 20 20  sd->pBtree;.    
e5a0: 70 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20 70  pTsd->pBtree = p
e5b0: 42 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  Bt;.  }.#endif. 
e5c0: 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
e5d0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
e5e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
e600: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
e610: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
e620: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
e630: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e640: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
e650: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
e660: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
e670: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
e680: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e690: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e6a0: 45 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  E.  ThreadData *
e6b0: 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68  pTsd = sqlite3Th
e6c0: 72 65 61 64 44 61 74 61 28 29 3b 0a 23 65 6e 64  readData();.#end
e6d0: 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6e  if..  /* Drop an
e6e0: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 2a 2f  y table-locks */
e6f0: 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
e700: 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  es(p);..  /* Clo
e710: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
e720: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
e730: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75  andle.  */.  pCu
e740: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
e750: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
e760: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
e770: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
e780: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
e790: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
e7a0: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
e7b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e7c0: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
e7d0: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
e7e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
e7f0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
e800: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e810: 43 48 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  CHE.  /* If ther
e820: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
e830: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
e840: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
e850: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
e860: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
e870: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
e880: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
e890: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
e8a0: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
e8b0: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
e8d0: 52 65 66 3e 30 20 29 3b 0a 20 20 70 42 74 2d 3e  Ref>0 );.  pBt->
e8e0: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
e8f0: 74 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 72  t->nRef ){.    r
e900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e910: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
e920: 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
e930: 65 65 20 66 72 6f 6d 20 74 68 65 20 74 68 72 65  ee from the thre
e940: 61 64 20 77 69 64 65 20 6c 69 73 74 20 2a 2f 0a  ad wide list */.
e950: 20 20 69 66 28 20 70 54 73 64 2d 3e 70 42 74 72    if( pTsd->pBtr
e960: 65 65 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 70  ee==pBt ){.    p
e970: 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20 70 42  Tsd->pBtree = pB
e980: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  t->pNext;.  }els
e990: 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  e{.    BtShared 
e9a0: 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f 72 28  *pPrev;.    for(
e9b0: 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42 74 72  pPrev=pTsd->pBtr
e9c0: 65 65 3b 20 70 50 72 65 76 20 26 26 20 70 50 72  ee; pPrev && pPr
e9d0: 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20  ev->pNext!=pBt; 
e9e0: 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65  pPrev=pPrev->pNe
e9f0: 78 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  xt);.    if( pPr
ea00: 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50 72 65  ev ){.      pPre
ea10: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  v->pNext = pBt->
ea20: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
ea30: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c  .#endif..  /* Cl
ea40: 6f 73 65 20 74 68 65 20 70 61 67 65 72 20 61 6e  ose the pager an
ea50: 64 20 66 72 65 65 20 74 68 65 20 73 68 61 72 65  d free the share
ea60: 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
ea70: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  e */.  assert( !
ea80: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
ea90: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
eaa0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
eab0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 78 46  );.  if( pBt->xF
eac0: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
ead0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
eae0: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
eaf0: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
eb00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
eb10: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
eb20: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42  .  sqliteFree(pB
eb30: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
eb40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
eb50: 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73 79   Change the busy
eb60: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
eb70: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  k function..*/.i
eb80: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
eb90: 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74  etBusyHandler(Bt
eba0: 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64  ree *p, BusyHand
ebb0: 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a  ler *pHandler){.
ebc0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
ebd0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d  = p->pBt;.  pBt-
ebe0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
ebf0: 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69  pHandler;.  sqli
ec00: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73  te3pager_set_bus
ec10: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
ec20: 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b  ager, pHandler);
ec30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ec40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
ec50: 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
ec60: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
ec70: 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
ec80: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
ec90: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
eca0: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
ecb0: 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
ecc0: 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
ecd0: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
ece0: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
ecf0: 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
ed00: 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
ed10: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
ed20: 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
ed30: 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
ed40: 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
ed50: 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
ed60: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
ed70: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
ed80: 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
ed90: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
eda0: 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
edb0: 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
edc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
edd0: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
ede0: 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
edf0: 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
ee00: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
ee10: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
ee20: 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
ee30: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
ee40: 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
ee50: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
ee60: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
ee70: 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
ee80: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
ee90: 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
eea0: 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
eeb0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
eec0: 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
eed0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
eee0: 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
eef0: 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
ef00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
ef10: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
ef20: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
ef30: 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
ef40: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
ef50: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
ef60: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 70 42 74  et_cachesize(pBt
ef70: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
ef80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ef90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
efa0: 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
efb0: 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
efc0: 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
efd0: 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
efe0: 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
eff0: 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
f000: 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
f010: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
f020: 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
f030: 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
f040: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
f050: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
f060: 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
f070: 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
f080: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
f090: 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
f0a0: 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
f0b0: 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
f0c0: 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
f0d0: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
f0e0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
f0f0: 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
f100: 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
f110: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
f120: 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
f130: 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
f140: 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
f150: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
f160: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f170: 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
f180: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
f190: 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
f1a0: 70 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20  p, int level){. 
f1b0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f1c0: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
f1d0: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
f1e0: 74 79 5f 6c 65 76 65 6c 28 70 42 74 2d 3e 70 50  ty_level(pBt->pP
f1f0: 61 67 65 72 2c 20 6c 65 76 65 6c 29 3b 0a 20 20  ager, level);.  
f200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f210: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f220: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
f230: 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
f240: 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
f250: 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
f260: 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
f270: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
f280: 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
f290: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
f2a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f2b0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
f2c0: 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
f2d0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f2e0: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
f2f0: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
f300: 67 65 72 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ger );.  return 
f310: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73  sqlite3pager_nos
f320: 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
f330: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
f340: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
f350: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
f360: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f370: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
f380: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
f390: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
f3a0: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
f3b0: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
f3c0: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s per page..**.*
f3d0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
f3e0: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
f3f0: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
f400: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
f410: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
f420: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
f430: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
f440: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
f450: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
f460: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
f470: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
f480: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
f490: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
f4a0: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
f4b0: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
f4c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
f4d0: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
f4e0: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
f4f0: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
f500: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
f510: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
f520: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
f530: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
f540: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
f550: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
f560: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
f570: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
f580: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
f590: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
f5a0: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
f5b0: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
f5c0: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
f5d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
f5e0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
f5f0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
f600: 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
f610: 76 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ve){.  BtShared 
f620: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
f630: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
f640: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72  zeFixed ){.    r
f650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
f660: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
f670: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
f680: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
f690: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
f6a0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
f6b0: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
f6c0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
f6d0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
f6e0: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
f6f0: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
f700: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
f710: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
f720: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
f730: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
f740: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
f750: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
f760: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f770: 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  e = sqlite3pager
f780: 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28 70 42  _set_pagesize(pB
f790: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 53  t->pPager, pageS
f7a0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  ize);.  }.  pBt-
f7b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
f7c0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
f7d0: 65 73 65 72 76 65 3b 0a 20 20 72 65 74 75 72 6e  eserve;.  return
f7e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f7f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f800: 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
f810: 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
f820: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
f830: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
f840: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
f850: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
f860: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
f870: 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
f880: 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
f890: 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
f8a0: 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
f8b0: 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  bleSize;.}.#endi
f8c0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
f8d0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
f8e0: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
f8f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f900: 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
f910: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
f920: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
f930: 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
f940: 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
f950: 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
f960: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
f970: 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
f980: 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
f990: 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
f9a0: 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
f9b0: 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
f9c0: 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
f9d0: 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
f9e0: 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
f9f0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
fa00: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
fa10: 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
fa20: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
fa30: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
fa40: 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
fa50: 63 75 75 6d 29 7b 0a 20 20 42 74 53 68 61 72 65  cuum){.  BtShare
fa60: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
fa70: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fa80: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
fa90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
faa0: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
fab0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
fac0: 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
fad0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
fae0: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 70 42  ADONLY;.  }.  pB
faf0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
fb00: 28 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29  (autoVacuum?1:0)
fb10: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fb20: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
fb30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
fb40: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
fb50: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
fb60: 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
fb70: 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
fb80: 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
fb90: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
fba0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
fbb0: 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
fbc0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
fbd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fbe0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
fbf0: 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65  rn 0;.#else.  re
fc00: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 61 75 74  turn p->pBt->aut
fc10: 6f 56 61 63 75 75 6d 3b 0a 23 65 6e 64 69 66 0a  oVacuum;.#endif.
fc20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
fc30: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
fc40: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
fc50: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
fc60: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
fc70: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
fc80: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
fc90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
fca0: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
fcb0: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
fcc0: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
fcd0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
fce0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
fcf0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
fd00: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
fd10: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
fd20: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
fd30: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
fd40: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
fd50: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
fd60: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
fd70: 65 6d 6f 72 79 2e 20 20 53 51 4c 49 54 45 5f 50  emory.  SQLITE_P
fd80: 52 4f 54 4f 43 4f 4c 20 69 73 20 72 65 74 75 72  ROTOCOL is retur
fd90: 6e 65 64 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ned.** if there 
fda0: 69 73 20 61 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  is a locking pro
fdb0: 74 6f 63 6f 6c 20 76 69 6f 6c 61 74 69 6f 6e 2e  tocol violation.
fdc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
fdd0: 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
fde0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
fdf0: 63 2c 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 4d  c, pageSize;.  M
fe00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
fe10: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
fe20: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
fe30: 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 67 65 74  E_OK;.  rc = get
fe40: 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
fe50: 61 67 65 31 29 3b 0a 20 20 69 66 28 20 72 63 21  age1);.  if( rc!
fe60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
fe70: 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a  urn rc;.  ..  /*
fe80: 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
fe90: 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
fea0: 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
feb0: 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
fec0: 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
fed0: 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
fee0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
fef0: 54 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69  TADB;.  if( sqli
ff00: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
ff10: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
ff20: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 61 67  0 ){.    u8 *pag
ff30: 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
ff40: 74 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  ta;.    if( memc
ff50: 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
ff60: 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
ff70: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
ff80: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
ff90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
ffa0: 67 65 31 5b 31 38 5d 3e 31 20 7c 7c 20 70 61 67  ge1[18]>1 || pag
ffb0: 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
ffc0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
ffd0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
ffe0: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
fff0: 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
10000 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
10010 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
10020 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
10030 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
10040 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10050 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
10060 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
10070 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
10080 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
10090 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
100a0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
100b0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
100c0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
100d0 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
100e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
100f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
10100 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
10110 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
10120 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
10130 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
10140 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
10150 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
10160 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
10170 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10180 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
10190 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
101a0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
101b0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  4*4])?1:0);.#end
101c0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
101d0 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
101e0 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
101f0 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
10200 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
10210 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
10220 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
10230 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
10240 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
10250 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
10260 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
10270 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
10280 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
10290 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
102a0 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
102b0 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
102c0 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
102d0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
102e0 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
102f0 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
10300 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
10310 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
10320 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
10330 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
10340 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
10350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
10360 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
10370 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
10380 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
10390 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
103a0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
103b0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
103c0 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
103d0 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
103e0 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
103f0 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
10400 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
10410 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
10420 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
10430 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
10440 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32 35  >maxEmbedFrac/25
10450 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
10460 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
10470 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
10480 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
10490 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
104a0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
104b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
104c0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
104d0 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
104e0 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
104f0 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20 32  LeafFrac/255 - 2
10500 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 69  3;.  if( pBt->mi
10510 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c  nLocal>pBt->maxL
10520 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78  ocal || pBt->max
10530 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67  Local<0 ){.    g
10540 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
10550 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73  ailed;.  }.  ass
10560 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
10570 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
10580 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
10590 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
105a0 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
105b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
105c0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
105d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
105e0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
105f0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
10600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
10610 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
10620 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
10630 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
10640 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
10650 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
10660 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
10670 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
10680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
10690 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
106a0 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
106b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
106c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52 65 66  E_OK;.  if( pRef
106d0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
106e0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20  _NONE ){.    u8 
106f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10700 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
10710 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74  nsaction;.    bt
10720 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
10730 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  f);.    rc = sql
10740 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
10750 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20  ans(pRef, 0);.  
10760 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54    pRef->pBt->inT
10770 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54  ransaction = inT
10780 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
10790 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  pRef->inTrans = 
107a0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
107b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
107c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d  K ){.      pRef-
107d0 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
107e0 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on--;.    }.    
107f0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
10800 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ref);.  }.  retu
10810 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
10820 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
10830 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
10840 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
10850 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
10860 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
10870 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
10880 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
10890 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
108a0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
108b0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
108c0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
108d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
108e0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
108f0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
10900 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
10910 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
10920 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
10930 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
10940 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
10950 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
10960 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10970 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
10980 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
10990 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
109a0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
109b0 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
109c0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
109d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
109e0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
109f0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
10a00 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
10a10 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
10a20 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
10a30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
10a40 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65  a==0 ){.      Me
10a50 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
10a60 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
10a70 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
10a80 20 26 28 28 75 38 2a 29 70 50 61 67 65 29 5b 2d   &((u8*)pPage)[-
10a90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
10aa0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74        pPage->pBt
10ab0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 70 50   = pBt;.      pP
10ac0 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
10ad0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
10ae0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
10af0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
10b00 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
10b10 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
10b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
10b30 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
10b40 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
10b50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
10b60 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  f the.** file..*
10b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
10b80 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
10b90 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
10ba0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
10bb0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
10bc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
10bd0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
10be0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
10bf0 65 72 29 3e 30 20 29 20 72 65 74 75 72 6e 20 53  er)>0 ) return S
10c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20  QLITE_OK;.  pP1 
10c10 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
10c20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
10c30 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
10c40 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
10c50 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
10c60 65 28 64 61 74 61 29 3b 0a 20 20 69 66 28 20 72  e(data);.  if( r
10c70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
10c80 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
10c90 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
10ca0 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
10cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
10cc0 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
10cd0 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
10ce0 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
10cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
10d00 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
10d10 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
10d20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d   data[20] = pBt-
10d30 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
10d40 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
10d50 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d  ata[21] = pBt->m
10d60 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  axEmbedFrac;.  d
10d70 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d  ata[22] = pBt->m
10d80 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64  inEmbedFrac;.  d
10d90 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d  ata[23] = pBt->m
10da0 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65  inLeafFrac;.  me
10db0 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
10dc0 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
10dd0 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
10de0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
10df0 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
10e00 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
10e10 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
10e20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10e30 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
10e40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
10e50 7b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  {.    put4byte(&
10e60 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
10e70 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  1);.  }.#endif. 
10e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10e90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
10ea0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
10eb0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
10ec0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
10ed0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
10ee0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
10ef0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
10f00 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
10f10 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
10f20 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
10f30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
10f40 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
10f50 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
10f60 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
10f70 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
10f80 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
10f90 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
10fa0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
10fb0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
10fc0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
10fd0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
10fe0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
10ff0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
11000 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
11010 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
11020 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
11030 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
11040 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
11050 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
11060 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
11070 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
11080 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
11090 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
110a0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
110b0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
110c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
110d0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
110e0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
110f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
11100 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
11110 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
11120 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
11130 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
11140 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
11150 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11160 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
11170 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
11180 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
11190 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
111a0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
111b0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
111c0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
111d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
111e0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
111f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
11200 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
11210 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
11220 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
11230 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
11240 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
11250 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
11260 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
11270 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
11280 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
11290 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
112a0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
112b0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
112c0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
112d0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
112e0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
112f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
11300 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
11310 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
11320 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
11330 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
11340 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
11350 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
11360 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
11370 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
11380 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
11390 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
113a0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
113b0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
113c0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
113d0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
113e0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
113f0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
11400 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
11410 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
11420 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
11430 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
11440 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
11450 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
11460 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
11470 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
11480 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
11490 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
114a0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
114b0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
114c0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
114d0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
114e0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
114f0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
11500 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
11510 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
11520 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
11530 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
11540 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
11550 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
11560 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11570 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
11580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11590 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
115a0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
115b0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
115c0 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
115d0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
115e0 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
115f0 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
11600 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
11610 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
11620 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
11630 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
11640 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
11650 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11660 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
11670 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
11680 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
11690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
116a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
116b0 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
116c0 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
116d0 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
116e0 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
116f0 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
11700 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  ly && wrflag ){.
11710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11720 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
11730 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
11740 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11750 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
11760 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
11770 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
11780 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
11790 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
117a0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
117b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
117c0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
117d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
117e0 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  Y..  */.  if( pB
117f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11800 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
11810 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
11820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
11830 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20  Y;.  }..  do {. 
11840 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67     if( pBt->pPag
11850 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  e1==0 ){.      r
11860 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
11870 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  t);.    }.  .   
11880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11890 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
118a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
118b0 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 42  e3pager_begin(pB
118c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
118d0 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20  , wrflag>1);.   
118e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
118f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11900 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
11910 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
11920 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
11930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11940 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
11950 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  g ) pBt->inStmt 
11960 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
11970 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
11980 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
11990 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
119a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
119b0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
119c0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
119d0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73  E &&.          s
119e0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
119f0 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42 75  Handler(pBt->pBu
11a00 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a 20  syHandler) );.. 
11a10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11a20 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
11a30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11a40 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
11a50 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
11a60 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  +;.    }.    p->
11a70 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
11a80 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
11a90 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
11aa0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
11ab0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11ac0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
11ad0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
11ae0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
11af0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
11b00 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65 74  egrity(p);.  ret
11b10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
11b20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11b30 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
11b40 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
11b50 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
11b60 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
11b70 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
11b80 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
11b90 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
11ba0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
11bb0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
11bc0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
11bd0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
11be0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
11bf0 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
11c00 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
11c10 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
11c20 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
11c30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11c50 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
11c60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
11c70 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11c90 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
11ca0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
11cb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11cc0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
11cd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11ce0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
11cf0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
11d00 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  Bt;.  int isInit
11d10 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
11d20 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
11d30 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
11d40 0a 0a 20 20 69 6e 69 74 50 61 67 65 28 70 50 61  ..  initPage(pPa
11d50 67 65 2c 20 30 29 3b 0a 20 20 6e 43 65 6c 6c 20  ge, 0);.  nCell 
11d60 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
11d70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
11d80 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
11d90 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
11da0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
11db0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
11dc0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
11dd0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
11de0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11df0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74  {.      goto set
11e00 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
11e10 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
11e20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
11e30 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
11e40 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
11e50 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
11e60 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
11e70 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
11e80 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
11e90 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
11ea0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11eb0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
11ec0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
11ed0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
11ee0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
11ef0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
11f00 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
11f10 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
11f20 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
11f30 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
11f40 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
11f50 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
11f60 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  gno);.  }..set_c
11f70 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
11f80 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
11f90 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
11fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11fb0 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
11fc0 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20  on pPage, which 
11fd0 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
11fe0 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
11ff0 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f  , not an overflo
12000 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20  w.** page, is a 
12010 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
12020 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68  iFrom. Modify th
12030 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68  is pointer so th
12040 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
12050 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  ** iTo. Paramete
12060 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
12070 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
12080 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69  inter to be modi
12090 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c  fied, as .** fol
120a0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
120b0 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
120c0 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
120d0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
120e0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
120f0 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
12100 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
12110 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
12120 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
12130 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
12140 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
12150 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
12160 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
12180 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
12190 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
121a0 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
121b0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
121c0 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
121d0 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
121e0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
121f0 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
12220 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
12230 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
12240 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
12250 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
12260 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
12270 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
12280 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
12290 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
122a0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
122b0 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
122c0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
122d0 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
122e0 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
122f0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
12300 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
12310 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
12320 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12330 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
12340 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
12350 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
12360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
12370 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
12380 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
12390 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
123a0 43 65 6c 6c 3b 0a 0a 20 20 20 20 69 6e 69 74 50  Cell;..    initP
123b0 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
123c0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
123d0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
123e0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
123f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
12400 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
12410 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
12420 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12430 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
12440 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
12450 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
12460 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
12470 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
12480 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
12490 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
124a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
124b0 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
124c0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
124d0 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
124e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
124f0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
12500 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
12510 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12530 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12540 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
12550 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
12560 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
12570 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
12580 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
12590 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
125a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
125b0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
125c0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
125d0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
125e0 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
125f0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
12600 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
12610 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
12620 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
12630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12640 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
12660 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
12670 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
12680 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
12690 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
126a0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
126b0 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
126c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
126d0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
126e0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
126f0 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
12700 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
12710 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
12720 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
12730 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
12740 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
12750 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
12760 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
12770 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
12780 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
12790 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
127a0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
127b0 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
127c0 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127e0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
127f0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
12800 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
12810 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
12820 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
12830 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
12840 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
12850 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
12860 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e           /* T
12870 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
12880 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
12890 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
128a0 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
128b0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
128c0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
128d0 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
128e0 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
128f0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
12900 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
12910 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
12920 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
12930 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
12940 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
12950 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
12960 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
12970 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
12980 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
12990 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
129a0 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
129b0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 27  iDbPage from it'
129c0 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
129d0 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
129e0 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
129f0 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
12a00 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
12a10 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
12a20 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
12a30 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
12a40 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
12a50 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
12a60 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
12a70 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
12a80 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
12a90 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 46 72 65  age->aData, iFre
12aa0 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  ePage);.  if( rc
12ab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12ac0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12ad0 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
12ae0 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
12af0 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
12b00 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
12b10 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
12b20 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
12b30 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
12b40 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
12b50 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
12b60 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
12b70 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
12b80 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
12b90 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
12ba0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
12bb0 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
12bc0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
12bd0 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
12be0 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
12bf0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
12c00 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
12c10 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
12c20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
12c30 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
12c40 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
12c50 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
12c60 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
12c70 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
12c80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
12c90 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
12ca0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
12cb0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
12cc0 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
12cd0 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
12ce0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12d00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
12d20 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
12d30 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
12d40 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
12d50 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
12d60 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
12d70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
12d80 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
12d90 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
12da0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12db0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12dc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12de0 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
12df0 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
12e00 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
12e10 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
12e20 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
12e30 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
12e40 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
12e50 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
12e60 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
12e70 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
12e80 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
12e90 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
12ea0 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  E ){.    rc = ge
12eb0 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
12ec0 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 29 3b  age, &pPtrPage);
12ed0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12f00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12f10 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 74  3pager_write(pPt
12f20 72 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  rPage->aData);. 
12f30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
12f50 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
12f60 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
12f70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
12f80 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
12f90 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
12fa0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
12fb0 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
12fc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
12fd0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
12fe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12ff0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
13000 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
13010 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
13020 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
13030 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13040 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
13050 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
13060 64 20 62 79 20 61 75 74 6f 56 61 63 75 75 6d 43  d by autoVacuumC
13070 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a 73 74 61 74  ommit(). */.stat
13080 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 50  ic int allocateP
13090 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
130a0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
130b0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
130c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
130d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
130e0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  or to sqlite3pag
130f0 65 72 5f 63 6f 6d 6d 69 74 20 77 68 65 6e 20 61  er_commit when a
13100 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
13110 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
13120 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
13130 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
13140 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
13150 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
13160 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 6e 54 72   *pBt, Pgno *nTr
13170 75 6e 63 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  unc){.  Pager *p
13180 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
13190 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  ger;.  Pgno nFre
131a0 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
131b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
131c0 61 67 65 73 20 72 65 6d 61 69 6e 69 6e 67 20 6f  ages remaining o
131d0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
131e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74 72 4d 61   */.  int nPtrMa
131f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13200 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
13210 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 20  inter-map pages 
13220 64 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  deallocated */. 
13230 20 50 67 6e 6f 20 6f 72 69 67 53 69 7a 65 3b 20   Pgno origSize; 
13240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
13250 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
13260 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
13270 67 6e 6f 20 66 69 6e 53 69 7a 65 3b 20 20 20 20  gno finSize;    
13280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
13290 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
132a0 73 65 20 66 69 6c 65 20 61 66 74 65 72 20 74 72  se file after tr
132b0 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  uncation */.  in
132c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
132d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
132e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20  rn code */.  u8 
132f0 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 70 67 73  eType;.  int pgs
13300 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
13310 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  e;  /* Page size
13320 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
13330 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  se */.  Pgno iDb
13340 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
13350 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
13360 73 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  se page to move 
13370 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
13380 62 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 20 20  bMemPage = 0;   
13390 2f 2a 20 22 22 20 2a 2f 0a 20 20 50 67 6e 6f 20  /* "" */.  Pgno 
133a0 69 50 74 72 50 61 67 65 3b 20 20 20 20 20 20 20  iPtrPage;       
133b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
133c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
133d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 44 62  a pointer to iDb
133e0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
133f0 46 72 65 65 50 61 67 65 3b 20 20 20 20 20 20 20  FreePage;       
13400 20 20 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65       /* The free
13410 2d 6c 69 73 74 20 70 61 67 65 20 74 6f 20 6d 6f  -list page to mo
13420 76 65 20 69 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve iDbPage to */
13430 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65  .  MemPage *pFre
13440 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 2f 2a  eMemPage = 0; /*
13450 20 22 22 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20   "" */..#ifndef 
13460 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65  NDEBUG.  int nRe
13470 66 20 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65  f = *sqlite3page
13480 72 5f 73 74 61 74 73 28 70 50 61 67 65 72 29 3b  r_stats(pPager);
13490 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
134a0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
134b0 75 6d 20 29 3b 0a 20 20 69 66 28 20 50 54 52 4d  um );.  if( PTRM
134c0 41 50 5f 49 53 50 41 47 45 28 70 67 73 7a 2c 20  AP_ISPAGE(pgsz, 
134d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
134e0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 29 20  ecount(pPager)) 
134f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13500 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
13510 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  T;.  }..  /* Fig
13520 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
13530 20 66 72 65 65 2d 70 61 67 65 73 20 61 72 65 20   free-pages are 
13540 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
13550 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
13560 0a 20 20 2a 2a 20 66 72 65 65 20 70 61 67 65 73  .  ** free pages
13570 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
13580 75 6d 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  um is a no-op.. 
13590 20 2a 2f 0a 20 20 6e 46 72 65 65 4c 69 73 74 20   */.  nFreeList 
135a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
135b0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
135c0 36 5d 29 3b 0a 20 20 69 66 28 20 6e 46 72 65 65  6]);.  if( nFree
135d0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  List==0 ){.    *
135e0 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
135f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13600 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 53 69 7a  ;.  }..  origSiz
13610 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  e = sqlite3pager
13620 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
13630 72 29 3b 0a 20 20 6e 50 74 72 4d 61 70 20 3d 20  r);.  nPtrMap = 
13640 28 6e 46 72 65 65 4c 69 73 74 2d 6f 72 69 67 53  (nFreeList-origS
13650 69 7a 65 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  ize+PTRMAP_PAGEN
13660 4f 28 70 67 73 7a 2c 20 6f 72 69 67 53 69 7a 65  O(pgsz, origSize
13670 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f  )+pgsz/5)/(pgsz/
13680 35 29 3b 0a 20 20 66 69 6e 53 69 7a 65 20 3d 20  5);.  finSize = 
13690 6f 72 69 67 53 69 7a 65 20 2d 20 6e 46 72 65 65  origSize - nFree
136a0 4c 69 73 74 20 2d 20 6e 50 74 72 4d 61 70 3b 0a  List - nPtrMap;.
136b0 20 20 69 66 28 20 6f 72 69 67 53 69 7a 65 3e 3d    if( origSize>=
136c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
136d0 45 28 70 42 74 29 20 26 26 20 66 69 6e 53 69 7a  E(pBt) && finSiz
136e0 65 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e<=PENDING_BYTE_
136f0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13700 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 20 20   finSize--;.    
13710 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
13720 45 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  E(pBt->usableSiz
13730 65 2c 20 66 69 6e 53 69 7a 65 29 20 29 7b 0a 20  e, finSize) ){. 
13740 20 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a       finSize--;.
13750 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
13760 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
13770 42 65 67 69 6e 20 28 64 62 20 73 69 7a 65 20 25  Begin (db size %
13780 64 2d 3e 25 64 29 5c 6e 22 2c 20 6f 72 69 67 53  d->%d)\n", origS
13790 69 7a 65 2c 20 66 69 6e 53 69 7a 65 29 29 3b 0a  ize, finSize));.
137a0 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 27  .  /* Variable '
137b0 66 69 6e 53 69 7a 65 27 20 77 69 6c 6c 20 62 65  finSize' will be
137c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
137d0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 61   file in pages a
137e0 66 74 65 72 0a 20 20 2a 2a 20 74 68 65 20 61 75  fter.  ** the au
137f0 74 6f 2d 76 61 63 75 75 6d 20 68 61 73 20 63 6f  to-vacuum has co
13800 6d 70 6c 65 74 65 64 20 28 74 68 65 20 63 75 72  mpleted (the cur
13810 72 65 6e 74 20 66 69 6c 65 20 73 69 7a 65 20 6d  rent file size m
13820 69 6e 75 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  inus the number.
13830 20 20 2a 2a 20 6f 66 20 70 61 67 65 73 20 6f 6e    ** of pages on
13840 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 29 2e   the free list).
13850 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
13860 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
13870 20 62 65 79 6f 6e 64 0a 20 20 2a 2a 20 74 68 69   beyond.  ** thi
13880 73 20 6d 61 72 6b 2c 20 61 6e 64 20 69 66 20 74  s mark, and if t
13890 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c 72 65  hey are not alre
138a0 61 64 79 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ady on the free 
138b0 6c 69 73 74 2c 20 6d 6f 76 65 20 74 68 65 6d 0a  list, move them.
138c0 20 20 2a 2a 20 74 6f 20 61 20 66 72 65 65 20 70    ** to a free p
138d0 61 67 65 20 65 61 72 6c 69 65 72 20 69 6e 20 74  age earlier in t
138e0 68 65 20 66 69 6c 65 20 28 73 6f 6d 65 77 68 65  he file (somewhe
138f0 72 65 20 62 65 66 6f 72 65 20 66 69 6e 53 69 7a  re before finSiz
13900 65 29 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 20  e)..  */.  for( 
13910 69 44 62 50 61 67 65 3d 66 69 6e 53 69 7a 65 2b  iDbPage=finSize+
13920 31 3b 20 69 44 62 50 61 67 65 3c 3d 6f 72 69 67  1; iDbPage<=orig
13930 53 69 7a 65 3b 20 69 44 62 50 61 67 65 2b 2b 20  Size; iDbPage++ 
13940 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62  ){.    /* If iDb
13950 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Page is a pointe
13960 72 20 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74  r map page, or t
13970 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
13980 70 61 67 65 2c 20 73 6b 69 70 20 69 74 2e 20 2a  page, skip it. *
13990 2f 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  /.    if( PTRMAP
139a0 5f 49 53 50 41 47 45 28 70 67 73 7a 2c 20 69 44  _ISPAGE(pgsz, iD
139b0 62 50 61 67 65 29 20 7c 7c 20 69 44 62 50 61 67  bPage) || iDbPag
139c0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
139d0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
139e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
139f0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
13a00 6d 61 70 47 65 74 28 70 42 74 2c 20 69 44 62 50  mapGet(pBt, iDbP
13a10 61 67 65 2c 20 26 65 54 79 70 65 2c 20 26 69 50  age, &eType, &iP
13a20 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
13a30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a40 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d   goto autovacuum
13a50 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28 20 65 54  _out;.    if( eT
13a60 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
13a70 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 63  PAGE ){.      rc
13a80 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
13a90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
13aa0 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75  to autovacuum_ou
13ab0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
13ac0 20 49 66 20 69 44 62 50 61 67 65 20 69 73 20 66   If iDbPage is f
13ad0 72 65 65 2c 20 64 6f 20 6e 6f 74 20 73 77 61 70  ree, do not swap
13ae0 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28   it.  */.    if(
13af0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
13b00 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
13b10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
13b20 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67  .    rc = getPag
13b30 65 28 70 42 74 2c 20 69 44 62 50 61 67 65 2c 20  e(pBt, iDbPage, 
13b40 26 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  &pDbMemPage);.  
13b50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13b60 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76  _OK ) goto autov
13b70 61 63 75 75 6d 5f 6f 75 74 3b 0a 0a 20 20 20 20  acuum_out;..    
13b80 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  /* Find the next
13b90 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
13ba0 65 2d 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e-list that is n
13bb0 6f 74 20 61 6c 72 65 61 64 79 20 61 74 20 74 68  ot already at th
13bc0 65 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  e end .    ** of
13bd0 20 74 68 65 20 66 69 6c 65 2e 20 41 20 70 61 67   the file. A pag
13be0 65 20 63 61 6e 20 62 65 20 70 75 6c 6c 65 64 20  e can be pulled 
13bf0 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
13c00 74 20 75 73 69 6e 67 20 74 68 65 20 0a 20 20 20  t using the .   
13c10 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 50 61 67 65   ** allocatePage
13c20 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  () routine..    
13c30 2a 2f 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  */.    do{.     
13c40 20 69 66 28 20 70 46 72 65 65 4d 65 6d 50 61 67   if( pFreeMemPag
13c50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  e ){.        rel
13c60 65 61 73 65 50 61 67 65 28 70 46 72 65 65 4d 65  easePage(pFreeMe
13c70 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
13c80 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30  pFreeMemPage = 0
13c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ca0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67  rc = allocatePag
13cb0 65 28 70 42 74 2c 20 26 70 46 72 65 65 4d 65 6d  e(pBt, &pFreeMem
13cc0 50 61 67 65 2c 20 26 69 46 72 65 65 50 61 67 65  Page, &iFreePage
13cd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
13ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
13d00 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61  asePage(pDbMemPa
13d10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ge);.        got
13d20 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
13d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13d40 61 73 73 65 72 74 28 20 69 46 72 65 65 50 61 67  assert( iFreePag
13d50 65 3c 3d 6f 72 69 67 53 69 7a 65 20 29 3b 0a 20  e<=origSize );. 
13d60 20 20 20 7d 77 68 69 6c 65 28 20 69 46 72 65 65     }while( iFree
13d70 50 61 67 65 3e 66 69 6e 53 69 7a 65 20 29 3b 0a  Page>finSize );.
13d80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13d90 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20  pFreeMemPage);. 
13da0 20 20 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20     pFreeMemPage 
13db0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6c  = 0;..    /* Rel
13dc0 6f 63 61 74 65 20 74 68 65 20 70 61 67 65 20 69  ocate the page i
13dd0 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
13de0 74 68 65 20 66 69 6c 65 2e 20 4e 6f 74 65 20 74  the file. Note t
13df0 68 61 74 20 61 6c 74 68 6f 75 67 68 20 74 68 65  hat although the
13e00 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 68 61   .    ** page ha
13e10 73 20 6d 6f 76 65 64 20 77 69 74 68 69 6e 20 74  s moved within t
13e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13e30 2c 20 74 68 65 20 70 44 62 4d 65 6d 50 61 67 65  , the pDbMemPage
13e40 20 70 6f 69 6e 74 65 72 20 0a 20 20 20 20 2a 2a   pointer .    **
13e50 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 20   remains valid. 
13e60 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13e70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
13e80 6e 20 72 75 6e 20 77 69 74 68 6f 75 74 0a 20 20  n run without.  
13e90 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 69 6e    ** invalidatin
13ea0 67 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  g cursors open o
13eb0 6e 20 74 68 65 20 62 74 72 65 65 2e 20 54 68 69  n the btree. Thi
13ec0 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
13ed0 6e 20 0a 20 20 20 20 2a 2a 20 73 68 61 72 65 64  n .    ** shared
13ee0 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0a 20 20 20  -cache mode..   
13ef0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 6c   */.    rc = rel
13f00 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
13f10 44 62 4d 65 6d 50 61 67 65 2c 20 65 54 79 70 65  DbMemPage, eType
13f20 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
13f30 65 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  ePage);.    rele
13f40 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61  asePage(pDbMemPa
13f50 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
13f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
13f70 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
13f80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
13f90 65 6e 74 69 72 65 20 66 72 65 65 2d 6c 69 73 74  entire free-list
13fa0 20 68 61 73 20 62 65 65 6e 20 73 77 61 70 70 65   has been swappe
13fb0 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
13fc0 74 68 65 20 66 69 6c 65 2e 20 53 6f 0a 20 20 2a  the file. So.  *
13fd0 2a 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  * truncate the d
13fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
13ff0 66 69 6e 53 69 7a 65 20 70 61 67 65 73 20 61 6e  finSize pages an
14000 64 20 63 6f 6e 73 69 64 65 72 20 74 68 65 0a 20  d consider the. 
14010 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 65 6d   ** free-list em
14020 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  pty..  */.  rc =
14030 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
14040 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
14050 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  >aData);.  if( r
14060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
14070 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
14080 75 74 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ut;.  put4byte(&
14090 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
140a0 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 70 75  ta[32], 0);.  pu
140b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
140c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
140d0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
140e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
140f0 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
14100 20 2a 6e 54 72 75 6e 63 20 3d 20 66 69 6e 53 69   *nTrunc = finSi
14110 7a 65 3b 0a 0a 61 75 74 6f 76 61 63 75 75 6d 5f  ze;..autovacuum_
14120 6f 75 74 3a 0a 20 20 61 73 73 65 72 74 28 20 6e  out:.  assert( n
14130 52 65 66 3d 3d 2a 73 71 6c 69 74 65 33 70 61 67  Ref==*sqlite3pag
14140 65 72 5f 73 74 61 74 73 28 70 50 61 67 65 72 29  er_stats(pPager)
14150 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
14160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
14170 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
14180 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14190 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
141a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
141b0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
141c0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
141d0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
141e0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
141f0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
14200 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
14210 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
14220 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
14230 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
14240 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
14250 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
14260 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14270 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
14280 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14290 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
142a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
142b0 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  t;..  btreeInteg
142c0 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63  rity(p);.  unloc
142d0 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
142e0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
142f0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
14300 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
14310 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
14320 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
14330 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
14340 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
14350 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
14360 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
14370 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
14380 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 61 73  _WRITE ){.    as
14390 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
143a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
143b0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
143c0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
143d0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
143e0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
143f0 72 5f 63 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50  r_commit(pBt->pP
14400 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
14410 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
14420 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
14430 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
14440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14450 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79  e handle has any
14460 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
14470 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
14480 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  ment the transac
14490 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20  tion.  ** count 
144a0 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
144b0 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
144c0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65  saction count re
144d0 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a  aches 0, set.  *
144e0 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  * the shared sta
144f0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
14500 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
14510 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c  eIfUnused() call
14520 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c   below.  ** will
14530 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
14540 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  r..  */.  if( p-
14550 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
14560 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d  NONE ){.    pBt-
14570 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
14580 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
14590 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
145a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
145b0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
145c0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
145d0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
145e0 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20  handles current 
145f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
14600 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
14610 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20  and unlock.  ** 
14620 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69  the pager if thi
14630 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
14640 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
14650 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
14660 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72  ..  */.  p->inTr
14670 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
14680 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
14690 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
146a0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
146b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
146c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
146d0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
146e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
146f0 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
14700 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
14710 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
14720 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
14730 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
14740 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
14750 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
14760 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
14770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
14780 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
14790 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
147a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
147b0 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
147c0 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
147d0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
147e0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
147f0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
14800 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a 20  wrFlag ) r++; . 
14810 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
14820 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
14830 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
14840 2a 20 50 72 69 6e 74 20 64 65 62 75 67 67 69 6e  * Print debuggin
14850 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  g information ab
14860 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  out all cursors 
14870 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
14880 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ut..*/.void sqli
14890 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 4c 69  te3BtreeCursorLi
148a0 73 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  st(Btree *p){.  
148b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
148c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
148d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28  = p->pBt;.  for(
148e0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
148f0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
14900 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
14910 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
14920 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
14930 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20    char *zMode = 
14940 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22  pCur->wrFlag ? "
14950 72 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20  rw" : "ro";.    
14960 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
14970 74 66 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f  tf("CURSOR %p ro
14980 6f 74 65 64 20 61 74 20 25 34 64 28 25 73 29 20  oted at %4d(%s) 
14990 63 75 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e  currently at %d.
149a0 25 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %d%s\n",.       
149b0 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  pCur, pCur->pgno
149c0 52 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20  Root, zMode,.   
149d0 20 20 20 20 70 50 61 67 65 20 3f 20 70 50 61 67      pPage ? pPag
149e0 65 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75  e->pgno : 0, pCu
149f0 72 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 28  r->idx,.       (
14a00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
14a10 52 53 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22 22  RSOR_VALID) ? ""
14a20 20 3a 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b   : " eof".    );
14a30 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
14a40 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
14a50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
14a60 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
14a70 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
14a80 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
14a90 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
14aa0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
14ab0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
14ac0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
14ad0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
14ae0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
14af0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
14b00 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
14b10 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
14b20 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
14b30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
14b40 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
14b50 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
14b60 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
14b70 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
14b80 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
14b90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14ba0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
14bb0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
14bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
14bd0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14be0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
14bf0 70 50 61 67 65 31 3b 0a 0a 20 20 62 74 72 65 65  pPage1;..  btree
14c00 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
14c10 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
14c20 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
14c30 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
14c40 54 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TE ){.    assert
14c50 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
14c60 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14c70 6e 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  n );..    rc = s
14c80 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
14c90 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
14ca0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  );.    /* The ro
14cb0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
14cc0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
14cd0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
14ce0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
14cf0 6c 6c 20 67 65 74 50 61 67 65 28 29 20 6f 6e 20  ll getPage() on 
14d00 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
14d10 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 31  make sure pPage1
14d20 2d 3e 61 44 61 74 61 20 69 73 0a 20 20 20 20 2a  ->aData is.    *
14d30 2a 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  * set correctly.
14d40 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 50   */.    if( getP
14d50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
14d60 67 65 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ge1)==SQLITE_OK 
14d70 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
14d80 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
14d90 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
14da0 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
14db0 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
14dc0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14dd0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
14de0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
14df0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
14e00 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
14e10 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
14e20 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
14e30 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
14e40 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
14e50 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
14e60 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
14e70 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
14e80 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
14e90 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    }..  p->inTran
14ea0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
14eb0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
14ec0 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
14ed0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
14ee0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14ef0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
14f10 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
14f20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
14f30 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
14f40 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
14f50 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
14f60 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
14f70 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
14f80 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
14f90 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
14fa0 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
14fb0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
14fc0 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
14fd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
14fe0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
14ff0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
15000 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
15010 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
15020 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
15030 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
15040 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
15050 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
15060 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
15070 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
15080 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
15090 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
150a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
150b0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
150c0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
150d0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
150e0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
150f0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
15100 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
15110 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
15120 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
15130 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
15140 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
15150 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
15160 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
15170 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
15180 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
15190 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
151a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
151b0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
151c0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
151d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
151e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
151f0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
15200 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
15210 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15220 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
15230 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
15240 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
15250 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
15260 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
15270 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
15280 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
15290 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
152a0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
152b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
152c0 57 52 49 54 45 20 29 3b 0a 20 20 72 63 20 3d 20  WRITE );.  rc = 
152d0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
152e0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
152f0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
15300 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
15310 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
15320 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
15330 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ;.}.../*.** Comm
15340 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20  it the statment 
15350 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
15360 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
15370 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20  ress.  If no.** 
15380 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
15390 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69  s active, this i
153a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
153b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
153c0 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a  mmitStmt(Btree *
153d0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
153e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
153f0 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
15400 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
15410 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
15420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
15430 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
15440 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
15460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15470 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
15480 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
15490 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
154a0 6b 20 74 68 65 20 61 63 74 69 76 65 20 73 74 61  k the active sta
154b0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
154c0 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75  ction.  If no su
154d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  btransaction.** 
154e0 69 73 20 61 63 74 69 76 65 20 74 68 69 73 20 72  is active this r
154f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
15500 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72  p..**.** All cur
15510 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76  sors will be inv
15520 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73  alidated by this
15530 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
15540 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75   attempt.** to u
15550 73 65 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  se a cursor that
15560 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
15570 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
15580 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  is operation.** 
15590 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
155a0 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  n error..*/.int 
155b0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
155c0 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a  backStmt(Btree *
155d0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
155e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
155f0 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
15600 74 2d 3e 69 6e 53 74 6d 74 3d 3d 30 20 7c 7c 20  t->inStmt==0 || 
15610 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20  pBt->readOnly ) 
15620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15630 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15640 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
15650 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
15660 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
15670 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
15680 74 29 3d 3d 30 20 29 3b 0a 20 20 70 42 74 2d 3e  t)==0 );.  pBt->
15690 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65  inStmt = 0;.  re
156a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
156b0 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f  * Default key co
156c0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
156d0 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69 66 20  n to be used if 
156e0 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  no comparison fu
156f0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65  nction.** is spe
15700 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71  cified on the sq
15710 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15720 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  () call..*/.stat
15730 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61  ic int dfltCompa
15740 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  re(.  void *NotU
15750 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  sed,            
15760 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 69 73   /* User data is
15770 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69   not used */.  i
15780 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nt n1, const voi
15790 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72  d *p1,    /* Fir
157a0 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  st key to compar
157b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63  e */.  int n2, c
157c0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20  onst void *p2   
157d0 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20    /* Second key 
157e0 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b  to compare */.){
157f0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20  .  int c;.  c = 
15800 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e  memcmp(p1, p2, n
15810 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b  1<n2 ? n1 : n2);
15820 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
15830 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a     c = n1 - n2;.
15840 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a    }.  return c;.
15850 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
15860 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
15870 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
15880 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
15890 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
158a0 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75   The act of acqu
158b0 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67  iring a cursor g
158c0 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ets a read lock 
158d0 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
158e0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
158f0 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
15900 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
15910 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
15920 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
15930 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
15940 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
15950 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
15960 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
15970 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
15980 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
15990 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
159a0 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
159b0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
159c0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
159d0 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
159e0 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
159f0 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
15a00 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
15a10 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
15a20 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
15a30 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4e 6f  ==1.**.** 2:  No
15a40 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6d   other cursors m
15a50 61 79 20 62 65 20 6f 70 65 6e 20 77 69 74 68 20  ay be open with 
15a60 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
15a70 20 73 61 6d 65 20 74 61 62 6c 65 0a 2a 2a 0a 2a   same table.**.*
15a80 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
15a90 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
15aa0 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
15ab0 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
15ac0 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
15ad0 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
15ae0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
15af0 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 32 20 77 61  * Condition 2 wa
15b00 72 72 61 6e 74 73 20 66 75 72 74 68 65 72 20 64  rrants further d
15b10 69 73 63 75 73 73 69 6f 6e 2e 20 20 49 66 20 61  iscussion.  If a
15b20 6e 79 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  ny cursor is ope
15b30 6e 65 64 0a 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  ned.** on a tabl
15b40 65 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  e with wrFlag==0
15b50 2c 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20  , that prevents 
15b60 61 6c 6c 20 6f 74 68 65 72 20 63 75 72 73 6f 72  all other cursor
15b70 73 20 66 72 6f 6d 0a 2a 2a 20 77 72 69 74 69 6e  s from.** writin
15b80 67 20 74 6f 20 74 68 61 74 20 74 61 62 6c 65 2e  g to that table.
15b90 20 20 54 68 69 73 20 69 73 20 61 20 6b 69 6e 64    This is a kind
15ba0 20 6f 66 20 22 72 65 61 64 2d 6c 6f 63 6b 22 2e   of "read-lock".
15bb0 20 20 57 68 65 6e 20 61 20 63 75 72 73 6f 72 0a    When a cursor.
15bc0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 77 69 74  ** is opened wit
15bd0 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 74 20 69  h wrFlag==0 it i
15be0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
15bf0 74 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c  t the table will
15c00 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 20 61   not.** change a
15c10 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 63 75  s long as the cu
15c20 72 73 6f 72 20 69 73 20 6f 70 65 6e 2e 20 20 54  rsor is open.  T
15c30 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
15c40 75 72 73 6f 72 20 74 6f 0a 2a 2a 20 64 6f 20 61  ursor to.** do a
15c50 20 73 65 71 75 65 6e 74 69 61 6c 20 73 63 61 6e   sequential scan
15c60 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69   of the table wi
15c70 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
15c80 77 6f 72 72 79 20 61 62 6f 75 74 0a 2a 2a 20 65  worry about.** e
15c90 6e 74 72 69 65 73 20 62 65 69 6e 67 20 69 6e 73  ntries being ins
15ca0 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
15cb0 20 64 75 72 69 6e 67 20 74 68 65 20 73 63 61 6e   during the scan
15cc0 2e 20 20 43 75 72 73 6f 72 73 20 73 68 6f 75 6c  .  Cursors shoul
15cd0 64 0a 2a 2a 20 62 65 20 6f 70 65 6e 65 64 20 77  d.** be opened w
15ce0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
15cf0 6c 79 20 69 66 20 74 68 69 73 20 72 65 61 64 2d  ly if this read-
15d00 6c 6f 63 6b 20 70 72 6f 70 65 72 74 79 20 69 73  lock property is
15d10 20 6e 65 65 64 65 64 2e 0a 2a 2a 20 54 68 61 74   needed..** That
15d20 20 69 73 20 74 6f 20 73 61 79 2c 20 63 75 72 73   is to say, curs
15d30 6f 72 73 20 73 68 6f 75 6c 64 20 62 65 20 6f 70  ors should be op
15d40 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
15d50 3d 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68 65 79  ==0 only if they
15d60 0a 2a 2a 20 69 6e 74 65 6e 64 20 74 6f 20 75 73  .** intend to us
15d70 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  e the sqlite3Btr
15d80 65 65 4e 65 78 74 28 29 20 73 79 73 74 65 6d 20  eeNext() system 
15d90 63 61 6c 6c 2e 20 20 41 6c 6c 20 6f 74 68 65 72  call.  All other
15da0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 73 68 6f 75   cursors.** shou
15db0 6c 64 20 62 65 20 6f 70 65 6e 65 64 20 77 69 74  ld be opened wit
15dc0 68 20 77 72 46 6c 61 67 3d 3d 31 20 65 76 65 6e  h wrFlag==1 even
15dd0 20 69 66 20 74 68 65 79 20 6e 65 76 65 72 20 72   if they never r
15de0 65 61 6c 6c 79 20 69 6e 74 65 6e 64 0a 2a 2a 20  eally intend.** 
15df0 74 6f 20 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a  to write..** .**
15e00 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
15e10 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
15e20 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
15e30 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
15e40 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
15e50 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
15e60 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
15e70 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
15e80 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
15e90 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
15ea0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69  *.** The compari
15eb0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  son function mus
15ec0 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74  t be logically t
15ed0 68 65 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72  he same for ever
15ee0 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61  y cursor.** on a
15ef0 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
15f00 65 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  e.  Changing the
15f10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
15f20 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
15f30 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74  .** in incorrect
15f40 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66   operations.  If
15f50 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
15f60 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
15f70 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63  , a.** default c
15f80 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
15f90 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 65  on is used.  The
15fa0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
15fb0 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79  tion is.** alway
15fc0 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e  s ignored for IN
15fd0 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  TKEY tables..*/.
15fe0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15ff0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
16000 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
16030 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
16040 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
16070 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
16080 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
16090 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
160c0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
160d0 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76  .  int (*xCmp)(v
160e0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
160f0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
16100 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f  oid*), /* Key Co
16110 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f  mparison func */
16120 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20  .  void *pArg,  
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16150 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
16160 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
16170 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20  tCursor **ppCur 
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
161a0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
161b0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
161c0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
161d0 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64  pCur;.  BtShared
161e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
161f0 0a 20 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20  .  *ppCur = 0;. 
16200 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
16210 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
16220 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65  Only ){.      re
16230 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
16240 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
16250 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
16260 6b 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20  ks(pBt, iTable, 
16270 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
16280 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
16290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
162a0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
162b0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  0 ){.    rc = lo
162c0 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
162d0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
162e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
162f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16300 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20     }.  }.  pCur 
16310 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
16320 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b  sizeof(*pCur) );
16330 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
16340 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16350 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
16360 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
16370 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
16380 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
16390 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
163a0 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
163b0 30 3b 20 20 2f 2a 20 46 6f 72 20 65 78 69 74 2d  0;  /* For exit-
163c0 68 61 6e 64 6c 65 72 2c 20 69 6e 20 63 61 73 65  handler, in case
163d0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
163e0 29 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66  ) fails. */.  if
163f0 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 73  ( iTable==1 && s
16400 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
16410 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
16420 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  r)==0 ){.    rc 
16430 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
16440 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
16450 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
16460 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
16470 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
16480 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
16490 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30   &pCur->pPage, 0
164a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
164b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
164c0 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
164d0 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
164e0 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
164f0 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
16500 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
16510 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
16520 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
16530 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68  riables, link th
16540 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
16550 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 20  e BtShared list 
16560 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20 28  and set *ppCur (
16570 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20  the.  ** output 
16580 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
16590 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f   function)..  */
165a0 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72  .  pCur->xCompar
165b0 65 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20  e = xCmp ? xCmp 
165c0 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20  : dfltCompare;. 
165d0 20 70 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41   pCur->pArg = pA
165e0 72 67 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  rg;.  pCur->pBtr
165f0 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
16600 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
16610 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
16620 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 43 75 72  ;.  memset(&pCur
16630 2d 3e 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ->info, 0, sizeo
16640 66 28 70 43 75 72 2d 3e 69 6e 66 6f 29 29 3b 0a  f(pCur->info));.
16650 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
16660 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
16670 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
16680 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
16690 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
166a0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 50  ;.  }.  pCur->pP
166b0 72 65 76 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e  rev = 0;.  pBt->
166c0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
166d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
166e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
166f0 0a 20 20 2a 70 70 43 75 72 20 3d 20 70 43 75 72  .  *ppCur = pCur
16700 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
16710 54 45 5f 4f 4b 3b 0a 63 72 65 61 74 65 5f 63 75  TE_OK;.create_cu
16720 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a  rsor_exception:.
16730 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
16740 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
16750 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
16760 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 29  sqliteFree(pCur)
16770 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74  ;.  }.  unlockBt
16780 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
16790 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
167a0 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f 74 20  ..#if 0  /* Not 
167b0 55 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68  Used */./*.** Ch
167c0 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
167d0 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
167e0 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
167f0 79 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  y a cursor..*/.v
16800 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
16810 53 65 74 43 6f 6d 70 61 72 65 28 0a 20 20 42 74  SetCompare(.  Bt
16820 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
16830 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
16840 74 6f 20 77 68 6f 73 65 20 63 6f 6d 70 61 72 69  to whose compari
16850 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  son function is 
16860 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 69 6e 74  changed */.  int
16870 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e  (*xCmp)(void*,in
16880 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
16890 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20  t,const void*), 
168a0 2f 2a 20 4e 65 77 20 63 6f 6d 70 61 72 69 73 6f  /* New compariso
168b0 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64  n func */.  void
168c0 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
168d0 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
168e0 74 20 74 6f 20 78 43 6d 70 28 29 20 2a 2f 0a 29  t to xCmp() */.)
168f0 7b 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  {.  pCur->xCompa
16900 72 65 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70  re = xCmp ? xCmp
16910 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a   : dfltCompare;.
16920 20 20 70 43 75 72 2d 3e 70 41 72 67 20 3d 20 70    pCur->pArg = p
16930 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  Arg;.}.#endif../
16940 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
16950 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
16960 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16970 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
16980 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
16990 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
169a0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
169b0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
169c0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
169d0 2a 70 43 75 72 29 7b 0a 20 20 42 74 53 68 61 72  *pCur){.  BtShar
169e0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
169f0 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 72  pBtree->pBt;.  r
16a00 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
16a10 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20  tion(pCur, 0);. 
16a20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
16a30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50   ){.    pCur->pP
16a40 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
16a50 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
16a60 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  e{.    pBt->pCur
16a70 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
16a80 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  t;.  }.  if( pCu
16a90 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
16aa0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
16ab0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
16ac0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
16ad0 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
16ae0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
16af0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
16b00 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 29  sqliteFree(pCur)
16b10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16b20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
16b30 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
16b40 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
16b50 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
16b60 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
16b70 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
16b80 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
16b90 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
16ba0 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
16bb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
16bc0 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
16bd0 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
16be0 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
16bf0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75    memcpy(pTempCu
16c00 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28  r, pCur, sizeof(
16c10 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70  *pCur));.  pTemp
16c20 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
16c30 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
16c40 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65  v = 0;.  if( pTe
16c50 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a  mpCur->pPage ){.
16c60 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
16c70 5f 72 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70  _ref(pTempCur->p
16c80 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
16c90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
16ca0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
16cb0 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
16cc0 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
16cd0 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
16ce0 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
16cf0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
16d00 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65  c void releaseTe
16d10 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
16d20 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
16d30 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
16d40 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
16d50 75 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67  unref(pCur->pPag
16d60 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d  e->aData);.  }.}
16d70 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
16d80 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  e the BtCursor.i
16d90 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65  nfo field of the
16da0 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73   given cursor is
16db0 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74   valid..** If it
16dc0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16dd0 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73  valid, call pars
16de0 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
16df0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
16e00 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
16e10 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
16e20 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
16e30 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
16e40 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
16e50 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
16e60 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
16e70 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f   parseCell()..*/
16e80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
16e90 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
16ea0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
16eb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
16ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65  ==0 ){.    parse
16ed0 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
16ee0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
16ef0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
16f00 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
16f10 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  UG.    CellInfo 
16f20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
16f30 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
16f40 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61  f(info));.    pa
16f50 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
16f60 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
16f70 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
16f80 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
16f90 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
16fa0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
16fb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
16fc0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
16fd0 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
16fe0 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
16ff0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
17000 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
17010 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
17020 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
17030 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
17040 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
17050 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
17060 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
17070 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
17080 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
17090 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
170a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
170b0 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
170c0 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
170d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
170e0 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
170f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
17100 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
17110 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
17120 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
17130 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
17140 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20  ion(pCur, 1);.  
17150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17160 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
17170 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
17180 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
17190 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
171a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
171b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
171c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
171d0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  LID ){.      *pS
171e0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
171f0 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
17200 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
17210 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
17220 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
17230 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17240 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
17250 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
17260 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
17270 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
17280 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
17290 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
172a0 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72  ts to.  Always r
172b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
172c0 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
172d0 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66  ot possible.  If
172e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
172f0 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ot currently.** 
17300 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65  pointing to an e
17310 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20  ntry (which can 
17320 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
17330 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64  ple, if.** the d
17340 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
17350 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73  ) then *pSize is
17360 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e   set to 0..*/.in
17370 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
17380 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
17390 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
173a0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  e){.  int rc = r
173b0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
173c0 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20  tion(pCur, 1);. 
173d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
173e0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
173f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17400 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
17410 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
17420 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
17430 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
17440 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
17450 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ALID ){.      /*
17460 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   Not pointing at
17470 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d   a valid entry -
17480 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30   set *pSize to 0
17490 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a  . */.      *pSiz
174a0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
174b0 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
174c0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
174d0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
174e0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
174f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17500 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
17510 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
17520 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
17530 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
17540 72 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 70  r cursor is.** p
17550 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65 67  ointing to.  Beg
17560 69 6e 20 72 65 61 64 69 6e 67 20 74 68 65 20 70  in reading the p
17570 61 79 6c 6f 61 64 20 61 74 20 22 6f 66 66 73 65  ayload at "offse
17580 74 22 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 61  t" and read.** a
17590 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20   total of "amt" 
175a0 62 79 74 65 73 2e 20 20 50 75 74 20 74 68 65 20  bytes.  Put the 
175b0 72 65 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e 0a  result in zBuf..
175c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
175d0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
175e0 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
175f0 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
17600 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
17610 72 65 61 64 73 20 62 79 74 65 73 20 66 72 6f 6d  reads bytes from
17620 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
17630 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 61  a.  Data might a
17640 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65 20  ppear.** on the 
17650 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
17660 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
17670 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
17680 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  ow pages..*/.sta
17690 74 69 63 20 69 6e 74 20 67 65 74 50 61 79 6c 6f  tic int getPaylo
176a0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
176b0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
176c0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
176d0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
176e0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  rom */.  int off
176f0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  set,          /*
17700 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74   Begin reading t
17710 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79  his far into pay
17720 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  load */.  int am
17730 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
17740 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79  * Read this many
17750 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
17760 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c  gned char *pBuf,
17770 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79   /* Write the by
17780 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75  tes into this bu
17790 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73  ffer */ .  int s
177a0 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
177b0 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73  /* offset begins
177c0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
177d0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
177e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
177f0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f  aPayload;.  Pgno
17800 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 69 6e 74   nextPage;.  int
17810 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
17820 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  pPage;.  BtShare
17830 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76  d *pBt;.  int ov
17840 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b  flSize;.  u32 nK
17850 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ey;..  assert( p
17860 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
17870 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
17880 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
17890 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
178a0 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 43 75 72   );.  pBt = pCur
178b0 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  ->pBtree->pBt;. 
178c0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
178d0 50 61 67 65 3b 0a 20 20 70 61 67 65 49 6e 74 65  Page;.  pageInte
178e0 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
178f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
17900 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
17910 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
17920 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
17930 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
17940 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
17950 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
17960 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
17970 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
17980 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
17990 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
179a0 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
179b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
179c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
179d0 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 69  offset>=0 );.  i
179e0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
179f0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
17a00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
17a10 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
17a20 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29  ur->info.nData )
17a30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17a40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
17a50 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
17a60 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
17a70 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
17a80 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
17a90 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
17aa0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
17ab0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
17ac0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
17ad0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
17ae0 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f  Buf, &aPayload[o
17af0 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20 20 20  ffset], a);.    
17b00 69 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a 20 20  if( a==amt ){.  
17b10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17b20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
17b30 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
17b40 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
17b50 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
17b60 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
17b70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17b80 6c 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 53 69 7a  l;.  }.  ovflSiz
17b90 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
17ba0 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 61  ize - 4;.  if( a
17bb0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 6e 65 78 74  mt>0 ){.    next
17bc0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
17bd0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
17be0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20  info.nLocal]);. 
17bf0 20 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20     while( amt>0 
17c00 26 26 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20  && nextPage ){. 
17c10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17c20 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
17c30 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
17c40 2c 20 28 76 6f 69 64 2a 2a 29 26 61 50 61 79 6c  , (void**)&aPayl
17c50 6f 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oad);.      if( 
17c60 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
17c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17c80 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 50 61    }.      nextPa
17c90 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
17ca0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 69  ayload);.      i
17cb0 66 28 20 6f 66 66 73 65 74 3c 6f 76 66 6c 53 69  f( offset<ovflSi
17cc0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
17cd0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
17ce0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
17cf0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
17d00 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
17d10 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
17d20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17d30 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
17d40 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
17d50 2b 34 5d 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  +4], a);.       
17d60 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
17d70 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
17d80 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
17d90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17da0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
17db0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
17dc0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17dd0 70 61 67 65 72 5f 75 6e 72 65 66 28 61 50 61 79  pager_unref(aPay
17de0 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  load);.    }.  }
17df0 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
17e00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17e10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17e30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17e40 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
17e50 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
17e60 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
17e70 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
17e80 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
17e90 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
17ea0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
17eb0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
17ec0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
17ed0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
17ee0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
17ef0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
17f00 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
17f10 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
17f20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
17f30 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
17f40 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
17f50 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
17f60 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
17f70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17f80 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
17f90 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
17fa0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
17fb0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pBuf){.  int rc 
17fc0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
17fd0 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29  osition(pCur, 1)
17fe0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18000 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18010 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18030 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
18040 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
18050 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
18060 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18070 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18090 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
180a0 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
180b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
180c0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
180d0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
180e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
180f0 20 3d 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43   = getPayload(pC
18100 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
18110 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
18120 29 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20  )pBuf, 0);.  }. 
18130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18140 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
18150 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
18160 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
18170 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
18180 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
18190 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
181a0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
181b0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
181c0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
181d0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
181e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
181f0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
18200 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
18210 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18220 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18230 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
18240 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18250 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18260 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18270 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18280 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
18290 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
182a0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
182b0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
182c0 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75  t rc = restoreCu
182d0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
182e0 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  r, 1);.  if( rc=
182f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18300 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18310 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18320 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
18330 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
18340 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18350 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18360 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
18370 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
18380 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
18390 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
183a0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31  et, amt, pBuf, 1
183b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
183c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
183d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
183e0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
183f0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
18400 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
18410 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
18420 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
18430 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
18440 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18450 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
18460 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
18470 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
18480 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
18490 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
184a0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
184b0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
184c0 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
184d0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
184e0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
184f0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
18500 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
18510 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
18520 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
18530 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18540 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
18550 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
18560 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
18570 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
18580 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
18590 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
185a0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
185b0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
185c0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
185d0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
185e0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
185f0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
18600 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
18610 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
18620 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
18630 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
18640 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
18650 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
18660 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d 75   getPayload() mu
18670 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
18680 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
18690 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
186a0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
186b0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
186c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
186d0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
186e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
186f0 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
18700 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
18710 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
18720 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
18730 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
18740 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
18750 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
18760 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
18770 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
18780 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18790 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
187a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
187b0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
187c0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
187d0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
187e0 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
187f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
18810 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
18820 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
18830 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
18840 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
18850 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
18860 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
18870 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
18880 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
18890 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
188a0 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f   nKey;.  int nLo
188b0 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
188c0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
188d0 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
188e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
188f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18900 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
18910 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 61  Cur->pPage;.  pa
18920 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67  geIntegrity(pPag
18930 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e);.  assert( pC
18940 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
18950 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
18960 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
18970 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
18980 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
18990 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
189a0 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
189b0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
189c0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
189d0 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
189e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
189f0 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  nKey = pCur->inf
18a00 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
18a10 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
18a20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
18a30 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
18a40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
18a50 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
18a60 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
18a70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
18a80 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61  l;.    if( nLoca
18a90 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  l>nKey ){.      
18aa0 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20  nLocal = nKey;. 
18ab0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74     }.  }.  *pAmt
18ac0 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
18ad0 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
18ae0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
18af0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
18b00 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
18b10 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
18b20 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
18b30 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
18b40 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
18b50 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
18b60 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
18b70 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
18b80 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
18b90 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
18ba0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
18bb0 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
18bc0 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
18bd0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
18be0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
18bf0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
18c00 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
18c10 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
18c20 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
18c30 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
18c40 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
18c50 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
18c60 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
18c70 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
18c80 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
18c90 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
18ca0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
18cb0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
18cc0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
18cd0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
18ce0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18cf0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
18d00 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
18d10 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
18d20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
18d30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
18d40 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
18d50 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
18d60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
18d70 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20  t *pAmt){.  if( 
18d80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18d90 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
18da0 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
18db0 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
18dc0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31  ad(pCur, pAmt, 1
18dd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18de0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  0;.}.../*.** Mov
18df0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
18e00 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
18e10 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
18e20 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
18e30 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
18e40 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
18e50 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
18e60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
18e70 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
18e80 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
18e90 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  ewPgno){.  int r
18ea0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
18eb0 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  ewPage;.  MemPag
18ec0 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42  e *pOldPage;.  B
18ed0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18ee0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
18ef0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
18f00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18f10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
18f20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
18f30 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
18f40 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e  pNewPage, pCur->
18f50 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
18f60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
18f70 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 4e  pageIntegrity(pN
18f80 65 77 50 61 67 65 29 3b 0a 20 20 70 4e 65 77 50  ewPage);.  pNewP
18f90 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  age->idxParent =
18fa0 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f   pCur->idx;.  pO
18fb0 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  ldPage = pCur->p
18fc0 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65  Page;.  pOldPage
18fd0 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
18fe0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
18ff0 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d  ldPage);.  pCur-
19000 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67  >pPage = pNewPag
19010 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  e;.  pCur->idx =
19020 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
19030 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
19040 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
19050 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  l<1 ){.    retur
19060 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19070 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
19080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19090 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
190a0 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20  rue if the page 
190b0 69 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  is the virtual r
190c0 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65  oot of its table
190d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74  ..**.** The virt
190e0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
190f0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
19100 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20  or most tables. 
19110 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20   But.** for the 
19120 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20  table rooted on 
19130 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65  page 1, sometime
19140 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70   the real root p
19150 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20  age.** is empty 
19160 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 72  except for the r
19170 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49  ight-pointer.  I
19180 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68 65  n such cases the
19190 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
191a0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
191b0 65 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74  e that the right
191c0 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65  -pointer of page
191d0 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e  .** 1 is pointin
191e0 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  g to..*/.static 
191f0 69 6e 74 20 69 73 52 6f 6f 74 50 61 67 65 28 4d  int isRootPage(M
19200 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
19210 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
19220 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
19230 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65  ent;.  if( pPare
19240 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  nt==0 ) return 1
19250 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d  ;.  if( pParent-
19260 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e  >pgno>1 ) return
19270 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79   0;.  if( get2by
19280 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
19290 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
192a0 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72  ffset+3])==0 ) r
192b0 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
192c0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  n 0;.}../*.** Mo
192d0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
192e0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
192f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
19300 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
19310 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
19320 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
19330 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
19340 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
19350 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
19360 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
19370 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
19380 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
19390 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
193a0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
193b0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
193c0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
193d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
193e0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
193f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
19400 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
19410 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
19420 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72  ge;.  int idxPar
19430 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ent;..  assert( 
19440 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19450 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19460 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
19470 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
19480 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
19490 65 72 74 28 20 21 69 73 52 6f 6f 74 50 61 67 65  ert( !isRootPage
194a0 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 61 67  (pPage) );.  pag
194b0 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67 65  eIntegrity(pPage
194c0 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  );.  pParent = p
194d0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
194e0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
194f0 21 3d 30 20 29 3b 0a 20 20 70 61 67 65 49 6e 74  !=0 );.  pageInt
19500 65 67 72 69 74 79 28 70 50 61 72 65 6e 74 29 3b  egrity(pParent);
19510 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70  .  idxParent = p
19520 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
19530 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
19540 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  ref(pParent->aDa
19550 74 61 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ta);.  releasePa
19560 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75  ge(pPage);.  pCu
19570 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65  r->pPage = pPare
19580 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  nt;.  pCur->info
19590 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73  .nSize = 0;.  as
195a0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
195b0 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
195c0 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
195d0 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
195e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
195f0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
19600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
19610 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
19620 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
19630 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
19640 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
19650 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
19660 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 69  Btree->pBt;..  i
19670 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f  f( .    SQLITE_O
19680 4b 21 3d 28 72 63 20 3d 20 72 65 73 74 6f 72 65  K!=(rc = restore
19690 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
196a0 43 75 72 2c 20 30 29 29 20 7c 7c 0a 20 20 20 20  Cur, 0)) ||.    
196b0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
196c0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
196d0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
196e0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29  oot, &pRoot, 0))
196f0 0a 20 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  .  ){.    pCur->
19700 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
19710 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
19720 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
19730 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
19740 70 50 61 67 65 29 3b 0a 20 20 70 61 67 65 49 6e  pPage);.  pageIn
19750 74 65 67 72 69 74 79 28 70 52 6f 6f 74 29 3b 0a  tegrity(pRoot);.
19760 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
19770 70 52 6f 6f 74 3b 0a 20 20 70 43 75 72 2d 3e 69  pRoot;.  pCur->i
19780 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
19790 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
197a0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
197b0 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
197c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
197d0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61  o subpage;.    a
197e0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
197f0 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
19800 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
19810 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
19820 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
19830 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
19840 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
19850 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
19860 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
19870 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
19880 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
19890 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  );.  }.  pCur->e
198a0 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e  State = ((pCur->
198b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pPage->nCell>0)?
198c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
198d0 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
198e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
198f0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19900 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
19910 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
19920 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
19930 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
19940 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
19950 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a  ly pointing..*/.
19960 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
19970 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
19980 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
19990 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
199a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
199b0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ge;..  assert( p
199c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
199d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
199e0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
199f0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
19a00 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
19a10 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
19a20 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
19a30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
19a40 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
19a50 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
19a60 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20  pCur->idx));.   
19a70 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
19a80 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
19a90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
19aa0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
19ab0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19ac0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
19ad0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
19ae0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
19af0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
19b00 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
19b10 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
19b20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
19b30 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
19b40 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
19b50 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
19b60 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
19b70 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
19b80 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
19b90 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
19ba0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
19bb0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
19bc0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
19bd0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
19be0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
19bf0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
19c00 65 20 2a 70 61 67 65 2a 2e 0a 2a 2f 0a 73 74 61  e *page*..*/.sta
19c10 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
19c20 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
19c30 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
19c40 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pgno;.  int rc;.
19c50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19c60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
19c70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19c80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
19c90 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
19ca0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
19cb0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
19cc0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
19cd0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
19ce0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
19cf0 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67  pCur->idx = pPag
19d00 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
19d10 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
19d20 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
19d30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19d40 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
19d50 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  idx = pPage->nCe
19d60 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e  ll - 1;.  pCur->
19d70 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
19d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19d90 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
19da0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
19db0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
19dc0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
19dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
19de0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
19df0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
19e00 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
19e10 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
19e20 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
19e30 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
19e40 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
19e50 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
19e60 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
19e70 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
19e80 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
19e90 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
19ea0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
19eb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
19ec0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
19ed0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
19ee0 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
19ef0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
19f00 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
19f10 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
19f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19f30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19f40 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
19f50 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  l>0 );.  *pRes =
19f60 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   0;.  rc = moveT
19f70 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
19f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19f90 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
19fa0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
19fb0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
19fc0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
19fd0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
19fe0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
19ff0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a000 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a010 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a020 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a030 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a040 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a050 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1a060 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1a070 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1a080 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
1a090 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1a0a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1a0b0 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 43  turn rc;.  if( C
1a0c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1a0d0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1a0e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1a0f0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
1a100 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
1a110 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1a120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1a130 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a140 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a150 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  D );.  *pRes = 0
1a160 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1a170 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1a180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a190 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a1a0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1a1b0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1a1c0 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e   near pKey/nKey.
1a1d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 75 63  .** Return a suc
1a1e0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
1a1f0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
1a200 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  es, only the nKe
1a210 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1a220 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
1a230 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f   ignored.  For o
1a240 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65  ther tables, nKe
1a250 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  y is the number 
1a260 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1a270 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20 54 68  .** in pKey.  Th
1a280 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
1a290 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
1a2a0 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
1a2b0 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69  was.** created i
1a2c0 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
1a2d0 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  e keys..**.** If
1a2e0 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
1a2f0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
1a300 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1a310 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
1a320 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
1a330 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
1a340 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
1a350 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
1a360 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
1a370 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
1a380 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
1a390 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
1a3a0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
1a3b0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  key..**.** The r
1a3c0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1a3d0 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
1a3e0 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
1a3f0 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ch the.** cursor
1a400 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
1a410 70 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55  pRes if pRes!=NU
1a420 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  LL.  The meaning
1a430 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75   of.** this valu
1a440 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  e is as follows:
1a450 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1a460 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
1a470 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1a480 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1a490 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1a4a0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
1a4b0 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72  ler than pKey or
1a4c0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1a4d0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
1a4e0 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
1a4f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
1a500 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
1a510 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
1a520 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
1a530 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1a540 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1a550 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1a560 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1a570 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
1a580 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a  tches pKey..**.*
1a590 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
1a5a0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1a5b0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1a5c0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1a5d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1a5e0 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
1a5f0 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  an pKey..*/.int 
1a600 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1a610 74 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  to(BtCursor *pCu
1a620 72 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  r, const void *p
1a630 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 69  Key, i64 nKey, i
1a640 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1a650 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
1a660 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1a670 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a680 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rc;.  assert( pC
1a690 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
1a6a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1a6b0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1a6c0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1a6d0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1a6e0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1a6f0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1a700 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1a710 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1a720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a730 20 7d 0a 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   }.   for(;;){. 
1a740 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1a750 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1a760 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1a770 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1a780 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1a790 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1a7a0 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1a7b0 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1a7c0 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1a7d0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1a7e0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1a7f0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1a800 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  y && pKey==0 ){.
1a810 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1a820 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1a830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
1a840 49 6e 74 65 67 72 69 74 79 28 70 50 61 67 65 29  Integrity(pPage)
1a850 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6c 77 72  ;.    while( lwr
1a860 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 20 20 76  <=upr ){.      v
1a870 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
1a880 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
1a890 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  y;.      pCur->i
1a8a0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
1a8b0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1a8c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1a8d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a8e0 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
1a8f0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1a900 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1a910 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  y ){.        if(
1a920 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29   nCellKey<nKey )
1a930 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1a940 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1a950 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e  e if( nCellKey>n
1a960 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1a970 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
1a980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a990 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
1a9a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1a9b0 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69          int avai
1a9c0 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70  lable;.        p
1a9d0 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20  CellKey = (void 
1a9e0 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1a9f0 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c  Cur, &available,
1aa00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1aa10 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c   available>=nCel
1aa20 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  lKey ){.        
1aa30 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d    c = pCur->xCom
1aa40 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c  pare(pCur->pArg,
1aa50 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c   nCellKey, pCell
1aa60 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29  Key, nKey, pKey)
1aa70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1aa80 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1aa90 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
1aaa0 6f 63 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20  ocRaw( nCellKey 
1aab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1aac0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72   pCellKey==0 ) r
1aad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1aae0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  EM;.          rc
1aaf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1ab00 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ey(pCur, 0, nCel
1ab10 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43  lKey, (void *)pC
1ab20 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1ab30 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f     c = pCur->xCo
1ab40 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67  mpare(pCur->pArg
1ab50 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  , nCellKey, pCel
1ab60 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
1ab70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1ab80 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79  iteFree(pCellKey
1ab90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1aba0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1abb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1abc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
1abd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1abe0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1abf0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
1ac00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
1ac10 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20  r = pCur->idx;. 
1ac20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c           upr = l
1ac30 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  wr - 1;.        
1ac40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1ac50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ac60 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1ac70 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
1ac80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ac90 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
1aca0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1acb0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
1acc0 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31  wr = pCur->idx+1
1acd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ace0 20 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75         upr = pCu
1acf0 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20  r->idx-1;.      
1ad00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1ad10 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
1ad20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ad30 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1ad40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1ad50 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
1ad60 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
1ad70 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
1ad80 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
1ad90 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1ada0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1adb0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1adc0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
1add0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1ade0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1adf0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
1ae00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
1ae10 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
1ae20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ae30 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
1ae40 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
1ae50 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
1ae60 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1ae70 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 65 74 75   = c;.      retu
1ae80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ae90 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1aea0 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75  x = lwr;.    pCu
1aeb0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1aec0 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
1aed0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
1aee0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
1aef0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
1af00 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1af10 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44    /* NOT REACHED
1af20 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   */.}../*.** Ret
1af30 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1af40 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1af50 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1af60 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
1af70 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
1af80 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
1af90 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
1afa0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
1afb0 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
1afc0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1afd0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
1afe0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
1aff0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
1b000 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
1b010 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
1b020 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
1b030 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1b040 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b050 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
1b060 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
1b070 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
1b080 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
1b090 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
1b0a0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
1b0b0 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
1b0c0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
1b0d0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
1b0e0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
1b0f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
1b100 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
1b110 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
1b120 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
1b130 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
1b140 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
1b150 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
1b160 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
1b170 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
1b180 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1b190 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1b1a0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1b1b0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1b1c0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1b1d0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1b1e0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1b1f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b200 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1b210 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1b220 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1b230 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1b240 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
1b250 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1b260 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1b270 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
1b280 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b290 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
1b2a0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1b2b0 43 41 43 48 45 0a 20 20 72 63 20 3d 20 72 65 73  CACHE.  rc = res
1b2c0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1b2d0 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
1b2e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b2f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1b300 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
1b310 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20  r->skip>0 ){.   
1b320 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1b330 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1b340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b350 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1b360 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64  ->skip = 0;.#end
1b370 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52  if..  assert( pR
1b380 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
1b390 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1b3a0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1b3b0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1b3c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b3d0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1b3e0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1b3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b400 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
1b410 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
1b420 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69  idx++;.  pCur->i
1b430 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1b440 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d   if( pCur->idx>=
1b450 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1b460 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1b470 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1b480 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1b490 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
1b4a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1b4b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1b4c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1b4d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b4e0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1b4f0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1b500 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1b510 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b520 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
1b530 20 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61      if( isRootPa
1b540 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1b550 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1b560 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1b570 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1b580 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
1b590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b5a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1b5b0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1b5c0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1b5d0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1b5e0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
1b5f0 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1b600 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
1b610 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1b620 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  e->leafData ){. 
1b630 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b640 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
1b650 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
1b660 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1b670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b680 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b690 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1b6a0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1b6b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b6c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1b6d0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1b6e0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
1b6f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b700 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
1b710 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
1b720 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
1b730 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1b740 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1b750 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1b760 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1b770 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1b780 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1b790 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1b7a0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1b7b0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1b7c0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1b7d0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1b7e0 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
1b7f0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1b800 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
1b810 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1b820 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
1b830 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20  pgno;.  MemPage 
1b840 2a 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64 65 66  *pPage;..#ifndef
1b850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b860 52 45 44 5f 43 41 43 48 45 0a 20 20 72 63 20 3d  RED_CACHE.  rc =
1b870 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1b880 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b  sition(pCur, 1);
1b890 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1b8a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1b8b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
1b8c0 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
1b8d0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1b8e0 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1b8f0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1b900 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1b910 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1b920 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 43 55  #endif..  if( CU
1b930 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1b940 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1b950 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b970 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20  K;.  }..  pPage 
1b980 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1b990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1b9a0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
1b9b0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
1b9c0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
1b9d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1b9e0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20 66  no = get4byte( f
1b9f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1ba00 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20  Cur->idx) );.   
1ba10 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1ba20 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
1ba30 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1ba40 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1ba50 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1ba60 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
1ba70 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
1ba80 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >idx==0 ){.     
1ba90 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28   if( isRootPage(
1baa0 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  pPage) ){.      
1bab0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1bac0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1bad0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
1bae0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1baf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1bb00 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
1bb10 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
1bb20 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
1bb30 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
1bb40 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d  .    pCur->idx--
1bb50 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1bb60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1bb70 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1bb80 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  ata && !pPage->l
1bb90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1bba0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
1bbb0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
1bbc0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1bbd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bbe0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
1bbf0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
1bc00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bc10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1bc20 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
1bc30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1bc40 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
1bc50 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
1bc60 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
1bc70 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 70 61  words, sqlite3pa
1bc80 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20 68  ger_write().** h
1bc90 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1bca0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
1bcb0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
1bcc0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
1bcd0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
1bce0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
1bcf0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
1bd00 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1bd10 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
1bd20 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 6f 6e  pager_unref() on
1bd30 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
1bd40 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
1bd50 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1bd60 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1bd70 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
1bd80 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
1bd90 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
1bda0 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
1bdb0 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
1bdc0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
1bdd0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
1bde0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
1bdf0 6b 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ke sqlite3pager_
1be00 75 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  unref() on *ppPa
1be10 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
1be20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1be30 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
1be40 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1be50 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
1be60 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
1be70 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
1be80 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
1be90 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
1bea0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
1beb0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
1bec0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
1bed0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
1bee0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
1bef0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
1bf00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
1bf10 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
1bf20 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
1bf30 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
1bf40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
1bf50 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
1bf60 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
1bf70 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
1bf80 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
1bf90 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1bfa0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
1bfb0 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
1bfc0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
1bfd0 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
1bfe0 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
1bff0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
1c000 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
1c010 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
1c020 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1c030 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
1c040 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
1c050 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
1c060 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
1c070 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
1c080 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
1c090 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1c0a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1c0b0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
1c0c0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1c0d0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
1c0e0 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
1c0f0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
1c100 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
1c110 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 0a 20  e freelist */.. 
1c120 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
1c130 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74  Page1;.  n = get
1c140 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1c150 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28  Data[36]);.  if(
1c160 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
1c170 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
1c180 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
1c190 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
1c1a0 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
1c1b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1c1c0 6b 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20  k = 0;.    Pgno 
1c1d0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 4d 65 6d 50  iTrunk;.    MemP
1c1e0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
1c1f0 3d 20 30 3b 0a 20 20 20 20 75 38 20 73 65 61 72  = 0;.    u8 sear
1c200 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
1c210 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
1c220 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
1c230 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
1c240 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
1c250 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
1c260 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
1c270 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
1c280 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
1c290 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
1c2a0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
1c2b0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
1c2c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
1c2d0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
1c2e0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
1c2f0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
1c300 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
1c310 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1c320 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1c330 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
1c340 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
1c350 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
1c360 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
1c370 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1c380 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
1c390 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1c3a0 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
1c3b0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
1c3c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1c3d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
1c3e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1c3f0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1c400 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1c410 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1c420 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
1c430 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1c440 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
1c450 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
1c460 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
1c470 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
1c480 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
1c490 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
1c4a0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
1c4b0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
1c4c0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
1c4d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1c4e0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1c4f0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  1->aData);.    i
1c500 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1c510 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1c520 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1c530 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1c540 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1c550 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1c560 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1c570 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1c580 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1c590 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1c5a0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1c5b0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1c5c0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1c5d0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1c5e0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1c5f0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1c600 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1c610 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1c620 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1c630 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1c640 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1c650 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1c660 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1c670 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1c680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c690 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1c6a0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1c6b0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1c6c0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
1c6d0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
1c6e0 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69  pTrunk);.      i
1c6f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1c700 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1c710 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
1c720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c730 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
1c740 4f 44 4f 3a 20 54 68 69 73 20 73 68 6f 75 6c 64  ODO: This should
1c750 20 6d 6f 76 65 20 74 6f 20 61 66 74 65 72 20 74   move to after t
1c760 68 65 20 6c 6f 6f 70 3f 20 2a 2f 0a 20 20 20 20  he loop? */.    
1c770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1c780 67 65 72 5f 77 72 69 74 65 28 70 54 72 75 6e 6b  ger_write(pTrunk
1c790 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
1c7a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1c7b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1c7c0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  runk);.        r
1c7d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
1c7e0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1c7f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c800 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
1c810 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1c820 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
1c830 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
1c840 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
1c850 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1c860 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
1c870 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
1c880 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
1c890 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
1c8a0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
1c8b0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
1c8c0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
1c8d0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
1c8e0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
1c8f0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
1c900 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
1c910 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  ==0 );.        *
1c920 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
1c930 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1c940 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1c950 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1c960 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1c970 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1c980 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
1c990 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1c9a0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1c9b0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1c9c0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1c9d0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1c9e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1c9f0 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
1ca00 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
1ca10 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1ca20 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
1ca30 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
1ca40 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1ca50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ca60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ca70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ca80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ca90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1caa0 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
1cab0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
1cac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1cad0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
1cae0 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
1caf0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
1cb00 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1cb10 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
1cb20 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1cb30 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
1cb40 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1cb50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1cb60 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
1cb70 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1cb80 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1cb90 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1cba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  ;.        if( k=
1cbb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1cbc0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1cbd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1cbe0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1cbf0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1cc00 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1cc10 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1cc20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1cc30 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
1cc40 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1cc50 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1cc60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1cc70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1cc80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1cc90 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
1cca0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
1ccb0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
1ccc0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
1ccd0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
1cce0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
1ccf0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
1cd00 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
1cd10 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
1cd20 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1cd30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1cd40 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1cd50 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
1cd60 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
1cd70 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1cd80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
1cd90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1cda0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e   getPage(pBt, iN
1cdb0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
1cdc0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1cdd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cde0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1cdf0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1ce00 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1ce10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ce20 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
1ce30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ce40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ce50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ce60 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1ce70 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1ce80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ce90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1ceb0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1cec0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1ced0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1cee0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1cef0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1cf00 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
1cf10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1cf20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
1cf30 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1cf40 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1cf50 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
1cf60 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1cf70 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1cf80 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1cf90 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1cfa0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
1cfb0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
1cfc0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1cfd0 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
1cfe0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1cff0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1d000 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1d010 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1d020 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
1d030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1d040 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1d050 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1d060 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1d070 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1d080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d090 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1d0a0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1d0b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
1d0c0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1d0d0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1d0e0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1d0f0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1d100 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1d110 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1d120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1d130 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
1d140 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
1d150 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
1d160 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
1d170 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
1d180 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
1d190 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
1d1a0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
1d1b0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
1d1c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1d1d0 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
1d1e0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1d1f0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1d200 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1d210 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
1d220 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
1d230 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
1d240 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
1d250 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
1d260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1d270 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
1d280 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
1d290 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1d2a0 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
1d2b0 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
1d2c0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
1d2d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1d2e0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1d300 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
1d310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d320 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1d330 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
1d340 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1d350 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
1d360 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
1d370 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1d380 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1d390 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
1d3a0 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
1d3b0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
1d3c0 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
1d3d0 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71     if( *pPgno>sq
1d3e0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
1d3f0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1d400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1d410 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66   /* Free page of
1d420 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
1d430 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
1d440 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d450 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d460 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d470 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1d480 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
1d490 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
1d4a0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
1d4c0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
1d4d0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1d4e0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
1d4f0 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
1d500 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
1d510 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d520 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
1d530 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1d540 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
1d550 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
1d560 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
1d570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d580 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
1d590 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1d5a0 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
1d5b0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
1d5c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d5e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d5f0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64    sqlite3pager_d
1d600 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 28 2a 70  ont_rollback((*p
1d610 70 50 61 67 65 29 2d 3e 61 44 61 74 61 29 3b 0a  pPage)->aData);.
1d620 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d630 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1d640 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 61  ite((*ppPage)->a
1d650 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
1d660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d680 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d690 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1d6a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d6c0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1d6d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d6e0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
1d6f0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1d700 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
1d710 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 20 20 72  rchList );.    r
1d720 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1d730 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k);.  }else{.   
1d740 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
1d750 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1d760 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74  eelist, so creat
1d770 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20  e a new page at 
1d780 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
1d790 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
1d7a0 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74    *pPgno = sqlit
1d7b0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
1d7c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 2b  t(pBt->pPager) +
1d7d0 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   1;..#ifndef SQL
1d7e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d7f0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1d800 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
1d810 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d820 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 2a 70  ->usableSize, *p
1d830 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
1d840 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
1d850 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
1d860 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
1d870 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
1d880 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
1d890 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1d8a0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
1d8b0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
1d8c0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
1d8d0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
1d8e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1d8f0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
1d900 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
1d910 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
1d920 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1d930 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
1d940 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
1d950 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
1d960 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20   *pPgno));.     
1d970 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1d980 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d990 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
1d9a0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
1d9b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
1d9c0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1d9d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1d9e0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
1d9f0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 2a  = getPage(pBt, *
1da00 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a  pPgno, ppPage);.
1da10 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1da20 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1da30 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1da40 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 61  ite((*ppPage)->a
1da50 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72  Data);.    if( r
1da60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1da70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1da80 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1da90 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
1daa0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1dab0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
1dac0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
1dad0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1dae0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1daf0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 72 65 74  GE(pBt) );.  ret
1db00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1db10 20 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74   Add a page of t
1db20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1db30 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1db40 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 70  ..**.** sqlite3p
1db50 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20  ager_unref() is 
1db60 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70  NOT called for p
1db70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
1db80 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d  int freePage(Mem
1db90 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1dba0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1dbb0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65  pPage->pBt;.  Me
1dbc0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1dbd0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69  pBt->pPage1;.  i
1dbe0 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20  nt rc, n, k;..  
1dbf0 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70  /* Prepare the p
1dc00 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  age for freeing 
1dc10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1dc20 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20  ge->pgno>1 );.  
1dc30 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1dc40 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
1dc50 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29  (pPage->pParent)
1dc60 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ;.  pPage->pPare
1dc70 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  nt = 0;..  /* In
1dc80 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1dc90 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
1dca0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
1dcb0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1dcc0 74 65 28 70 50 61 67 65 31 2d 3e 61 44 61 74 61  te(pPage1->aData
1dcd0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1dce0 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67  turn rc;.  n = g
1dcf0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1dd00 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
1dd10 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1dd20 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29  >aData[36], n+1)
1dd30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1dd40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1dd50 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  M.  /* If the da
1dd60 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1dd70 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
1dd80 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
1dd90 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1dda0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1ddb0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
1ddc0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
1ddd0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1dde0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
1ddf0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
1de00 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
1de10 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
1de20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1de30 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1de40 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  f..  if( n==0 ){
1de50 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1de60 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1de70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  age */.    rc = 
1de80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1de90 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1dea0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1deb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65  eturn rc;.    me
1dec0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
1ded0 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75  a, 0, 8);.    pu
1dee0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1def0 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
1df00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41  ->pgno);.    TRA
1df10 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1df20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61  %d first\n", pPa
1df30 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
1df40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65  lse{.    /* Othe
1df50 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72  r free pages alr
1df60 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74  eady exist.  Ret
1df70 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74  rive the first t
1df80 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a  runk page.    **
1df90 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1dfa0 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f   and find out ho
1dfb0 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74  w many leaves it
1dfc0 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d   has. */.    Mem
1dfd0 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20  Page *pTrunk;.  
1dfe0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1dff0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
1e000 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
1e010 2c 20 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20  , &pTrunk);.    
1e020 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e030 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34  rc;.    k = get4
1e040 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1e050 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
1e060 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53   k>=pBt->usableS
1e070 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1e080 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1e090 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74  is full.  Turn t
1e0a0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
1e0b0 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20  eed into a new. 
1e0c0 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61       ** trunk pa
1e0d0 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65  ge with no leave
1e0e0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  s. */.      rc =
1e0f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1e100 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ite(pPage->aData
1e110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e120 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e130 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1e140 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b  e->aData, pTrunk
1e150 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  ->pgno);.      p
1e160 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1e170 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
1e180 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1e190 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1e1a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1e1b0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
1e1c0 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
1e1d0 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
1e1e0 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ing %d\n",.     
1e1f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
1e200 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
1e210 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
1e220 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  .      /* Add th
1e230 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61  e newly freed pa
1e240 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20  ge as a leaf on 
1e250 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e  the current trun
1e260 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
1e270 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1e280 74 65 28 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  te(pTrunk->aData
1e290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e2a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e2b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
1e2c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
1e2d0 2b 31 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  +1);.      put4b
1e2e0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1e2f0 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65  ta[8+k*4], pPage
1e300 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 73  ->pgno);.      s
1e310 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1e320 5f 77 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  _write(pBt->pPag
1e330 65 72 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  er, pPage->pgno)
1e340 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
1e350 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
1e360 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
1e370 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
1e380 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
1e390 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
1e3a0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
1e3b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e3c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
1e3d0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
1e3e0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
1e3f0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
1e400 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1e410 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
1e420 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
1e430 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
1e440 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1e450 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1e460 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
1e470 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
1e480 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  o;.  int rc;..  
1e490 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
1e4a0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1e4b0 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
1e4c0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
1e4d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e4e0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
1e4f0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
1e500 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
1e510 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
1e520 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
1e530 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
1e540 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
1e550 20 77 68 69 6c 65 28 20 6f 76 66 6c 50 67 6e 6f   while( ovflPgno
1e560 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
1e570 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69  ge *pOvfl;.    i
1e580 66 28 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69  f( ovflPgno>sqli
1e590 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
1e5a0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1e5b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e5c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e5d0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  KPT;.    }.    r
1e5e0 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
1e5f0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
1e600 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
1e610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e620 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
1e630 79 74 65 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61  yte(pOvfl->aData
1e640 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  );.    rc = free
1e650 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
1e660 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1e670 72 65 66 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61  ref(pOvfl->aData
1e680 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e690 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1e6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e6b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
1e6c0 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
1e6d0 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
1e6e0 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
1e6f0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
1e700 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
1e710 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
1e720 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
1e730 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
1e740 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
1e750 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
1e760 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
1e770 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
1e780 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1e790 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
1e7a0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1e7b0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1e7c0 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
1e7d0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
1e7e0 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
1e7f0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
1e800 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
1e810 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
1e820 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
1e830 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
1e840 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
1e850 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
1e860 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
1e870 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
1e880 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
1e890 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
1e8a0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
1e8b0 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
1e8c0 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
1e8d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1e8e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e8f0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
1e900 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
1e910 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
1e920 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
1e930 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
1e940 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
1e950 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
1e960 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
1e970 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
1e980 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
1e990 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
1e9a0 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
1e9b0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
1e9c0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
1e9d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1e9e0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
1e9f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
1ea00 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
1ea10 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
1ea20 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
1ea30 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
1ea40 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
1ea50 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
1ea60 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
1ea70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
1ea80 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
1ea90 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
1eaa0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1eab0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1eac0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
1ead0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
1eae0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
1eaf0 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  fo;..  /* Fill i
1eb00 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
1eb10 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
1eb20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1eb30 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
1eb40 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
1eb50 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1eb60 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
1eb70 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
1eb80 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
1eb90 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ata);.  }else{. 
1eba0 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
1ebb0 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
1ebc0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
1ebd0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
1ebe0 29 26 6e 4b 65 79 29 3b 0a 20 20 70 61 72 73 65  )&nKey);.  parse
1ebf0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
1ec00 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1ec10 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
1ec20 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
1ec30 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
1ec40 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
1ec50 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
1ec60 74 61 3d 3d 6e 44 61 74 61 20 29 3b 0a 20 20 0a  ta==nData );.  .
1ec70 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1ec80 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
1ec90 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a  ayload = nData;.
1eca0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1ecb0 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
1ecc0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
1ecd0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
1ece0 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
1ecf0 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  e{.    nPayload 
1ed00 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  += nKey;.    pSr
1ed10 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
1ed20 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20  rc = nKey;.  }. 
1ed30 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
1ed40 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65  nSize;.  spaceLe
1ed50 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ft = info.nLocal
1ed60 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  ;.  pPayload = &
1ed70 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
1ed80 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
1ed90 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
1eda0 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61  ];..  while( nPa
1edb0 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
1edc0 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
1edd0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1ede0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1edf0 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
1ee00 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
1ee10 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
1ee20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
1ee30 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 23   entry page */.#
1ee40 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1ee50 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
1ee60 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
1ee70 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
1ee80 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
1ee90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1eea0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
1eeb0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
1eec0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
1eed0 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
1eee0 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
1eef0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
1ef00 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
1ef10 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
1ef20 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
1ef30 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
1ef40 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
1ef50 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72 79 20   now. The entry 
1ef60 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6f 76  for the first ov
1ef70 65 72 66 6c 6f 77 20 70 61 67 65 20 77 69 6c 6c  erflow page will
1ef80 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 64 64   be.      ** add
1ef90 65 64 20 6c 61 74 65 72 2c 20 62 79 20 74 68 65  ed later, by the
1efa0 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 72 6f   insertCell() ro
1efb0 75 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  utine..      */.
1efc0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
1efd0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 70 67 6e  utoVacuum && pgn
1efe0 6f 50 74 72 6d 61 70 21 3d 30 20 26 26 20 72 63  oPtrmap!=0 && rc
1eff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f000 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
1f010 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
1f020 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1f030 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72 6d 61  FLOW2, pgnoPtrma
1f040 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  p);.      }.#end
1f050 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
1f060 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
1f070 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
1f080 65 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  e);.        /* c
1f090 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
1f0a0 70 43 65 6c 6c 29 3b 20 2a 2f 0a 20 20 20 20 20  pCell); */.     
1f0b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1f0d0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
1f0e0 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
1f0f0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
1f100 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
1f110 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
1f120 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
1f130 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
1f140 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
1f150 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
1f160 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
1f170 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
1f180 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
1f190 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1f1a0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
1f1b0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
1f1c0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
1f1d0 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
1f1e0 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
1f1f0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 6d   n = nSrc;.    m
1f200 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1f210 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 6e 50  pSrc, n);.    nP
1f220 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
1f230 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
1f240 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
1f250 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
1f260 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
1f270 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
1f280 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
1f290 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
1f2a0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
1f2b0 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
1f2c0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
1f2d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f2e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1f2f0 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67  hange the MemPag
1f300 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e.pParent pointe
1f310 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68  r on the page wh
1f320 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ose number is.**
1f330 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
1f340 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f  cond argument so
1f350 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50   that MemPage.pP
1f360 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a  arent holds the.
1f370 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
1f380 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
1f390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f3a0 72 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53  reparentPage(BtS
1f3b0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1f3c0 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a   pgno, MemPage *
1f3d0 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20  pNewParent, int 
1f3e0 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  idx){.  MemPage 
1f3f0 2a 70 54 68 69 73 3b 0a 20 20 75 6e 73 69 67 6e  *pThis;.  unsign
1f400 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
1f410 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
1f420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f430 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  K;.  assert( pBt
1f440 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
1f450 20 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33   aData = sqlite3
1f460 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 42 74  pager_lookup(pBt
1f470 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
1f480 0a 20 20 69 66 28 20 61 44 61 74 61 20 29 7b 0a  .  if( aData ){.
1f490 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d      pThis = (Mem
1f4a0 50 61 67 65 2a 29 26 61 44 61 74 61 5b 70 42 74  Page*)&aData[pBt
1f4b0 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20  ->pageSize];.   
1f4c0 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e   assert( pThis->
1f4d0 61 44 61 74 61 3d 3d 61 44 61 74 61 20 29 3b 0a  aData==aData );.
1f4e0 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69      if( pThis->i
1f4f0 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69  sInit ){.      i
1f500 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
1f510 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b  t!=pNewParent ){
1f520 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 68  .        if( pTh
1f530 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71  is->pParent ) sq
1f540 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1f550 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d  (pThis->pParent-
1f560 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
1f570 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
1f580 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = pNewParent;.  
1f590 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 50 61        if( pNewPa
1f5a0 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33 70 61  rent ) sqlite3pa
1f5b0 67 65 72 5f 72 65 66 28 70 4e 65 77 50 61 72 65  ger_ref(pNewPare
1f5c0 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
1f5d0 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d    }.      pThis-
1f5e0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78  >idxParent = idx
1f5f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f600 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 61  te3pager_unref(a
1f610 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  Data);.  }..#ifn
1f620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f630 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
1f640 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1f650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1f660 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
1f670 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1f680 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67  , pNewParent->pg
1f690 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  no);.  }.#endif.
1f6a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f6b0 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  OK;.}..../*.** C
1f6c0 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e  hange the pParen
1f6d0 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c  t pointer of all
1f6e0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
1f6f0 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b  ge to point back
1f700 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a  .** to pPage..**
1f710 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1f720 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68  ds, for every ch
1f730 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e  ild of pPage, in
1f740 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67  voke reparentPag
1f750 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73  e().** to make s
1f760 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68  ure that each ch
1f770 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70  ild knows that p
1f780 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65  Page is its pare
1f790 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
1f7a0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1f7b0 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d  ed after you mem
1f7c0 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69  cpy() one page i
1f7d0 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a  nto.** another..
1f7e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1f7f0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
1f800 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1f810 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53  {.  int i;.  BtS
1f820 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1f830 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72  ge->pBt;.  int r
1f840 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1f850 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1f860 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f ) return SQLIT
1f870 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  E_OK;..  for(i=0
1f880 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
1f890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
1f8a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1f8b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
1f8c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1f8d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1f8e0 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
1f8f0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1f900 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  , pPage, i);.   
1f910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f920 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1f930 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1f940 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1f950 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  {.    rc = repar
1f960 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
1f970 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1f980 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1f990 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20  fset+8]), .     
1f9a0 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20    pPage, i);.   
1f9b0 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
1f9c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1f9d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f9e0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
1f9f0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
1fa00 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
1fa10 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
1fa20 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
1fa30 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
1fa40 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
1fa50 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
1fa60 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1fa70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
1fa80 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
1fa90 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
1faa0 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
1fab0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
1fac0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
1fad0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
1fae0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
1faf0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
1fb00 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
1fb10 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
1fb20 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
1fb30 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
1fb40 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
1fb50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1fb60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1fb70 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
1fb80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
1fb90 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
1fba0 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
1fbb0 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
1fbc0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
1fbd0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
1fbe0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
1fbf0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
1fc00 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
1fc10 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
1fc20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
1fc30 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
1fc40 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1fc50 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
1fc60 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
1fc70 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
1fc80 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
1fc90 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
1fca0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
1fcb0 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
1fcc0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
1fcd0 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
1fce0 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
1fcf0 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28  (ptr);.  assert(
1fd00 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c   pc>10 && pc+sz<
1fd10 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
1fd20 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65  bleSize );.  fre
1fd30 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
1fd40 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69  , sz);.  for(i=i
1fd50 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
1fd60 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
1fd70 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
1fd80 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
1fd90 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
1fda0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
1fdb0 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
1fdc0 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
1fdd0 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
1fde0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
1fdf0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
1fe00 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
1fe10 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 1;.}../*.** In
1fe20 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
1fe30 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
1fe40 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
1fe50 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
1fe60 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
1fe70 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
1fe80 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
1fe90 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
1fea0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
1feb0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
1fec0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
1fed0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
1fee0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
1fef0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
1ff00 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
1ff10 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
1ff20 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
1ff30 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
1ff40 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
1ff50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
1ff60 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
1ff70 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
1ff80 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
1ff90 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
1ffa0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
1ffb0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
1ffc0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
1ffd0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
1ffe0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
1fff0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
20000 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
20010 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
20020 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
20030 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
20040 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
20050 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
20060 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
20070 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
20080 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
20090 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
200a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
200b0 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
200c0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
200d0 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
200e0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
200f0 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
20100 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
20110 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
20120 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
20130 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
20140 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
20150 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
20160 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
20170 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
20180 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
20190 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
201a0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
201b0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
201c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
201d0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
201e0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
201f0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
20200 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
20210 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
20220 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
20230 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
20240 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
20250 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
20260 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
20270 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20  u8 nSkip        
20280 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74    /* Do not writ
20290 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
202a0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  p bytes of the c
202b0 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ell */.){.  int 
202c0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
202d0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
202e0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
202f0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
20300 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
20310 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20320 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  r */.  int top; 
20330 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
20340 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e  t byte of conten
20350 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69  t for any cell i
20360 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
20370 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
20380 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
20390 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
203a0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
203b0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
203c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
203d0 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
203e0 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
203f0 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
20400 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
20410 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
20420 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20   into data[] of 
20430 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
20440 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
20450 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
20460 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
20470 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
20480 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
20490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
204a0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
204b0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
204c0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
204d0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
204e0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
204f0 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
20500 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
20510 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
20520 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
20530 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
20540 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
20550 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
20560 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
20570 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77  sqlite3pager_isw
20580 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
20590 61 44 61 74 61 29 20 29 3b 0a 20 20 69 66 28 20  aData) );.  if( 
205a0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
205b0 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
205c0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
205d0 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
205e0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
205f0 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
20600 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
20610 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
20620 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
20630 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
20640 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
20650 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
20660 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
20670 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
20680 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
20690 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
206a0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
206b0 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
206c0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
206d0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
206e0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
206f0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
20700 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
20710 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
20720 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
20730 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
20740 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
20750 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
20760 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
20770 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
20780 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
20790 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
207a0 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
207b0 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
207c0 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72 61    int rc = defra
207d0 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
207e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
207f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
20800 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70  rn rc;.      top
20810 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
20820 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
20830 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
20840 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
20850 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
20860 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
20870 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
20880 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
20890 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
208a0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
208b0 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  +5]) );.    pPag
208c0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
208d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
208e0 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
208f0 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
20900 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
20910 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
20920 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
20930 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
20940 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
20950 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
20960 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
20970 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
20980 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
20990 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
209a0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
209b0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
209c0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
209d0 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
209e0 3d 20 31 3b 0a 20 20 20 20 70 61 67 65 49 6e 74  = 1;.    pageInt
209f0 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 23  egrity(pPage);.#
20a00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20a10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20a20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
20a30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
20a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
20a50 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
20a60 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
20a70 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
20a80 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
20a90 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
20aa0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
20ab0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
20ac0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
20ad0 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
20ae0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 70 61 72   info;.      par
20af0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
20b00 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
20b10 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e        if( (info.
20b20 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
20b30 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
20b40 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
20b50 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70  {.        Pgno p
20b60 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
20b70 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
20b80 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
20b90 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72      int rc = ptr
20ba0 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
20bb0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
20bc0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
20bd0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
20be0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20bf0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
20c00 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
20c10 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
20c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
20c40 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
20c50 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
20c60 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
20c70 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
20c80 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
20c90 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
20ca0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
20cb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
20cc0 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
20cd0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
20ce0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
20cf0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
20d00 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
20d10 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
20d20 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
20d30 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
20d40 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
20d50 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
20d60 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
20d70 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65   */.  int *aSize
20d80 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
20d90 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
20da0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
20db0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20dc0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
20dd0 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f   totalSize;    /
20de0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
20df0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69  all cells */.  i
20e00 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
20e10 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67   /* Index of pag
20e20 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
20e30 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20  t cellptr;      
20e40 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
20e50 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
20e60 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
20e70 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
20e80 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
20e90 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ody */.  u8 *dat
20ea0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  a;         /* Da
20eb0 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ta for the page 
20ec0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
20ed0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
20ee0 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  0 );.  totalSize
20ef0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
20f00 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
20f10 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
20f20 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
20f30 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
20f40 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
20f50 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
20f60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
20f70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70  ll==0 );.  cellp
20f80 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  tr = pPage->cell
20f90 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
20fa0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
20fb0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
20fc0 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62  rOffset;.  put2b
20fd0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
20fe0 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , nCell);.  if( 
20ff0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c  nCell ){.    cel
21000 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
21010 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
21020 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  alSize);.    ass
21030 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20  ert( cellbody>0 
21040 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21050 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32  Page->nFree >= 2
21060 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  *nCell );.    pP
21070 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a  age->nFree -= 2*
21080 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69  nCell;.    for(i
21090 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
210a0 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  ){.      put2byt
210b0 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d  e(&data[cellptr]
210c0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
210d0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
210e0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
210f0 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
21100 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b  .      cellptr +
21110 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62  = 2;.      cellb
21120 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
21130 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21140 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61  t( cellbody==pPa
21150 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
21160 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ize );.  }.  pPa
21170 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  ge->nCell = nCel
21180 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
21190 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
211a0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
211b0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
211c0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
211d0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
211e0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
211f0 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
21200 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
21210 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
21220 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
21230 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
21240 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
21250 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
21260 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
21270 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
21280 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
21290 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
212a0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
212b0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
212c0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
212d0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
212e0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
212f0 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
21300 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
21310 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
21320 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
21330 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
21340 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
21350 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
21360 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
21370 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
21380 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
21390 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
213a0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
213b0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
213c0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
213d0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
213e0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
213f0 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
21400 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21410 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
21420 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
21430 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
21440 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
21450 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
21460 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
21470 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  lance */../* For
21480 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
21490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
214a0 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69  ance(MemPage*, i
214b0 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
214c0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
214d0 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
214e0 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
214f0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
21500 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
21510 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
21520 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
21530 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
21540 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
21550 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
21560 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
21570 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
21580 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
21590 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
215a0 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
215b0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
215c0 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
215d0 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
215e0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
215f0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
21600 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
21610 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
21620 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
21630 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
21640 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
21650 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
21660 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
21670 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
21680 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
21690 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
216a0 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
216b0 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
216c0 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
216d0 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
216e0 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
216f0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
21700 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
21710 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
21720 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
21730 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
21740 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
21750 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
21760 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
21770 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
21780 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
21790 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
217a0 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
217b0 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
217c0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
217d0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
217e0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
217f0 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
21800 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
21810 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
21820 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
21830 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  pNew;.  Pgno pgn
21840 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c  oNew;.  u8 *pCel
21850 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b  l;.  int szCell;
21860 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
21870 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
21880 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
21890 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20    int parentIdx 
218a0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
218b0 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e  ;   /* pParent n
218c0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
218d0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70  index */.  int p
218e0 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  arentSize;      
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21900 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69  Size of new divi
21910 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  der cell */.  u8
21920 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b   parentCell[64];
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65  /* Space for the
21950 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
21960 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  l */..  /* Alloc
21970 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
21980 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
21990 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
219a0 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
219b0 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
219c0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
219d0 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
219e0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
219f0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
21a00 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
21a10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
21a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
21a30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
21a40 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
21a50 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73  fl[0].pCell;.  s
21a60 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
21a70 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
21a80 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  );.  zeroPage(pN
21a90 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
21aa0 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65  [0]);.  assemble
21ab0 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
21ac0 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
21ad0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
21ae0 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  ow = 0;..  /* Se
21af0 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  t the parent of 
21b00 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
21b10 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72  ted page to pPar
21b20 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  ent. */.  pNew->
21b30 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
21b40 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t;.  sqlite3page
21b50 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61  r_ref(pParent->a
21b60 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  Data);..  /* pPa
21b70 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
21b80 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
21b90 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
21ba0 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20  ge this.  ** so 
21bb0 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63  that the right-c
21bc0 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20  hild is the new 
21bd0 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  page allocated a
21be0 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50  bove and.  ** pP
21bf0 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
21c00 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
21c10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21c20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
21c30 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  ;.  parseCellPtr
21c40 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
21c50 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
21c60 43 65 6c 6c 2d 31 29 2c 20 26 69 6e 66 6f 29 3b  Cell-1), &info);
21c70 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
21c80 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
21c90 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e  ntCell, 0, info.
21ca0 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 70 61 72  nKey, 0, 0, &par
21cb0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  entSize);.  if( 
21cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21ce0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61    }.  assert( pa
21cf0 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
21d00 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
21d10 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
21d20 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  Idx, parentCell,
21d30 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20   parentSize, 0, 
21d40 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
21d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21d60 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21d70 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
21d80 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
21d90 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
21da0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75  age->pgno);.  pu
21db0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
21dc0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
21dd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
21de0 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66  noNew);..#ifndef
21df0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21e00 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
21e10 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
21e20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
21e30 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
21e40 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74  ter map.  ** wit
21e50 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
21e60 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
21e70 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
21e80 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20   the .  ** cell 
21e90 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
21ea0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
21eb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
21ec0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
21ed0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
21ee0 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
21ef0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
21f00 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
21f10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
21f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
21f40 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
21f50 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
21f60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
21f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21f90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
21fa0 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
21fb0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
21fc0 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63   page and balanc
21fd0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
21fe0 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  e,.  ** in case 
21ff0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
22000 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64   inserted caused
22010 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76   it to become ov
22020 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72  erfull..  */.  r
22030 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
22040 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e  ;.  return balan
22050 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  ce(pParent, 0);.
22060 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22070 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
22080 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ANCE */../*.** T
22090 68 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  he ISAUTOVACUUM 
220a0 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77 69  macro is used wi
220b0 74 68 69 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  thin balance_non
220c0 72 6f 6f 74 28 29 20 74 6f 20 64 65 74 65 72 6d  root() to determ
220d0 69 6e 65 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  ine.** if the da
220e0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
220f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e  auto-vacuum or n
22100 6f 74 2e 20 42 65 63 61 75 73 65 20 69 74 20 69  ot. Because it i
22110 73 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e  s used.** within
22120 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
22130 68 61 74 20 69 73 20 61 6e 20 61 72 67 75 6d 65  hat is an argume
22140 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61  nt to another ma
22150 63 72 6f 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d  cro .** (sqliteM
22160 61 6c 6c 6f 63 52 61 77 29 2c 20 69 74 20 69 73  allocRaw), it is
22170 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
22180 20 75 73 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   use conditional
22190 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a   compilation..**
221a0 20 53 6f 2c 20 74 68 69 73 20 6d 61 63 72 6f 20   So, this macro 
221b0 69 73 20 64 65 66 69 6e 65 64 20 69 6e 73 74 65  is defined inste
221c0 61 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ad..*/.#ifndef S
221d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
221e0 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20 49 53  ACUUM.#define IS
221f0 41 55 54 4f 56 41 43 55 55 4d 20 28 70 42 74 2d  AUTOVACUUM (pBt-
22200 3e 61 75 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c  >autoVacuum).#el
22210 73 65 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54  se.#define ISAUT
22220 4f 56 41 43 55 55 4d 20 30 0a 23 65 6e 64 69 66  OVACUUM 0.#endif
22230 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
22240 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
22250 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  es Cells on pPag
22260 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32  e and up to NN*2
22270 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20   siblings.** of 
22280 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c  pPage so that al
22290 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
222a0 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75  ut the same amou
222b0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
222c0 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20  ..** Usually NN 
222d0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
222e0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
222f0 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
22300 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68  balancing,.** th
22310 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e  ough more siblin
22320 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
22330 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70  om one side if p
22340 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  Page is the firs
22350 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69  t.** or last chi
22360 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
22370 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20  .  If pPage has 
22380 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20  fewer than 2*NN 
22390 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d  siblings.** (som
223a0 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
223b0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
223c0 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f  pPage is the roo
223d0 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20  t page or a .** 
223e0 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74  child of root) t
223f0 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
22400 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69  e siblings parti
22410 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
22420 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
22430 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
22440 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d  lings of pPage m
22450 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
22460 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
22470 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20  y one or.** two 
22480 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
22490 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
224a0 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
224b0 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f  ver full. The ro
224c0 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70  ot page.** is sp
224d0 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c  ecial and is all
224e0 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c  owed to be nearl
224f0 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67  y empty. If pPag
22500 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f  e is .** the roo
22510 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
22520 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
22530 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ee might be incr
22540 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72  eased.** or decr
22550 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73  eased by one, as
22560 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b   necessary, to k
22570 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67  eep the root pag
22580 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  e from being.** 
22590 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70  overfull or comp
225a0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  letely empty..**
225b0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
225c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
225d0 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
225e0 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20  of the Cells on 
225f0 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e  pPage.** might n
22600 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
22610 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e  tored in pPage->
22620 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63  aData[].  This c
22630 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
22640 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
22650 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74  full.  Part of t
22660 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
22670 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20  outine is to.** 
22680 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65  make sure all Ce
22690 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e  lls for pPage on
226a0 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20  ce again fit in 
226b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a  pPage->aData[]..
226c0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
226d0 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
226e0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66   the siblings of
226f0 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65   pPage, the pare
22700 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d  nt of pPage.** m
22710 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72  ight become over
22720 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
22730 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70  l.  If that happ
22740 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ens, then this r
22750 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
22760 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
22770 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a  on the parent..*
22780 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
22790 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
227a0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
227b0 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
227c0 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
227d0 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
227e0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
227f0 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
22800 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
22810 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
22820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22830 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
22840 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
22850 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
22860 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
22870 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66  /* The parent of
22880 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68   pPage */.  BtSh
22890 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
228a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
228b0 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
228c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
228d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
228e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
228f0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
22900 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
22910 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
22920 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
22930 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
22940 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
22950 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22980 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
22990 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
229c0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
229d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20   */.  int nDiv; 
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22a00 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d  cells in apDiv[]
22a10 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
22a20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
22a30 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22a40 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ers */.  int idx
22a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22a60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
22a70 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65  f pPage in pPare
22a80 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
22a90 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ab0 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
22ac0 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
22ad0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
22ae0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
22af0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22b00 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
22b10 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74   int leafCorrect
22b20 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
22b30 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
22b40 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
22b50 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
22b60 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
22b70 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
22b80 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
22b90 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
22ba0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
22bb0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
22bc0 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
22bd0 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
22be0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
22bf0 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
22c00 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
22c10 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
22c20 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
22c30 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
22c40 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
22c50 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
22c60 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
22c70 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
22c80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22c90 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
22ca0 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
22cb0 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e[] */.  MemPage
22cc0 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
22cd0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
22ce0 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
22cf0 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  lings */.  Pgno 
22d00 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20  pgnoOld[NB];    
22d10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
22d20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
22d30 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d   page in apOld[]
22d40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
22d50 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
22d60 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
22d70 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
22d80 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
22d90 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
22da0 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
22db0 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
22dc0 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
22dd0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  ancing */.  Pgno
22de0 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20   pgnoNew[NB+2]; 
22df0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
22e00 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
22e10 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b  h page in apNew[
22e20 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  ] */.  u8 *apDiv
22e30 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
22e40 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
22e50 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
22e60 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
22e70 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
22e80 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
22e90 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
22ea0 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
22eb0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
22ec0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
22ed0 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
22ee0 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
22ef0 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
22f00 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
22f10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
22f20 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
22f30 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
22f40 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f60 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
22f70 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
22f80 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f  l[] */.  u8 *aCo
22f90 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
22fa0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
22fb0 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  or holding data 
22fc0 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20  of apCopy[] */. 
22fd0 20 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20   u8 *aSpace;    
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ff0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63   Space to hold c
23000 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
23010 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64  s cells */.#ifnd
23020 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23030 55 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a  UTOVACUUM.  u8 *
23040 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  aFrom = 0;.#endi
23050 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  f..  /* .  ** Fi
23060 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
23070 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
23080 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
23090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
230a0 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
230b0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44  teable(pPage->aD
230c0 61 74 61 29 20 29 3b 0a 20 20 70 42 74 20 3d 20  ata) );.  pBt = 
230d0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
230e0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
230f0 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65  Parent;.  sqlite
23100 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
23110 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
23120 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
23130 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
23140 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
23150 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
23160 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
23170 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
23180 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
23190 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
231a0 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20  NCE.  /*.  ** A 
231b0 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  special case:  I
231c0 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61  f a new entry ha
231d0 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65  s just been inse
231e0 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  rted into a.  **
231f0 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c   table (that is,
23200 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69 6e   a btree with in
23210 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61  teger keys and a
23220 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20 6c  ll data at the l
23230 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20  eaves).  ** and 
23240 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
23250 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
23260 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
23270 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20 20  e (it has the.  
23280 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20  ** largest key) 
23290 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70 65  then use the spe
232a0 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  cial balance_qui
232b0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
232c0 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e  .  ** balancing.
232d0 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28    balance_quick(
232e0 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72  ) is much faster
232f0 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20   and results in 
23300 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70  a tighter.  ** p
23310 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69  acking of data i
23320 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
23330 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
23340 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20  age->leaf &&.   
23350 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
23360 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
23370 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20 20 20  >leafData &&.   
23380 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
23390 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20  low==1 &&.      
233a0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
233b0 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx==pPage->nCel
233c0 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  l &&.      pPage
233d0 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  ->pParent->pgno!
233e0 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74 34  =1 &&.      get4
233f0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
23400 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
23410 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61  rOffset+8])==pPa
23420 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20  ge->pgno.  ){.  
23430 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    /*.    ** TODO
23440 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c  : Check the sibl
23450 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ings to the left
23460 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61   of pPage. It ma
23470 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  y be that.    **
23480 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75   they are not fu
23490 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61  ll and no new pa
234a0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ge is required..
234b0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
234c0 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
234d0 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
234e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
234f0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
23500 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65  cell in the pare
23510 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65  nt page whose le
23520 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20  ft child points 
23530 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61  back.  ** to pPa
23540 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76  ge.  The "idx" v
23550 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69  ariable is the i
23560 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c  ndex of that cel
23570 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a  l.  If pPage.  *
23580 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f  * is the rightmo
23590 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
235a0 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78  ent then set idx
235b0 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   to pParent->nCe
235c0 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ll .  */.  if( p
235d0 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74  Parent->idxShift
235e0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
235f0 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70 50  o;.    pgno = pP
23600 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  age->pgno;.    a
23610 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c  ssert( pgno==sql
23620 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
23630 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74  mber(pPage->aDat
23640 61 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64  a) );.    for(id
23650 78 3d 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74  x=0; idx<pParent
23660 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b  ->nCell; idx++){
23670 0a 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62  .      if( get4b
23680 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
23690 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e  rent, idx))==pgn
236a0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  o ){.        bre
236b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
236c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  }.    assert( id
236d0 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
236e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
236f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
23700 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
23710 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
23720 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73  ==pgno );.  }els
23730 65 7b 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61  e{.    idx = pPa
23740 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20  ge->idxParent;. 
23750 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e   }..  /*.  ** In
23760 69 74 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c  itialize variabl
23770 65 73 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  es so that it wi
23780 6c 6c 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75  ll be safe to ju
23790 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  mp.  ** directly
237a0 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61   to balance_clea
237b0 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e  nup at any momen
237c0 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d  t..  */.  nOld =
237d0 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c   nNew = 0;.  sql
237e0 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 70 50  ite3pager_ref(pP
237f0 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 0a  arent->aData);..
23800 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73    /*.  ** Find s
23810 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
23820 70 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65  pPage and the ce
23830 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74  lls in pParent t
23840 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20  hat divide.  ** 
23850 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41  the siblings.  A
23860 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
23870 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
23880 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a  lings on either.
23890 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61    ** side of pPa
238a0 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e  ge.  More siblin
238b0 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
238c0 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
238d0 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61  ver, if.  ** pPa
238e0 67 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77  ge there are few
238f0 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
23900 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
23910 20 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65   side.  If pPare
23920 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
23930 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
23940 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
23950 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
23960 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20  e taken..  */.  
23970 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e  nxDiv = idx - NN
23980 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20  ;.  if( nxDiv + 
23990 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43  NB > pParent->nC
239a0 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  ell ){.    nxDiv
239b0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
239c0 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a  l - NB + 1;.  }.
239d0 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b    if( nxDiv<0 ){
239e0 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
239f0 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a    }.  nDiv = 0;.
23a00 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44    for(i=0, k=nxD
23a10 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b  iv; i<NB; i++, k
23a20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70  ++){.    if( k<p
23a30 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
23a40 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
23a50 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
23a60 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44  nt, k);.      nD
23a70 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  iv++;.      asse
23a80 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65  rt( !pParent->le
23a90 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  af );.      pgno
23aa0 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
23ab0 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
23ac0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50   }else if( k==pP
23ad0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
23ae0 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
23af0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
23b00 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
23b10 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
23b20 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
23b30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23b40 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
23b50 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
23b60 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c  gnoOld[i], &apOl
23b70 64 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a  d[i], pParent);.
23b80 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
23b90 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
23ba0 70 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d  p;.    apOld[i]-
23bb0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a  >idxParent = k;.
23bc0 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20      apCopy[i] = 
23bd0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  0;.    assert( i
23be0 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f  ==nOld );.    nO
23bf0 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65  ld++;.    nMaxCe
23c00 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
23c10 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
23c20 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
23c30 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
23c40 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
23c50 65 20 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20  e of 2 in order 
23c60 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
23c70 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
23c80 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
23c90 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
23ca0 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  1)&~1;..  /*.  *
23cb0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
23cc0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
23cd0 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70  ctures.  */.  ap
23ce0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
23cf0 6c 6f 63 52 61 77 28 20 0a 20 20 20 20 20 20 20  locRaw( .       
23d00 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
23d10 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d30 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
23d40 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
23d50 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20  zeof(int)       
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
23d80 0a 20 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73  .     + ROUND8(s
23d90 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a  izeof(MemPage))*
23da0 4e 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NB              
23db0 20 20 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79          /* aCopy
23dc0 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
23dd0 70 61 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20  pageSize*(5+NB) 
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
23e00 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28  pace */.     + (
23e10 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e  ISAUTOVACUUM ? n
23e20 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20  MaxCells : 0)   
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e40 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a  * aFrom */.  );.
23e50 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
23e60 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
23e70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
23e80 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
23e90 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
23ea0 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c   = (int*)&apCell
23eb0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
23ec0 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26  Copy[0] = (u8*)&
23ed0 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
23ee0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
23ef0 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61  Copy[0] - (u8*)a
23f00 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
23f10 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
23f20 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
23f30 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  /.  for(i=1; i<N
23f40 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f  B; i++){.    aCo
23f50 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69  py[i] = &aCopy[i
23f60 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
23f70 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
23f80 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20  MemPage))];.    
23f90 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
23fa0 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  i] - (u8*)apCell
23fb0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
23fc0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
23fd0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
23fe0 0a 20 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f  .  aSpace = &aCo
23ff0 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61  py[NB-1][pBt->pa
24000 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
24010 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
24020 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70  .  assert( ((aSp
24030 61 63 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  ace - (u8*)apCel
24040 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
24050 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
24060 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69  t required */.#i
24070 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24080 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
24090 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
240a0 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  um ){.    aFrom 
240b0 3d 20 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d  = &aSpace[5*pBt-
240c0 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a  >pageSize];.  }.
240d0 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20  #endif.  .  /*. 
240e0 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   ** Make copies 
240f0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  of the content o
24100 66 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20  f pPage and its 
24110 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f  siblings into aO
24120 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72  ld[]..  ** The r
24130 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
24140 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
24150 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
24160 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74  es rather.  ** t
24170 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
24180 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
24190 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
241a0 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
241b0 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
241c0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
241d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
241e0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
241f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d      MemPage *p =
24200 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
24210 6d 50 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d  mPage*)&aCopy[i]
24220 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  [pBt->pageSize];
24230 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
24240 26 28 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e  &((u8*)p)[-pBt->
24250 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d  pageSize];.    m
24260 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20  emcpy(p->aData, 
24270 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
24280 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
24290 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
242a0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 65  );.    /* The me
242b0 6d 63 70 79 28 29 20 61 62 6f 76 65 20 63 68 61  mcpy() above cha
242c0 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  nges the value o
242d0 66 20 70 2d 3e 61 44 61 74 61 20 73 6f 20 77 65  f p->aData so we
242e0 20 68 61 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20   have to.    ** 
242f0 73 65 74 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f  set it again. */
24300 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
24310 26 28 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e  &((u8*)p)[-pBt->
24320 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a  pageSize];.  }..
24330 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70    /*.  ** Load p
24340 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63  ointers to all c
24350 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20  ells on sibling 
24360 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69  pages and the di
24370 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
24380 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
24390 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20  apCell[] array. 
243a0 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
243b0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
243c0 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63  s.  ** into spac
243d0 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20  e obtained form 
243e0 61 53 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d  aSpace[] and rem
243f0 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
24400 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
24410 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
24420 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
24430 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
24440 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
24450 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
24460 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
24470 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
24480 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
24490 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
244a0 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
244b0 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b   ** into aSpace[
244c0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
244d0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
244e0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
244f0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
24500 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
24510 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
24520 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
24530 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
24540 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
24550 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
24560 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
24570 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
24580 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
24590 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
245a0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
245b0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
245c0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
245d0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
245e0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
245f0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
24600 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
24610 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
24620 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e  y keys..  */.  n
24630 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66  Cell = 0;.  leaf
24640 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61  Correction = pPa
24650 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  ge->leaf*4;.  le
24660 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  afData = pPage->
24670 6c 65 61 66 44 61 74 61 20 26 26 20 70 50 61 67  leafData && pPag
24680 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69  e->leaf;.  for(i
24690 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
246a0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
246b0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b  Old = apCopy[i];
246c0 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
246d0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
246e0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
246f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
24700 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
24710 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
24720 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
24730 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
24740 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
24750 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
24760 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
24770 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
24780 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
24790 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
247a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
247b0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
247c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
247d0 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20          int a;. 
247e0 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
247f0 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  ll] = i;.       
24800 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64   for(a=0; a<pOld
24810 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b  ->nOverflow; a++
24820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
24830 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e   pOld->aOvfl[a].
24840 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43  pCell==apCell[nC
24850 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ell] ){.        
24860 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
24870 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
24880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
248a0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
248b0 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
248c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
248d0 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20  nOld-1 ){.      
248e0 69 6e 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a  int sz = cellSiz
248f0 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
24900 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  Div[i]);.      i
24910 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
24920 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74         /* With t
24930 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67  he LEAFDATA flag
24940 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20  , pParent cells 
24950 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59  hold only INTKEY
24960 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
24970 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  * are duplicates
24980 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20   of keys on the 
24990 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65  child pages.  We
249a0 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a   need to remove.
249b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
249c0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
249d0 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74  m pParent, but t
249e0 68 65 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  he dividers cell
249f0 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20  s are not.      
24a00 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70    ** added to ap
24a10 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74  Cell[] because t
24a20 68 65 79 20 61 72 65 20 64 75 70 6c 69 63 61 74  hey are duplicat
24a30 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c  es of child cell
24a40 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
24a50 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
24a60 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
24a70 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  z);.      }else{
24a80 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 54 65  .        u8 *pTe
24a90 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
24aa0 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
24ab0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lls );.        s
24ac0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
24ad0 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  z;.        pTemp
24ae0 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
24af0 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  e];.        iSpa
24b00 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
24b10 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
24b20 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  <=pBt->pageSize*
24b30 35 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  5 );.        mem
24b40 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
24b50 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
24b60 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
24b70 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
24b80 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20  ection;.#ifndef 
24b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24ba0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69  VACUUM.        i
24bb0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
24bc0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
24bd0 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30  aFrom[nCell] = 0
24be0 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  xFF;.        }.#
24bf0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 72  endif.        dr
24c00 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
24c10 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
24c20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
24c30 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74  ] -= leafCorrect
24c40 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ion;.        ass
24c50 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54  ert( get4byte(pT
24c60 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d  emp)==pgnoOld[i]
24c70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
24c80 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
24c90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
24ca0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
24cb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
24cc0 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69  /* The right poi
24cd0 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
24ce0 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f  d page pOld beco
24cf0 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20  mes the left.   
24d00 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
24d10 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
24d20 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
24d30 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c     memcpy(apCell
24d40 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e  [nCell], &pOld->
24d50 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f  aData[pOld->hdrO
24d60 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20  ffset+8], 4);.  
24d70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24d80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
24d90 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
24da0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
24db0 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
24dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24dd0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75  ..  /*.  ** Figu
24de0 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65  re out the numbe
24df0 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65  r of pages neede
24e00 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43  d to hold all nC
24e10 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20  ell cells..  ** 
24e20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65  Store this numbe
24e30 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20  r in "k".  Also 
24e40 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20  compute szNew[] 
24e50 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74  which is the tot
24e60 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  al.  ** size of 
24e70 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  all cells on the
24e80 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63   i-th page and c
24e90 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  ntNew[] which is
24ea0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
24eb0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74  in apCell[] of t
24ec0 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76  he cell that div
24ed0 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d  ides page i from
24ee0 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a   page i+1.  .  *
24ef0 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75  * cntNew[k] shou
24f00 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a  ld equal nCell..
24f10 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73    **.  ** Values
24f20 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69   computed by thi
24f30 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20  s block:.  **.  
24f40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20  **           k: 
24f50 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
24f60 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65   of sibling page
24f70 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b  s.  **    szNew[
24f80 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20  i]: Spaced used 
24f90 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  on the i-th sibl
24fa0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20  ing page..  **  
24fb0 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65   cntNew[i]: Inde
24fc0 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  x in apCell[] an
24fd0 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74  d szCell[] for t
24fe0 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  he first cell to
24ff0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
25000 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20     the right of 
25010 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
25020 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62   page..  ** usab
25030 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20  leSpace: Number 
25040 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
25050 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65  e available on e
25060 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a  ach sibling..  *
25070 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65  * .  */.  usable
25080 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61  Space = pBt->usa
25090 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c  bleSize - 12 + l
250a0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
250b0 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d   for(subtotal=k=
250c0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
250d0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
250e0 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  i<nMaxCells );. 
250f0 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73     subtotal += s
25100 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20  zCell[i] + 2;.  
25110 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e    if( subtotal >
25120 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a   usableSpace ){.
25130 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d        szNew[k] =
25140 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65   subtotal - szCe
25150 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74  ll[i];.      cnt
25160 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20  New[k] = i;.    
25170 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
25180 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73  { i--; }.      s
25190 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20  ubtotal = 0;.   
251a0 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     k++;.    }.  
251b0 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73  }.  szNew[k] = s
251c0 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65  ubtotal;.  cntNe
251d0 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  w[k] = nCell;.  
251e0 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  k++;..  /*.  ** 
251f0 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70  The packing comp
25200 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  uted by the prev
25210 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69  ious block is bi
25220 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20  ased toward the 
25230 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e  siblings.  ** on
25240 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20   the left side. 
25250 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e   The left siblin
25260 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65  gs are always ne
25270 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65  arly full, while
25280 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d   the.  ** right-
25290 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67  most sibling mig
252a0 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  ht be nearly emp
252b0 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20  ty.  This block 
252c0 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73  of code attempts
252d0 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20  .  ** to adjust 
252e0 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73  the packing of s
252f0 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61  iblings to get a
25300 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e   better balance.
25310 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
25320 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f  adjustment is mo
25330 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d  re than an optim
25340 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61  ization.  The pa
25350 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68  cking above migh
25360 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74  t.  ** be so out
25370 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74   of balance as t
25380 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46  o be illegal.  F
25390 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
253a0 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
253b0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
253c0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
253d0 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d  y.  This adjustm
253e0 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f  ent is not optio
253f0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nal..  */.  for(
25400 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  i=k-1; i>0; i--)
25410 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68  {.    int szRigh
25420 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f  t = szNew[i];  /
25430 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
25440 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  g on the right *
25450 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74  /.    int szLeft
25460 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f   = szNew[i-1]; /
25470 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
25480 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  g on the left */
25490 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20  .    int r;     
254a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
254b0 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20  x of right-most 
254c0 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62  cell in left sib
254d0 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ling */.    int 
254e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
254f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
25500 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65  t cell to the le
25510 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c  ft of right sibl
25520 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20  ing */..    r = 
25530 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
25540 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d  .    d = r + 1 -
25550 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61   leafData;.    a
25560 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c  ssert( d<nMaxCel
25570 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
25580 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( r<nMaxCells );
25590 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69  .    while( szRi
255a0 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68  ght==0 || szRigh
255b0 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73  t+szCell[d]+2<=s
255c0 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d  zLeft-(szCell[r]
255d0 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52  +2) ){.      szR
255e0 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64  ight += szCell[d
255f0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c  ] + 2;.      szL
25600 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d  eft -= szCell[r]
25610 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e   + 2;.      cntN
25620 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20  ew[i-1]--;.     
25630 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
25640 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20   - 1;.      d = 
25650 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
25660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65  ;.    }.    szNe
25670 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a  w[i] = szRight;.
25680 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d      szNew[i-1] =
25690 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20   szLeft;.  }..  
256a0 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75  /* Either we fou
256b0 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  nd one or more c
256c0 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29  ells (cntnew[0])
256d0 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68  >0) or we are th
256e0 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c  e.  ** a virtual
256f0 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76   root page.  A v
25700 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
25710 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61   is when the rea
25720 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65  l root.  ** page
25730 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77   is page 1 and w
25740 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63  e are the only c
25750 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67  hild of that pag
25760 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
25770 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
25780 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
25790 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
257a0 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Cell==0) );..  /
257b0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
257c0 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
257d0 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
257e0 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
257f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
25800 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20  ge->pgno>1 );.  
25810 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67  pageFlags = pPag
25820 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66  e->aData[0];.  f
25830 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
25840 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
25850 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c  pNew;.    if( i<
25860 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e  nOld ){.      pN
25870 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20  ew = apNew[i] = 
25880 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  apOld[i];.      
25890 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e  pgnoNew[i] = pgn
258a0 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  oOld[i];.      a
258b0 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
258c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
258d0 61 67 65 72 5f 77 72 69 74 65 28 70 4e 65 77 2d  ager_write(pNew-
258e0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69  >aData);.      i
258f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
25900 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
25910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
25920 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65  c = allocatePage
25930 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
25940 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65  noNew[i], pgnoNe
25950 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20  w[i-1], 0);.    
25960 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
25970 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
25980 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
25990 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
259a0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7a 65    nNew++;.    ze
259b0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
259c0 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  eFlags);.  }..  
259d0 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
259e0 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
259f0 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
25a00 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
25a10 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
25a20 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
25a30 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
25a40 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
25a50 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
25a60 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
25a70 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
25a80 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
25a90 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
25aa0 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
25ab0 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
25ac0 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
25ad0 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
25ae0 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
25af0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
25b00 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
25b10 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
25b20 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
25b30 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
25b40 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
25b50 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
25b60 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
25b70 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
25b80 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
25b90 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
25ba0 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
25bb0 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
25bc0 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
25bd0 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
25be0 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
25bf0 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
25c00 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
25c10 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
25c20 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
25c30 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
25c40 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
25c50 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
25c60 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
25c70 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
25c80 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
25c90 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
25ca0 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
25cb0 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
25cc0 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
25cd0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
25ce0 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  V = pgnoNew[i];.
25cf0 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
25d00 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
25d10 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
25d20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d    if( pgnoNew[j]
25d30 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
25d40 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
25d50 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
25d60 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a  V = pgnoNew[j];.
25d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25d80 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
25d90 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20        int t;.   
25da0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
25db0 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65        t = pgnoNe
25dc0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d  w[i];.      pT =
25dd0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
25de0 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
25df0 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  noNew[minI];.   
25e00 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
25e10 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
25e20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d   pgnoNew[minI] =
25e30 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b   t;.      apNew[
25e40 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
25e50 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
25e60 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
25e70 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28   %d %d  new: %d(
25e80 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
25e90 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
25ea0 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  n",.    pgnoOld[
25eb0 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  0], .    nOld>=2
25ec0 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20   ? pgnoOld[1] : 
25ed0 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
25ee0 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c   pgnoOld[2] : 0,
25ef0 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c  .    pgnoNew[0],
25f00 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
25f10 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77  New>=2 ? pgnoNew
25f20 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  [1] : 0, nNew>=2
25f30 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
25f40 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70  .    nNew>=3 ? p
25f50 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e  gnoNew[2] : 0, n
25f60 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
25f70 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
25f80 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20  =4 ? pgnoNew[3] 
25f90 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
25fa0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
25fb0 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e   nNew>=5 ? pgnoN
25fc0 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[4] : 0, nNew>
25fd0 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
25fe0 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  0));..  /*.  ** 
25ff0 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
26000 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
26010 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
26020 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
26030 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
26040 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
26050 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
26060 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
26070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
26080 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
26090 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
260a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
260b0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
260c0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
260d0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
260e0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
260f0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e  ssert( pNew->pgn
26100 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b  o==pgnoNew[i] );
26110 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
26120 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
26130 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
26140 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
26150 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
26160 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
26170 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
26180 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
26190 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
261a0 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64  low==0 );..#ifnd
261b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
261c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a  UTOVACUUM.    /*
261d0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
261e0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
261f0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
26200 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
26210 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ies.    ** that 
26220 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62  point to the sib
26230 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20  lings that were 
26240 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73  rearranged. Thes
26250 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20  e can be: left. 
26260 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f     ** children o
26270 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67  f cells, the rig
26280 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
26290 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f  page, or overflo
262a0 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70  w pages.    ** p
262b0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c  ointed to by cel
262c0 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
262d0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
262e0 75 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  um ){.      for(
262f0 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d  k=j; k<cntNew[i]
26300 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
26310 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65  assert( k<nMaxCe
26320 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69  lls );.        i
26330 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46  f( aFrom[k]==0xF
26340 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
26350 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[k]]->pgno!=pNe
26360 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  w->pgno ){.     
26370 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
26380 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d  PutOvfl(pNew, k-
26390 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
263a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
263b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
263c0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
263d0 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
263e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
263f0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
26400 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
26410 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
26420 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
26430 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
26440 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
26450 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
26460 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
26470 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
26480 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
26490 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
264a0 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
264b0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
264c0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
264d0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
264e0 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
264f0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
26500 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
26510 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
26520 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
26530 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
26540 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  ction;.      if(
26550 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
26560 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
26570 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
26580 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
26590 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20     pTemp = 0;.  
265a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
265b0 61 66 44 61 74 61 20 29 7b 0a 09 2f 2a 20 49 66  afData ){../* If
265c0 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
265d0 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
265e0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
265f0 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
26600 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
26610 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
26620 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
26630 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
26640 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
26650 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
26660 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
26670 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
26680 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
26690 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
266a0 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
266b0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
266c0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
266d0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
266e0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
266f0 3b 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43  ;.        parseC
26700 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
26710 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
26720 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
26730 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
26740 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43  .        fillInC
26750 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
26760 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
26770 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
26780 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
26790 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
267a0 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
267b0 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
267c0 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
267d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
267e0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
267f0 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  4;.        pTemp
26800 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
26810 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  e];.        iSpa
26820 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
26830 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
26840 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  <=pBt->pageSize*
26850 35 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  5 );.      }.   
26860 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
26870 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
26880 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
26890 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  emp, 4);.      i
268a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
268b0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
268c0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70  cleanup;.      p
268d0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
268e0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
268f0 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
26900 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
26910 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26920 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
26930 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
26940 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
26950 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
26960 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
26970 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
26980 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
26990 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
269a0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
269b0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
269c0 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
269d0 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
269e0 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
269f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
26a00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26a10 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
26a20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
26a30 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
26a40 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
26a50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26a70 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
26a80 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
26a90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
26aa0 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  if.      j++;.  
26ab0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
26ac0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
26ad0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 69   j==nCell );.  i
26ae0 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20  f( (pageFlags & 
26af0 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a  PTF_LEAF)==0 ){.
26b00 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
26b10 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
26b20 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  [8], &apCopy[nOl
26b30 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  d-1]->aData[8], 
26b40 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78  4);.  }.  if( nx
26b50 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Div==pParent->nC
26b60 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  ell+pParent->nOv
26b70 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a  erflow ){.    /*
26b80 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
26b90 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74  ing is the right
26ba0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  -most child of p
26bb0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75  Parent */.    pu
26bc0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
26bd0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
26be0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
26bf0 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
26c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
26c10 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
26c20 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63  ng is the left c
26c30 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  hild of the firs
26c40 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65  t entry in pPare
26c50 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  nt.    ** past t
26c60 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69  he right-most di
26c70 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20  vider entry */. 
26c80 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
26c90 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
26ca0 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67  rent, nxDiv), pg
26cb0 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
26cc0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
26cd0 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e  eparent children
26ce0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20   of all cells.. 
26cf0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
26d00 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
26d10 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68   rc = reparentCh
26d20 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69  ildPages(apNew[i
26d30 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
26d40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
26d50 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
26d60 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70  ;.  }.  rc = rep
26d70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
26d80 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
26d90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26da0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
26db0 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  anup;..  /*.  **
26dc0 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   Balance the par
26dd0 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20  ent page.  Note 
26de0 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
26df0 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69   page (pPage) mi
26e00 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ght.  ** have be
26e10 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  en added to the 
26e20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d  freelist so it m
26e30 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62  ight no longer b
26e40 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
26e50 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65   ** But the pare
26e60 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77  nt page will alw
26e70 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ays be initializ
26e80 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
26e90 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
26ea0 69 74 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72  it );.  /* asser
26eb0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
26ec0 20 29 3b 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65   ); // No! pPage
26ed0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
26ee0 20 61 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69   added to freeli
26ef0 73 74 20 2a 2f 0a 20 20 2f 2a 20 70 61 67 65 49  st */.  /* pageI
26f00 6e 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b  ntegrity(pPage);
26f10 20 20 20 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65      // No! pPage
26f20 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
26f30 20 61 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69   added to freeli
26f40 73 74 20 2a 2f 20 0a 20 20 72 63 20 3d 20 62 61  st */ .  rc = ba
26f50 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
26f60 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  );.  .  /*.  ** 
26f70 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
26f80 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
26f90 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
26fa0 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 43    sqliteFree(apC
26fb0 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
26fc0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
26fd0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
26fe0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
26ff0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
27000 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
27010 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
27020 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
27030 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
27040 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
27050 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25   finished with %
27060 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
27070 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
27080 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
27090 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c  gno, nOld, nNew,
270a0 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75   nCell));.  retu
270b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
270c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
270d0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
270e0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
270f0 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
27100 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
27110 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
27120 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
27130 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
27140 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
27150 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
27160 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
27170 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
27180 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
27190 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  {.  MemPage *pCh
271a0 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
271b0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69   /* The only chi
271c0 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65  ld page of pPage
271d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
271e0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
271f0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
27200 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a  r for pChild */.
27210 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27220 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
27230 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
27240 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
27250 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
27260 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
27270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
27280 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  n BTree structur
27290 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c  e */.  int mxCel
272a0 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20  lPerPage;       
272b0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
272c0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70  umber of cells p
272d0 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  er page */.  u8 
272e0 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
272f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
27300 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65   cells from page
27310 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
27320 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c   */.  int *szCel
27330 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
27340 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
27350 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
27360 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27370 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
27380 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27390 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
273a0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
273b0 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
273c0 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
273d0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
273e0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6d 78  iteMallocRaw( mx
273f0 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a  CellPerPage*(siz
27400 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28  eof(u8*)+sizeof(
27410 69 6e 74 29 29 20 29 3b 0a 20 20 69 66 28 20 61  int)) );.  if( a
27420 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pCell==0 ) retur
27430 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
27440 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
27450 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50  )&apCell[mxCellP
27460 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70  erPage];.  if( p
27470 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
27480 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69    /* The table i
27490 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
274a0 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28  ty */.    TRACE(
274b0 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79  ("BALANCE: empty
274c0 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50   table %d\n", pP
274d0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
274e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
274f0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
27500 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20  pty but has one 
27510 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72  child.  Transfer
27520 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f   the.    ** info
27530 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61  rmation from tha
27540 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f  t one child into
27550 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
27560 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  f it .    ** wil
27570 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64  l fit.  This red
27580 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  uces the depth o
27590 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e  f the tree by on
275a0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
275b0 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
275c0 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20  e is page 1, it 
275d0 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61  has less space a
275e0 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20  vailable than.  
275f0 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28    ** its child (
27600 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62  due to the 100 b
27610 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20  yte header that 
27620 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65  occurs at the be
27630 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  ginning.    ** o
27640 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
27650 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74  le), so it might
27660 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
27670 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  hold all of the 
27680 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
27690 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ion currently co
276a0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63  ntained in the c
276b0 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69  hild.  If this i
276c0 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  s the .    ** ca
276d0 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  se, then do not 
276e0 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e  do the transfer.
276f0 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65    Leave page 1 e
27700 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20  mpty except.    
27710 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ** for the right
27720 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  -pointer to the 
27730 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
27740 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f   child page beco
27750 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  mes.    ** the v
27760 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74  irtual root of t
27770 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a  he tree..    */.
27780 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
27790 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
277a0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
277b0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
277c0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
277d0 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ld>0 );.    asse
277e0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73  rt( pgnoChild<=s
277f0 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
27800 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74  count(pPage->pBt
27810 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  ->pPager) );.   
27820 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 50   rc = getPage(pP
27830 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
27840 69 6c 64 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20  ild, &pChild);. 
27850 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
27860 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
27870 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50  ance;.    if( pP
27880 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  age->pgno==1 ){.
27890 20 20 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50        rc = initP
278a0 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67  age(pChild, pPag
278b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
278c0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
278d0 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
278e0 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
278f0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  d->nOverflow==0 
27900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  );.      if( pCh
27910 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20  ild->nFree>=100 
27920 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27930 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74  e child informat
27940 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ion will fit on 
27950 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73  the root page, s
27960 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20  o do the.       
27970 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20   ** copy */.    
27980 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
27990 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
279a0 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
279b0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
279c0 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
279d0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
279e0 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69          apCell[i
279f0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68  ] = findCell(pCh
27a00 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  ild,i);.        
27a10 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65    szCell[i] = ce
27a20 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64  llSizePtr(pChild
27a30 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , apCell[i]);.  
27a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27a50 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61  assemblePage(pPa
27a60 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ge, pChild->nCel
27a70 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  l, apCell, szCel
27a80 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l);.        /* C
27a90 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f  opy the right-po
27aa0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
27ab0 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ld to the parent
27ac0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
27ad0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
27ae0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
27af0 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20  fset+8], .      
27b00 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
27b10 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43  pChild->aData[pC
27b20 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  hild->hdrOffset+
27b30 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72  8]));.        fr
27b40 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
27b50 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
27b60 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
27b70 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61  d transfer to pa
27b80 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
27b90 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
27ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
27bb0 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d   The child has m
27bc0 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
27bd0 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  that will fit on
27be0 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20   the root..     
27bf0 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69     ** The tree i
27c00 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63  s already balanc
27c10 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  ed.  Do nothing.
27c20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43   */.        TRAC
27c30 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
27c40 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66  ld %d will not f
27c50 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c  it on page 1\n",
27c60 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
27c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
27c80 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
27c90 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
27ca0 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50  Child->aData, pP
27cb0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
27cc0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
27cd0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
27ce0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
27cf0 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
27d00 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50  rc = initPage(pP
27d10 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  age, 0);.      a
27d20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
27d30 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72  E_OK );.      fr
27d40 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
27d50 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
27d60 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20  LANCE: transfer 
27d70 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f  child %d into ro
27d80 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %d\n",.      
27d90 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e          pChild->
27da0 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e  pgno, pPage->pgn
27db0 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
27dc0 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
27dd0 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20  dPages(pPage);. 
27de0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27df0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
27e00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
27e10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
27e20 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
27e30 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
27e40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
27e50 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
27e60 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20  >nCell; i++){ . 
27e70 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
27e80 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c  apPutOvfl(pPage,
27e90 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
27ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
27ec0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
27ed0 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ance;.        }.
27ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
27ef0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21  ndif.    if( rc!
27f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
27f10 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
27f20 6c 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65 61  lance;.    relea
27f30 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
27f40 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f    }.end_shallow_
27f50 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74  balance:.  sqlit
27f60 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  eFree(apCell);. 
27f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
27f80 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
27f90 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
27fa0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
27fb0 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
27fc0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
27fd0 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
27fe0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
27ff0 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
28000 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
28010 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
28020 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
28030 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
28040 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
28050 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
28060 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
28070 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
28080 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
28090 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
280a0 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
280b0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
280c0 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
280d0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  *pPage){.  int r
280e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
280f0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
28100 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
28110 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
28120 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
28130 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
28140 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
28150 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
28160 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
28170 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
28180 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
28190 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
281a0 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
281b0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
281c0 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
281d0 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
281e0 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
281f0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
28200 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
28210 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
28220 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
28230 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
28240 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
28250 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
28260 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
28270 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
28280 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
28290 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20  t */.  int brk; 
282a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
282b0 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
282c0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
282d0 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
282e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
282f0 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
28300 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
28310 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
28320 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
28330 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61   rc = allocatePa
28340 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c  ge(pBt, &pChild,
28350 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61   &pgnoChild, pPa
28360 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  ge->pgno, 0);.  
28370 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28380 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
28390 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
283a0 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 61  teable(pChild->a
283b0 44 61 74 61 29 20 29 3b 0a 20 20 75 73 61 62 6c  Data) );.  usabl
283c0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
283d0 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20  bleSize;.  data 
283e0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
283f0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
28400 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20  drOffset;.  brk 
28410 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
28420 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74  [hdr+5]);.  cdat
28430 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  a = pChild->aDat
28440 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74  a;.  memcpy(cdat
28450 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70  a, &data[hdr], p
28460 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
28470 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  +2*pPage->nCell-
28480 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  hdr);.  memcpy(&
28490 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74  cdata[brk], &dat
284a0 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
284b0 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72  ze-brk);.  asser
284c0 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69  t( pChild->isIni
284d0 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 69  t==0 );.  rc = i
284e0 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
284f0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
28500 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
28510 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d  eeper_out;.  mem
28520 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
28530 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c  l, pPage->aOvfl,
28540 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
28550 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
28560 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
28570 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
28580 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
28590 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64  ow;.  if( pChild
285a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
285b0 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65     pChild->nFree
285c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
285d0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
285e0 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  l==pPage->nCell 
285f0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
28600 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
28610 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
28620 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
28630 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
28640 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
28650 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
28660 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28670 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
28680 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
28690 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
286a0 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53  gno));.#ifndef S
286b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
286c0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
286d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
286e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63     int i;.    rc
286f0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
28700 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20  , pChild->pgno, 
28710 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
28720 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
28730 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
28740 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b  lancedeeper_out;
28750 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28760 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69  pChild->nCell; i
28770 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
28780 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43  ptrmapPutOvfl(pC
28790 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20  hild, i);.      
287a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
287b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
287c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
287d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
287e0 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f  .  rc = balance_
287f0 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b  nonroot(pChild);
28800 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  ..balancedeeper_
28810 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
28820 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65  ge(pChild);.  re
28830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28840 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20  * Decide if the 
28850 70 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73  page pPage needs
28860 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e   to be balanced.
28870 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69    If balancing i
28880 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63  s.** required, c
28890 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69  all the appropri
288a0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  ate balancing ro
288b0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
288c0 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d   int balance(Mem
288d0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
288e0 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20   insert){.  int 
288f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28900 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
28910 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  rent==0 ){.    i
28920 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
28930 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  low>0 ){.      r
28940 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
28950 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  er(pPage);.    }
28960 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28970 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
28980 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
28990 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
289a0 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29  shallower(pPage)
289b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
289c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
289d0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a  nOverflow>0 || .
289e0 20 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74          (!insert
289f0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
28a00 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
28a10 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a  bleSize*2/3) ){.
28a20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
28a30 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65  ce_nonroot(pPage
28a40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
28a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28a60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28a70 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f  checks all curso
28a80 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
28a90 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e   table pgnoRoot.
28aa0 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  .** If any of th
28ab0 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 74 68 65  ose cursors othe
28ac0 72 20 74 68 61 6e 20 70 45 78 63 6c 75 64 65 20  r than pExclude 
28ad0 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
28ae0 20 0a 2a 2a 20 77 72 46 6c 61 67 3d 3d 30 20 74   .** wrFlag==0 t
28af0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28b00 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
28b10 4c 4f 43 4b 45 44 2e 20 20 49 66 20 61 6c 6c 0a  LOCKED.  If all.
28b20 2a 2a 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ** cursors that 
28b30 70 6f 69 6e 74 20 74 6f 20 70 67 6e 6f 52 6f 6f  point to pgnoRoo
28b40 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69  t were opened wi
28b50 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 20  th wrFlag==1.** 
28b60 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
28b70 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
28b80 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64  _OK..**.** In ad
28b90 64 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69  dition to checki
28ba0 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b  ng for read-lock
28bb0 73 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d  s (where a read-
28bc0 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61  lock .** means a
28bd0 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77   cursor opened w
28be0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74  ith wrFlag==0) t
28bf0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
28c00 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63 75   moves.** all cu
28c10 72 73 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  rsors other than
28c20 20 70 45 78 63 6c 75 64 65 20 73 6f 20 74 68 61   pExclude so tha
28c30 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
28c40 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
28c50 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 72 6f 6f  irst Cell on roo
28c60 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  t page.  This is
28c70 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
28c80 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a  se an insert .**
28c90 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74   or delete might
28ca0 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62   change the numb
28cb0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61  er of cells on a
28cc0 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a   page or delete.
28cd0 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65  ** a page entire
28ce0 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  ly and we do not
28cf0 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61   want to leave a
28d00 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70  ny cursors .** p
28d10 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65  ointing to non-e
28d20 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72  xistant pages or
28d30 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
28d40 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
28d50 6f 63 6b 73 28 42 74 53 68 61 72 65 64 20 2a 70  ocks(BtShared *p
28d60 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  Bt, Pgno pgnoRoo
28d70 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
28d80 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73  clude){.  BtCurs
28d90 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
28da0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
28db0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
28dc0 20 75 33 32 20 66 6c 61 67 73 20 3d 20 28 70 2d   u32 flags = (p-
28dd0 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65  >pBtree->pSqlite
28de0 20 3f 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53   ? p->pBtree->pS
28df0 71 6c 69 74 65 2d 3e 66 6c 61 67 73 20 3a 20 30  qlite->flags : 0
28e00 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  );.    if( p->pg
28e10 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74  noRoot!=pgnoRoot
28e20 20 7c 7c 20 70 3d 3d 70 45 78 63 6c 75 64 65 20   || p==pExclude 
28e30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
28e40 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
28e50 20 26 26 20 66 6c 61 67 73 26 53 51 4c 49 54 45   && flags&SQLITE
28e60 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
28e70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28e80 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d   if( p->wrFlag==
28e90 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
28ea0 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 69 66  E_LOCKED;.    if
28eb0 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  ( p->pPage->pgno
28ec0 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  !=p->pgnoRoot ){
28ed0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  .      moveToRoo
28ee0 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(p);.    }.  }.
28ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28f00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
28f10 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
28f20 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
28f30 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
28f40 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
28f50 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
28f60 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
28f70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
28f80 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
28f90 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
28fa0 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
28fb0 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
28fc0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
28fd0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
28fe0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
28ff0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
29000 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
29010 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
29020 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
29030 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
29040 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
29050 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
29060 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
29070 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
29080 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
29090 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
290a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
290b0 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
290c0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
290d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
290e0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
290f0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
29100 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
29110 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
29120 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
29130 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
29140 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
29150 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
29160 6e 74 20 6e 44 61 74 61 20 20 20 2f 2a 20 54 68  nt nData   /* Th
29170 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
29180 77 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  w record */.){. 
29190 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
291a0 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b  oc;.  int szNew;
291b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
291c0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
291d0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
291e0 65 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  e->pBt;.  unsign
291f0 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
29200 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
29210 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
29220 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
29230 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
29240 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
29250 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
29260 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
29270 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
29280 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
29290 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
292a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
292b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
292c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
292d0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
292e0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
292f0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
29300 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
29310 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70  /* Cursor not op
29320 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a  en for writing *
29330 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  /.  }.  if( chec
29340 6b 52 65 61 64 4c 6f 63 6b 73 28 70 42 74 2c 20  kReadLocks(pBt, 
29350 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
29360 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74  pCur) ){.    ret
29370 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
29380 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
29390 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
293a0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
293b0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65  /.  }..  /* Save
293c0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
293d0 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
293e0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
293f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
29400 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
29410 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72  (rc = restoreCur
29420 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
29430 2c 20 30 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c  , 0)) ||.    SQL
29440 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
29450 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
29460 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
29470 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
29480 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
29490 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
294a0 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
294b0 6e 4b 65 79 2c 20 26 6c 6f 63 29 29 0a 20 20 29  nKey, &loc)).  )
294c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
294d0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
294e0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
294f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
29500 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
29510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29520 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
29530 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a  ge->leafData );.
29540 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54    TRACE(("INSERT
29550 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d  : table=%d nkey=
29560 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61  %lld ndata=%d pa
29570 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ge=%d %s\n",.   
29580 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
29590 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61  oRoot, nKey, nDa
295a0 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ta, pPage->pgno,
295b0 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d  .          loc==
295c0 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20  0 ? "overwrite" 
295d0 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b  : "new entry"));
295e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
295f0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63  ->isInit );.  rc
29600 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
29610 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61  write(pPage->aDa
29620 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ta);.  if( rc ) 
29630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77  return rc;.  new
29640 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
29650 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f  locRaw( MX_CELL_
29660 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
29670 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20  f( newCell==0 ) 
29680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29690 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  MEM;.  rc = fill
296a0 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65  InCell(pPage, ne
296b0 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
296c0 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  y, pData, nData,
296d0 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
296e0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
296f0 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
29700 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
29710 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
29720 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
29730 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
29740 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66  IZE(pBt) );.  if
29750 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53  ( loc==0 && CURS
29760 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
29770 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 69 6e  eState ){.    in
29780 74 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73  t szOld;.    ass
29790 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
297a0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
297b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
297c0 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
297d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
297e0 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28  r->idx);.    if(
297f0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
29800 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
29810 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
29820 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
29830 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
29840 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
29850 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
29860 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
29870 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
29880 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
29890 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
298a0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
298b0 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65  dx, szOld);.  }e
298c0 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
298d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
298e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
298f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
29900 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
29910 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
29920 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
29930 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
29940 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
29950 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
29960 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
29970 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a  idx, newCell, sz
29980 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
29990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
299a0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
299b0 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  t;.  rc = balanc
299c0 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f  e(pPage, 1);.  /
299d0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
299e0 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42 74  geDump(pCur->pBt
299f0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
29a00 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66  , 1); */.  /* ff
29a10 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f  lush(stdout); */
29a20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
29a40 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
29a50 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
29a60 73 71 6c 69 74 65 46 72 65 65 28 6e 65 77 43 65  sqliteFree(newCe
29a70 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
29a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
29a90 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
29aa0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
29ab0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
29ac0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
29ad0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
29ae0 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
29af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29b00 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
29b10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
29b20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
29b30 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75  pCur->pPage;.  u
29b40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
29b50 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ell;.  int rc;. 
29b60 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20   Pgno pgnoChild 
29b70 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
29b80 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
29b90 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  ree->pBt;..  ass
29ba0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
29bb0 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  it );.  if( pBt-
29bc0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
29bd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
29be0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
29bf0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
29c00 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65  efore doing a de
29c10 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
29c20 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
29c30 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
29c40 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
29c50 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
29c60 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
29c70 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
29c80 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65  dx >= pPage->nCe
29c90 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
29ca0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20   SQLITE_ERROR;  
29cb0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  /* The cursor is
29cc0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
29cd0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
29ce0 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
29cf0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
29d00 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
29d10 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65    /* Did not ope
29d20 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f  n this cursor fo
29d30 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
29d40 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
29d50 4c 6f 63 6b 73 28 70 42 74 2c 20 70 43 75 72 2d  Locks(pBt, pCur-
29d60 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
29d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29d80 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
29d90 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
29da0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
29db0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
29dc0 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
29dd0 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
29de0 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f  r position (a no
29df0 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f  -op if the curso
29e00 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a  r is not in .  *
29e10 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
29e20 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20  SEEK state) and 
29e30 73 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  save the positio
29e40 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
29e50 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70  cursors .  ** op
29e60 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  en on the same t
29e70 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20  able. Then call 
29e80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
29e90 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65  te() on the page
29ea0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65  .  ** that the e
29eb0 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c  ntry will be del
29ec0 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a  eted from..  */.
29ed0 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d    if( .    (rc =
29ee0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
29ef0 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 29  sition(pCur, 1))
29f00 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61   ||.    (rc = sa
29f10 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
29f20 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
29f30 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
29f40 28 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67  (rc = sqlite3pag
29f50 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e  er_write(pPage->
29f60 61 44 61 74 61 29 29 0a 20 20 29 7b 0a 20 20 20  aData)).  ){.   
29f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
29f80 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
29f90 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 27   cell within it'
29fa0 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65  s page and leave
29fb0 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   pCell pointing 
29fc0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
29fd0 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28  . The clearCell(
29fe0 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79  ) call frees any
29ff0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2a000 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a010 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54  the.  ** cell. T
2a020 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69  he cell itself i
2a030 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a  s still intact..
2a040 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66    */.  pCell = f
2a050 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2a060 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28  Cur->idx);.  if(
2a070 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2a080 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d  .    pgnoChild =
2a090 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2a0a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65  ;.  }.  rc = cle
2a0b0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2a0c0 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ell);.  if( rc )
2a0d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
2a0e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2a0f0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2a100 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
2a110 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
2a120 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
2a130 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
2a140 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
2a150 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
2a160 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
2a170 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
2a180 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
2a190 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
2a1a0 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
2a1b0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
2a1c0 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
2a1d0 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
2a1e0 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
2a1f0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2a200 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
2a210 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
2a220 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
2a230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
2a240 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
2a250 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2a260 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
2a270 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   szNext;.    int
2a280 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
2a290 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
2a2a0 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
2a2b0 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c  ssert( !pPage->l
2a2c0 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20 67  eafData );.    g
2a2d0 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75  etTempCursor(pCu
2a2e0 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  r, &leafCur);.  
2a2f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2a300 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
2a310 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
2a320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
2a340 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
2a350 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a360 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a370 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
2a380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2a390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a3a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a3b0 70 61 67 65 72 5f 77 72 69 74 65 28 6c 65 61 66  pager_write(leaf
2a3c0 43 75 72 2e 70 50 61 67 65 2d 3e 61 44 61 74 61  Cur.pPage->aData
2a3d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a3e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a3f0 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  {.      TRACE(("
2a400 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2a410 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
2a420 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
2a430 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2a440 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
2a450 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2a460 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e  ->pgno, leafCur.
2a470 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2a480 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2a490 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2a4a0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2a4b0 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
2a4c0 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65    pNext = findCe
2a4d0 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2a4e0 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a  , leafCur.idx);.
2a4f0 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63        szNext = c
2a500 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43  ellSizePtr(leafC
2a510 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29  ur.pPage, pNext)
2a520 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a530 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2a540 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20  )>=szNext+4 );. 
2a550 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20       tempCell = 
2a560 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
2a570 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2a580 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
2a590 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
2a5a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a5b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2a5c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2a5d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a5e0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
2a5f0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2a600 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34  ur->idx, pNext-4
2a610 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70  , szNext+4, temp
2a620 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Cell, 0);.    }.
2a630 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2a650 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
2a660 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20  flowCell(pPage, 
2a670 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f  pCur->idx), pgno
2a680 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63  Child);.      rc
2a690 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2a6a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2a6b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a6c0 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43  K ){.      dropC
2a6d0 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
2a6e0 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20  e, leafCur.idx, 
2a6f0 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72  szNext);.      r
2a700 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66  c = balance(leaf
2a710 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20  Cur.pPage, 0);. 
2a720 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
2a730 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20  ree(tempCell);. 
2a740 20 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75     releaseTempCu
2a750 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a  rsor(&leafCur);.
2a760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41    }else{.    TRA
2a770 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
2a780 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f  le=%d delete fro
2a790 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
2a7a0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2a7b0 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2a7c0 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  ));.    dropCell
2a7d0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2a7e0 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2a7f0 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2a800 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2a810 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  pPage, 0);.  }. 
2a820 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a830 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  OK ){.    moveTo
2a840 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Root(pCur);.  }.
2a850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a860 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
2a870 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20  ew BTree table. 
2a880 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54   Write into *piT
2a890 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a  able the page.**
2a8a0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2a8b0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2a8c0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   new table..**.*
2a8d0 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79  * The type of ty
2a8e0 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  pe is determined
2a8f0 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61   by the flags pa
2a900 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74  rameter.  Only t
2a910 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
2a920 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20  values of flags 
2a930 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
2a940 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c   use.  Other val
2a950 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73  ues for.** flags
2a960 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a   might not work:
2a970 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  .**.**     BTREE
2a980 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45  _INTKEY|BTREE_LE
2a990 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20  AFDATA     Used 
2a9a0 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77  for SQL tables w
2a9b0 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a  ith rowid keys.*
2a9c0 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f  *     BTREE_ZERO
2a9d0 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20  DATA            
2a9e0 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53        Used for S
2a9f0 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e  QL indices.*/.in
2aa00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
2aa10 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
2aa20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
2aa30 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2aa40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2aa50 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
2aa60 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f  e *pRoot;.  Pgno
2aa70 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74   pgnoRoot;.  int
2aa80 20 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e   rc;.  if( pBt->
2aa90 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2aaa0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2aab0 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2aac0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  a transaction fi
2aad0 72 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  rst */.    retur
2aae0 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
2aaf0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2ab00 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2ab10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ab20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2ab30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  ;..  /* It is il
2ab40 6c 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65 20  legal to create 
2ab50 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
2ab60 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
2ab70 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
2ab80 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
2ab90 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
2aba0 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
2abb0 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
2abc0 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64 61  eed to move a da
2abd0 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d  tabase page to m
2abe0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2abf0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e 0a   new root-page..
2ac00 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e 20    ** If an open 
2ac10 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
2ac20 20 74 68 65 20 70 61 67 65 20 61 20 70 72 6f 62   the page a prob
2ac30 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  lem would occur.
2ac40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2ac50 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
2ac60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2ac70 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  CKED;.  }..#ifde
2ac80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2ac90 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
2aca0 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  allocatePage(pBt
2acb0 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
2acc0 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66  oot, 1, 0);.  if
2acd0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ace0 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  ;.#else.  if( pB
2acf0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2ad00 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
2ad10 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
2ad20 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
2ad30 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2ad40 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
2ad50 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2ad60 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
2ad70 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
2ad80 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
2ad90 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
2ada0 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
2adb0 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
2adc0 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
2add0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
2ade0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
2adf0 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
2ae00 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
2ae10 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2ae20 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
2ae30 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
2ae40 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
2ae50 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
2ae60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ae70 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2ae80 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
2ae90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2aea0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2aeb0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2aec0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
2aed0 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
2aee0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
2aef0 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
2af00 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
2af10 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
2af20 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2af30 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d    if( pgnoRoot==
2af40 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2af50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 70  t->usableSize, p
2af60 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
2af70 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
2af80 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2af90 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
2afa0 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
2afb0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2afc0 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
2afd0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
2afe0 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
2aff0 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
2b000 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
2b010 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
2b020 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
2b030 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
2b040 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
2b050 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
2b060 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
2b070 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
2b080 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
2b090 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26  ocatePage(pBt, &
2b0a0 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f  pPageMove, &pgno
2b0b0 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  Move, pgnoRoot, 
2b0c0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
2b0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b0e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b0f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e    }..    if( pgn
2b100 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20  oMove!=pgnoRoot 
2b110 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
2b120 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50  e;.      Pgno iP
2b130 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72  trPage;..      r
2b140 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2b150 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72 63 20  Move);.      rc 
2b160 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 70  = getPage(pBt, p
2b170 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 29  gnoRoot, &pRoot)
2b180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2b190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b1a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2b1c0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
2b1d0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
2b1e0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
2b1f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2b200 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65  LITE_OK || eType
2b210 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
2b220 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
2b230 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
2b240 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2b250 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2b260 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b270 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2b280 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
2b290 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
2b2a0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2b2b0 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
2b2c0 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
2b2d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
2b2e0 69 74 65 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61  ite(pRoot->aData
2b2f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2b300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b310 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b320 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2b330 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b340 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2b350 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2b360 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20  , pRoot, eType, 
2b370 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f  iPtrPage, pgnoMo
2b380 76 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ve);.      relea
2b390 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2b3a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b3b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b3c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b3d0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2b3e0 67 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  getPage(pBt, pgn
2b3f0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 29 3b 0a  oRoot, &pRoot);.
2b400 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2b410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b420 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b430 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2b440 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
2b450 69 74 65 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61  ite(pRoot->aData
2b460 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2b470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b480 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b490 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2b4a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b4b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2b4c0 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50        pRoot = pP
2b4d0 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a  ageMove;.    } .
2b4e0 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
2b4f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61  he pointer-map a
2b500 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74  nd meta-data wit
2b510 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  h the new root-p
2b520 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20  age number. */. 
2b530 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2b540 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
2b550 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
2b560 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2b570 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2b580 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2b590 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b5a0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
2b5b0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
2b5c0 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52  Meta(p, 4, pgnoR
2b5d0 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
2b5e0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2b5f0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2b600 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b610 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
2b620 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2b630 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
2b640 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
2b650 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2b660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2b670 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
2b680 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
2b690 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
2b6a0 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 7a 65 72  >aData) );.  zer
2b6b0 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61  oPage(pRoot, fla
2b6c0 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  gs | PTF_LEAF);.
2b6d0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
2b6e0 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 61 44 61 74  nref(pRoot->aDat
2b6f0 61 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  a);.  *piTable =
2b700 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
2b710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b720 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  OK;.}../*.** Era
2b730 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
2b740 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
2b750 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
2b760 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
2b770 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
2b780 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
2b790 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
2b7a0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2b7b0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2b7c0 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
2b7d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2b7e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
2b7f0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
2b800 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2b810 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d   to clear */.  M
2b820 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2b830 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
2b840 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  age.  NULL for t
2b850 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74  he root */.  int
2b860 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20   freePageFlag   
2b870 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
2b880 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
2b890 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2b8a0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
2b8b0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2b8c0 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2b8d0 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  t i;..  if( pgno
2b8e0 3e 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61  >sqlite3pager_pa
2b8f0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
2b900 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
2b910 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2b920 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72  T_BKPT;.  }..  r
2b930 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2b940 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70  ge(pBt, pgno, &p
2b950 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a  Page, pParent);.
2b960 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2b970 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2b980 65 5f 6f 75 74 3b 0a 20 20 72 63 20 3d 20 73 71  e_out;.  rc = sq
2b990 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2b9a0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
2b9b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2b9c0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2b9d0 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30  e_out;.  for(i=0
2b9e0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2b9f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c  ; i++){.    pCel
2ba00 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2ba10 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ge, i);.    if( 
2ba20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2ba30 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72        rc = clear
2ba40 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2ba50 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
2ba60 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ), pPage->pParen
2ba70 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
2ba80 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2ba90 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2baa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2bab0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2bac0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
2bad0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2bae0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2baf0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  t;.  }.  if( !pP
2bb00 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2bb10 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2bb20 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
2bb30 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2bb40 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e  ata[8]), pPage->
2bb50 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20  pParent, 1);.   
2bb60 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2bb70 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2bb80 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2bb90 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a  freePageFlag ){.
2bba0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2bbb0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
2bbc0 65 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  e{.    zeroPage(
2bbd0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
2bbe0 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
2bbf0 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61  F);.  }..clearda
2bc00 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a  tabasepage_out:.
2bc10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2bc20 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
2bc30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2bc40 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  te all informati
2bc50 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  on from a single
2bc60 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
2bc70 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20  tabase.  iTable 
2bc80 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  is.** the page n
2bc90 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
2bca0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
2bcb0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
2bcc0 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20  ine returns,.** 
2bcd0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2bce0 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c   empty, but stil
2bcf0 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  l exists..**.** 
2bd00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2bd10 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2bd20 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2bd30 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2bd40 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ** read cursors 
2bd50 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f  on the table.  O
2bd60 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
2bd70 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
2bd80 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68  he.** root of th
2bd90 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  e table..*/.int 
2bda0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2bdb0 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  rTable(Btree *p,
2bdc0 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
2bdd0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
2bde0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68  or *pCur;.  BtSh
2bdf0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2be00 42 74 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  Bt;.  if( p->inT
2be10 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2be20 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
2be30 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2be40 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2be50 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2be60 20 20 7d 0a 20 20 66 6f 72 28 70 43 75 72 3d 70    }.  for(pCur=p
2be70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
2be80 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
2be90 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
2bea0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  ur->pgnoRoot==(P
2beb0 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
2bec0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
2bed0 46 6c 61 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  Flag==0 ) return
2bee0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2bef0 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74        moveToRoot
2bf00 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2bf10 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61  }.  rc = clearDa
2bf20 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2bf30 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
2bf40 20 30 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 28   0);.#if 0.  if(
2bf50 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
2bf60 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
2bf70 70 42 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pBt);.  }.#endif
2bf80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bf90 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
2bfa0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
2bfb0 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20  a table and add 
2bfc0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2bfd0 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20  table to.** the 
2bfe0 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70  freelist.  Excep
2bff0 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  t, the root of t
2c000 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62  he principle tab
2c010 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a  le (the one on.*
2c020 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76  * page 1) is nev
2c030 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  er added to the 
2c040 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
2c050 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2c060 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2c070 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2c080 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2c090 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ** cursors on th
2c0a0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
2c0b0 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
2c0c0 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  enabled and the 
2c0d0 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69  page at iTable i
2c0e0 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a  s not the last.*
2c0f0 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  * root page in t
2c100 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c110 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
2c120 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e  root page .** in
2c130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c140 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f  le is moved into
2c150 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72   the slot former
2c160 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a  ly occupied by.*
2c170 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61  * iTable and tha
2c180 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d  t last slot form
2c190 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
2c1a0 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2c1b0 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  age.** is added 
2c1c0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
2c1d0 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c  instead of iTabl
2c1e0 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c  e.  In this say,
2c1f0 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   all.** root pag
2c200 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74  es are kept at t
2c210 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2c220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c230 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e  e, which.** is n
2c240 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54  ecessary for AUT
2c250 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20  OVACUUM to work 
2c260 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64  right.  *piMoved
2c270 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a   is set to the .
2c280 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ** page number t
2c290 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74  hat used to be t
2c2a0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2c2b0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65  e in the file be
2c2c0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65  fore.** the move
2c2d0 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65  .  If no page ge
2c2e0 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76  ts moved, *piMov
2c2f0 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ed is set to 0..
2c300 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74  ** The last root
2c310 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65   page is recorde
2c320 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64  d in meta[3] and
2c330 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
2c340 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61   meta[3] is upda
2c350 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ted by this proc
2c360 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edure..*/.int sq
2c370 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2c380 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2c390 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
2c3a0 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
2c3b0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2c3c0 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  age = 0;.  BtSha
2c3d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2c3e0 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  t;..  if( p->inT
2c3f0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2c400 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
2c410 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2c420 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2c430 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2c440 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
2c450 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20  illegal to drop 
2c460 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
2c470 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
2c480 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
2c490 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
2c4a0 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
2c4b0 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
2c4c0 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
2c4d0 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74  eed to move anot
2c4e0 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  her root-page to
2c4f0 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74   fill a gap left
2c500 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a   by the deleted.
2c510 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20    ** root page. 
2c520 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  If an open curso
2c530 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73  r was using this
2c540 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20   page a problem 
2c550 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75  would .  ** occu
2c560 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
2c570 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  t->pCursor ){.  
2c580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c590 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72  LOCKED;.  }..  r
2c5a0 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
2c5b0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
2c5c0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
2c5d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2c5e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c5f0 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69  eClearTable(p, i
2c600 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  Table);.  if( rc
2c610 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
2c620 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2c630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2c640 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
2c650 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
2c660 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2c670 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2c680 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2c690 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2c6a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2c6b0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
2c6c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2c6d0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
2c6e0 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2c6f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c700 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2c710 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
2c720 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c740 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c750 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2c760 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2c770 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
2c780 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
2c790 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2c7a0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
2c7b0 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
2c7c0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
2c7d0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2c7e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2c7f0 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
2c800 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
2c810 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
2c820 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
2c830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
2c840 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2c850 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2c860 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2c870 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2c880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c890 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c8a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c8b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c8c0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
2c8d0 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
2c8e0 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
2c8f0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2c900 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2c910 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c920 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
2c930 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
2c940 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
2c950 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
2c960 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
2c970 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
2c980 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2c990 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
2c9a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2c9b0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
2c9c0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61   getPage(pBt, ma
2c9d0 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2c9e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2c9f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ca00 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2ca10 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2ca20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
2ca30 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
2ca40 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Move, PTRMAP_ROO
2ca50 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65  TPAGE, 0, iTable
2ca60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2ca70 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
2ca80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2ca90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2caa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2cab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cac0 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
2cad0 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
2cae0 2c 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  , &pMove);.     
2caf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cb00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cb10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cb20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2cb30 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f  c = freePage(pMo
2cb40 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ve);.        rel
2cb50 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
2cb60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2cb70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cb80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2cb90 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2cba0 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20       *piMoved = 
2cbb0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
2cbc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
2cbd0 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d  et the new 'max-
2cbe0 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65  root-page' value
2cbf0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cc00 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20   header. This.  
2cc10 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c      ** is the ol
2cc20 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65  d value less one
2cc30 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20  , less one more 
2cc40 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20  if that happens 
2cc50 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61  to.      ** be a
2cc60 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
2cc70 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69  r, less one agai
2cc80 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65  n if that is the
2cc90 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  .      ** PENDIN
2cca0 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20  G_BYTE_PAGE..   
2ccb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52     */.      maxR
2ccc0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2ccd0 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
2cce0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2ccf0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2cd00 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2cd10 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
2cd20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
2cd30 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
2cd40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c  pBt->usableSize,
2cd50 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b   maxRootPgno) ){
2cd60 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
2cd70 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
2cd80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
2cd90 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49  xRootPgno!=PENDI
2cda0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2cdb0 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) );..      rc =
2cdc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2cdd0 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61  ateMeta(p, 4, ma
2cde0 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
2cdf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2ce00 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2ce10 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2ce20 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2ce30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
2ce40 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c  e{.    /* If sql
2ce50 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2ce60 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e  le was called on
2ce70 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20   page 1. */.    
2ce80 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2ce90 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2cea0 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  EAF );.    relea
2ceb0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2cec0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
2ced0 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   .}.../*.** Read
2cee0 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
2cef0 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
2cf00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
2cf10 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
2cf20 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
2cf30 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
2cf40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2cf50 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
2cf60 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
2cf70 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
2cf80 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
2cf90 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
2cfa0 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
2cfb0 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
2cfc0 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
2cfd0 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
2cfe0 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
2cff0 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
2d000 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
2d010 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
2d020 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
2d030 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
2d040 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
2d050 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
2d060 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
2d070 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
2d080 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2d090 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
2d0a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
2d0b0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
2d0c0 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
2d0d0 61 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  a){.  int rc;.  
2d0e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2d0f0 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  P1;.  BtShared *
2d100 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2d110 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65   /* Reading a me
2d120 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65  ta-data value re
2d130 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
2d140 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e  ck on page 1 (an
2d150 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65  d hence.  ** the
2d160 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2d170 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68  able. We grab th
2d180 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65  is lock regardle
2d190 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2d1a0 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51  .  ** not the SQ
2d1b0 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2d1c0 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
2d1d0 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74   (the table root
2d1e0 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20  ed at page.  ** 
2d1f0 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  1 is treated as 
2d200 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62  a special case b
2d210 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  y queryTableLock
2d220 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65  () and lockTable
2d230 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ())..  */.  rc =
2d240 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2d250 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2d260 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2d270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2d280 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  urn rc;.  }..  a
2d290 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
2d2a0 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63   idx<=15 );.  rc
2d2b0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
2d2c0 67 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  get(pBt->pPager,
2d2d0 20 31 2c 20 28 76 6f 69 64 2a 2a 29 26 70 50 31   1, (void**)&pP1
2d2e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2d2f0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4d 65 74  turn rc;.  *pMet
2d300 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  a = get4byte(&pP
2d310 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a  1[36 + idx*4]);.
2d320 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
2d330 6e 72 65 66 28 70 50 31 29 3b 0a 0a 20 20 2f 2a  nref(pP1);..  /*
2d340 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64   If autovacuumed
2d350 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
2d360 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77  this build but w
2d370 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
2d380 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20  .  ** access an 
2d390 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74  autovacuumed dat
2d3a0 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65  abase, then make
2d3b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
2d3c0 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69  adonly. .  */.#i
2d3d0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2d3e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
2d3f0 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65  ( idx==4 && *pMe
2d400 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64  ta>0 ) pBt->read
2d410 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  Only = 1;.#endif
2d420 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
2d430 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
2d440 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c  e 1. */.  rc = l
2d450 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52  ockTable(p, 1, R
2d460 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74  EAD_LOCK);.  ret
2d470 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d480 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f   Write meta-info
2d490 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74  rmation back int
2d4a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
2d4b0 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72   Meta[0] is.** r
2d4c0 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79  ead-only and may
2d4d0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e   not be written.
2d4e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2d4f0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 42  treeUpdateMeta(B
2d500 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  tree *p, int idx
2d510 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20  , u32 iMeta){.  
2d520 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2d530 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
2d540 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20  ed char *pP1;.  
2d550 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
2d560 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c  ( idx>=1 && idx<
2d570 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  =15 );.  if( p->
2d580 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2d590 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2d5a0 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2d5b0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2d5c0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2d5d0 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2d5e0 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
2d5f0 29 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  );.  pP1 = pBt->
2d600 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
2d610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2d620 65 72 5f 77 72 69 74 65 28 70 50 31 29 3b 0a 20  er_write(pP1);. 
2d630 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d640 20 72 63 3b 0a 20 20 70 75 74 34 62 79 74 65 28   rc;.  put4byte(
2d650 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2d660 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72 65 74 75  , iMeta);.  retu
2d670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d680 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2d690 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74  e flag byte at t
2d6a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2d6b0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
2d6c0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63  e cursor.** is c
2d6d0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2d6e0 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  g to..*/.int sql
2d6f0 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42  ite3BtreeFlags(B
2d700 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2d710 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2d720 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51  about CURSOR_REQ
2d730 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20  UIRESEEK state? 
2d740 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f  Probably need to
2d750 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f   call.  ** resto
2d760 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2d770 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  () here..  */.  
2d780 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2d790 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2d7a0 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70  return pPage ? p
2d7b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2d7c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20  e->hdrOffset] : 
2d7d0 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
2d7e0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2d7f0 50 72 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d  Print a disassem
2d800 62 6c 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e  bly of the given
2d810 20 70 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72   page on standar
2d820 64 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20  d output.  This 
2d830 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75 73  routine.** is us
2d840 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
2d850 20 61 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e 6c   and testing onl
2d860 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2d870 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 42   btreePageDump(B
2d880 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
2d890 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75  t pgno, int recu
2d8a0 72 73 69 76 65 2c 20 4d 65 6d 50 61 67 65 20 2a  rsive, MemPage *
2d8b0 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20  pParent){.  int 
2d8c0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
2d8d0 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Page;.  int i, j
2d8e0 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65  , c;.  int nFree
2d8f0 3b 0a 20 20 75 31 36 20 69 64 78 3b 0a 20 20 69  ;.  u16 idx;.  i
2d900 6e 74 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e 43  nt hdr;.  int nC
2d910 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  ell;.  int isIni
2d920 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2d930 61 72 20 2a 64 61 74 61 3b 0a 20 20 63 68 61 72  ar *data;.  char
2d940 20 72 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75 6e   range[20];.  un
2d950 73 69 67 6e 65 64 20 63 68 61 72 20 70 61 79 6c  signed char payl
2d960 6f 61 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20 3d  oad[20];..  rc =
2d970 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50   getPage(pBt, (P
2d980 67 6e 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67 65  gno)pgno, &pPage
2d990 29 3b 0a 20 20 69 73 49 6e 69 74 20 3d 20 70 50  );.  isInit = pP
2d9a0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 69  age->isInit;.  i
2d9b0 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
2d9c0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 69 74 50  ==0 ){.    initP
2d9d0 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65  age(pPage, pPare
2d9e0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  nt);.  }.  if( r
2d9f0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2da00 72 63 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20  rc;.  }.  hdr = 
2da10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2da20 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2da30 2d 3e 61 44 61 74 61 3b 0a 20 20 63 20 3d 20 64  ->aData;.  c = d
2da40 61 74 61 5b 68 64 72 5d 3b 0a 20 20 70 50 61 67  ata[hdr];.  pPag
2da50 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 63 20 26  e->intKey = (c &
2da60 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46   (PTF_INTKEY|PTF
2da70 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a  _LEAFDATA))!=0;.
2da80 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74    pPage->zeroDat
2da90 61 20 3d 20 28 63 20 26 20 50 54 46 5f 5a 45 52  a = (c & PTF_ZER
2daa0 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61  ODATA)!=0;.  pPa
2dab0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 28  ge->leafData = (
2dac0 63 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41  c & PTF_LEAFDATA
2dad0 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  )!=0;.  pPage->l
2dae0 65 61 66 20 3d 20 28 63 20 26 20 50 54 46 5f 4c  eaf = (c & PTF_L
2daf0 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
2db00 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70 50  ->hasData = !(pP
2db10 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c  age->zeroData ||
2db20 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26   (!pPage->leaf &
2db30 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  & pPage->leafDat
2db40 61 29 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67  a));.  nCell = g
2db50 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2db60 72 2b 33 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  r+3]);.  sqlite3
2db70 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47  DebugPrintf("PAG
2db80 45 20 25 64 3a 20 20 66 6c 61 67 73 3d 30 78 25  E %d:  flags=0x%
2db90 30 32 78 20 20 66 72 61 67 3d 25 64 20 20 20 70  02x  frag=%d   p
2dba0 61 72 65 6e 74 3d 25 64 5c 6e 22 2c 20 70 67 6e  arent=%d\n", pgn
2dbb0 6f 2c 0a 20 20 20 20 64 61 74 61 5b 68 64 72 5d  o,.    data[hdr]
2dbc0 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 0a  , data[hdr+7], .
2dbd0 20 20 20 20 28 70 50 61 67 65 2d 3e 69 73 49 6e      (pPage->isIn
2dbe0 69 74 20 26 26 20 70 50 61 67 65 2d 3e 70 50 61  it && pPage->pPa
2dbf0 72 65 6e 74 29 20 3f 20 70 50 61 67 65 2d 3e 70  rent) ? pPage->p
2dc00 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30  Parent->pgno : 0
2dc10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64 72  );.  assert( hdr
2dc20 20 3d 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f 20 31   == (pgno==1 ? 1
2dc30 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 69 64 78  00 : 0) );.  idx
2dc40 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 70 50   = hdr + 12 - pP
2dc50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 66  age->leaf*4;.  f
2dc60 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
2dc70 20 69 2b 2b 29 7b 0a 20 20 20 20 43 65 6c 6c 49   i++){.    CellI
2dc80 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 50 67  nfo info;.    Pg
2dc90 6e 6f 20 63 68 69 6c 64 3b 0a 20 20 20 20 75 6e  no child;.    un
2dca0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2dcb0 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ll;.    int sz;.
2dcc0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
2dcd0 20 20 20 61 64 64 72 20 3d 20 67 65 74 32 62 79     addr = get2by
2dce0 74 65 28 26 64 61 74 61 5b 69 64 78 20 2b 20 32  te(&data[idx + 2
2dcf0 2a 69 5d 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  *i]);.    pCell 
2dd00 3d 20 26 64 61 74 61 5b 61 64 64 72 5d 3b 0a 20  = &data[addr];. 
2dd10 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
2dd20 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
2dd30 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
2dd40 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 73  nfo.nSize;.    s
2dd50 70 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64  printf(range,"%d
2dd60 2e 2e 25 64 22 2c 20 61 64 64 72 2c 20 61 64 64  ..%d", addr, add
2dd70 72 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66 28  r+sz-1);.    if(
2dd80 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2dd90 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 30 3b        child = 0;
2dda0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ddb0 20 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79    child = get4by
2ddc0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d  te(pCell);.    }
2ddd0 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e  .    sz = info.n
2dde0 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70  Data;.    if( !p
2ddf0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73  Page->intKey ) s
2de00 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  z += info.nKey;.
2de10 20 20 20 20 69 66 28 20 73 7a 3e 73 69 7a 65 6f      if( sz>sizeo
2de20 66 28 70 61 79 6c 6f 61 64 29 2d 31 20 29 20 73  f(payload)-1 ) s
2de30 7a 20 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c 6f  z = sizeof(paylo
2de40 61 64 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ad)-1;.    memcp
2de50 79 28 70 61 79 6c 6f 61 64 2c 20 26 70 43 65 6c  y(payload, &pCel
2de60 6c 5b 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d 2c  l[info.nHeader],
2de70 20 73 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   sz);.    for(j=
2de80 30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20  0; j<sz; j++){. 
2de90 20 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64       if( payload
2dea0 5b 6a 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79 6c  [j]<0x20 || payl
2deb0 6f 61 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70 61  oad[j]>0x7f ) pa
2dec0 79 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a  yload[j] = '.';.
2ded0 20 20 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f 61      }.    payloa
2dee0 64 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 73  d[sz] = 0;.    s
2def0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2df00 66 28 0a 20 20 20 20 20 20 22 63 65 6c 6c 20 25  f(.      "cell %
2df10 32 64 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c 64  2d: i=%-10s chld
2df20 3d 25 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20  =%-4d nk=%-4lld 
2df30 6e 64 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64 3d  nd=%-4d payload=
2df40 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c 20  %s\n",.      i, 
2df50 72 61 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69 6e  range, child, in
2df60 66 6f 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44  fo.nKey, info.nD
2df70 61 74 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20 20  ata, payload.   
2df80 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   );.  }.  if( !p
2df90 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2dfa0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2dfb0 69 6e 74 66 28 22 72 69 67 68 74 5f 63 68 69 6c  intf("right_chil
2dfc0 64 3a 20 25 64 5c 6e 22 2c 20 67 65 74 34 62 79  d: %d\n", get4by
2dfd0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29  te(&data[hdr+8])
2dfe0 29 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d  );.  }.  nFree =
2dff0 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69   0;.  i = 0;.  i
2e000 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  dx = get2byte(&d
2e010 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77  ata[hdr+1]);.  w
2e020 68 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69  hile( idx>0 && i
2e030 64 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  dx<pPage->pBt->u
2e040 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
2e050 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79   int sz = get2by
2e060 74 65 28 26 64 61 74 61 5b 69 64 78 2b 32 5d 29  te(&data[idx+2])
2e070 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 72 61  ;.    sprintf(ra
2e080 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20 69 64  nge,"%d..%d", id
2e090 78 2c 20 69 64 78 2b 73 7a 2d 31 29 3b 0a 20 20  x, idx+sz-1);.  
2e0a0 20 20 6e 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20    nFree += sz;. 
2e0b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2e0c0 72 69 6e 74 66 28 22 66 72 65 65 62 6c 6f 63 6b  rintf("freeblock
2e0d0 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 73 69   %2d: i=%-10s si
2e0e0 7a 65 3d 25 2d 34 64 20 74 6f 74 61 6c 3d 25 64  ze=%-4d total=%d
2e0f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 20 72  \n",.       i, r
2e100 61 6e 67 65 2c 20 73 7a 2c 20 6e 46 72 65 65 29  ange, sz, nFree)
2e110 3b 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74 32  ;.    idx = get2
2e120 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 29  byte(&data[idx])
2e130 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  ;.    i++;.  }. 
2e140 20 69 66 28 20 69 64 78 21 3d 30 20 29 7b 0a 20   if( idx!=0 ){. 
2e150 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2e160 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 6e 65  rintf("ERROR: ne
2e170 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 64  xt freeblock ind
2e180 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a  ex out of range:
2e190 20 25 64 5c 6e 22 2c 20 69 64 78 29 3b 0a 20 20   %d\n", idx);.  
2e1a0 7d 0a 20 20 69 66 28 20 72 65 63 75 72 73 69 76  }.  if( recursiv
2e1b0 65 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  e && !pPage->lea
2e1c0 66 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  f ){.    for(i=0
2e1d0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
2e1e0 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
2e1f0 63 68 61 72 20 2a 70 43 65 6c 6c 20 3d 20 66 69  char *pCell = fi
2e200 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
2e210 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 67  ;.      btreePag
2e220 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62  eDump(pBt, get4b
2e230 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70  yte(pCell), 1, p
2e240 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 64 78  Page);.      idx
2e250 20 3d 20 67 65 74 32 62 79 74 65 28 70 43 65 6c   = get2byte(pCel
2e260 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  l);.    }.    bt
2e270 72 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c  reePageDump(pBt,
2e280 20 67 65 74 34 62 79 74 65 28 26 64 61 74 61 5b   get4byte(&data[
2e290 68 64 72 2b 38 5d 29 2c 20 31 2c 20 70 50 61 67  hdr+8]), 1, pPag
2e2a0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
2e2b0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
2e2c0 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
2e2d0 5f 75 6e 72 65 66 28 64 61 74 61 29 3b 0a 20 20  _unref(data);.  
2e2e0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
2e2f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e300 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
2e310 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28 42  3BtreePageDump(B
2e320 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 67 6e  tree *p, int pgn
2e330 6f 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76 65  o, int recursive
2e340 29 7b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  ){.  return btre
2e350 65 50 61 67 65 44 75 6d 70 28 70 2d 3e 70 42 74  ePageDump(p->pBt
2e360 2c 20 70 67 6e 6f 2c 20 72 65 63 75 72 73 69 76  , pgno, recursiv
2e370 65 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  e, 0);.}.#endif.
2e380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2e390 45 53 54 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61  EST./*.** Fill a
2e3a0 52 65 73 75 6c 74 5b 5d 20 77 69 74 68 20 69 6e  Result[] with in
2e3b0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2e3c0 74 68 65 20 65 6e 74 72 79 20 61 6e 64 20 70 61  the entry and pa
2e3d0 67 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 63  ge that the.** c
2e3e0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2e3f0 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61  g to..** .**   a
2e400 52 65 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65  Result[0] =  The
2e410 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   page number.** 
2e420 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20    aResult[1] =  
2e430 54 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  The entry number
2e440 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 32 5d  .**   aResult[2]
2e450 20 3d 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   =  Total number
2e460 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74   of entries on t
2e470 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  his page.**   aR
2e480 65 73 75 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c  esult[3] =  Cell
2e490 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79   size (local pay
2e4a0 6c 6f 61 64 20 2b 20 68 65 61 64 65 72 29 0a 2a  load + header).*
2e4b0 2a 20 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d  *   aResult[4] =
2e4c0 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
2e4d0 20 62 79 74 65 73 20 6f 6e 20 74 68 69 73 20 70   bytes on this p
2e4e0 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
2e4f0 5b 35 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66  [5] =  Number of
2e500 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20   free blocks on 
2e510 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  the page.**   aR
2e520 65 73 75 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61  esult[6] =  Tota
2e530 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 28  l payload size (
2e540 6c 6f 63 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77  local + overflow
2e550 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 37  ).**   aResult[7
2e560 5d 20 3d 20 20 48 65 61 64 65 72 20 73 69 7a 65  ] =  Header size
2e570 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 61   in bytes.**   a
2e580 52 65 73 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63  Result[8] =  Loc
2e590 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a  al payload size.
2e5a0 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20  **   aResult[9] 
2e5b0 3d 20 20 50 61 72 65 6e 74 20 70 61 67 65 20 6e  =  Parent page n
2e5c0 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73  umber.**.** This
2e5d0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2e5e0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
2e5f0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
2e600 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2e610 74 72 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 42  treeCursorInfo(B
2e620 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2e630 6e 74 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e 74  nt *aResult, int
2e640 20 75 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20 63   upCnt){.  int c
2e650 6e 74 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  nt, idx;.  MemPa
2e660 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2e670 2d 3e 70 50 61 67 65 3b 0a 20 20 42 74 43 75 72  ->pPage;.  BtCur
2e680 73 6f 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20 69  sor tmpCur;..  i
2e690 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  nt rc = restoreC
2e6a0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2e6b0 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
2e6c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e6d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e6e0 7d 0a 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69  }..  pageIntegri
2e6f0 74 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73  ty(pPage);.  ass
2e700 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2e710 69 74 20 29 3b 0a 20 20 67 65 74 54 65 6d 70 43  it );.  getTempC
2e720 75 72 73 6f 72 28 70 43 75 72 2c 20 26 74 6d 70  ursor(pCur, &tmp
2e730 43 75 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 75  Cur);.  while( u
2e740 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f  pCnt-- ){.    mo
2e750 76 65 54 6f 50 61 72 65 6e 74 28 26 74 6d 70 43  veToParent(&tmpC
2e760 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ur);.  }.  pPage
2e770 20 3d 20 74 6d 70 43 75 72 2e 70 50 61 67 65 3b   = tmpCur.pPage;
2e780 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
2e790 28 70 50 61 67 65 29 3b 0a 20 20 61 52 65 73 75  (pPage);.  aResu
2e7a0 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 70  lt[0] = sqlite3p
2e7b0 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
2e7c0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
2e7d0 20 61 73 73 65 72 74 28 20 61 52 65 73 75 6c 74   assert( aResult
2e7e0 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  [0]==pPage->pgno
2e7f0 20 29 3b 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d   );.  aResult[1]
2e800 20 3d 20 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20   = tmpCur.idx;. 
2e810 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50   aResult[2] = pP
2e820 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  age->nCell;.  if
2e830 28 20 74 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20  ( tmpCur.idx>=0 
2e840 26 26 20 74 6d 70 43 75 72 2e 69 64 78 3c 70 50  && tmpCur.idx<pP
2e850 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2e860 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74    getCellInfo(&t
2e870 6d 70 43 75 72 29 3b 0a 20 20 20 20 61 52 65 73  mpCur);.    aRes
2e880 75 6c 74 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e  ult[3] = tmpCur.
2e890 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20  info.nSize;.    
2e8a0 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70  aResult[6] = tmp
2e8b0 43 75 72 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  Cur.info.nData;.
2e8c0 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d      aResult[7] =
2e8d0 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65   tmpCur.info.nHe
2e8e0 61 64 65 72 3b 0a 20 20 20 20 61 52 65 73 75 6c  ader;.    aResul
2e8f0 74 5b 38 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e  t[8] = tmpCur.in
2e900 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  fo.nLocal;.  }el
2e910 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  se{.    aResult[
2e920 33 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73  3] = 0;.    aRes
2e930 75 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[6] = 0;.    
2e940 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a  aResult[7] = 0;.
2e950 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d      aResult[8] =
2e960 20 30 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c   0;.  }.  aResul
2e970 74 5b 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46  t[4] = pPage->nF
2e980 72 65 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a  ree;.  cnt = 0;.
2e990 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
2e9a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2e9b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2e9c0 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  1]);.  while( id
2e9d0 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  x>0 && idx<pPage
2e9e0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2e9f0 65 20 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a  e ){.    cnt++;.
2ea00 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62 79      idx = get2by
2ea10 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2ea20 5b 69 64 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52  [idx]);.  }.  aR
2ea30 65 73 75 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a  esult[5] = cnt;.
2ea40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
2ea50 72 65 6e 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f  rent==0 || isRoo
2ea60 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
2ea70 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d      aResult[9] =
2ea80 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2ea90 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50   aResult[9] = pP
2eaa0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
2eab0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  no;.  }.  releas
2eac0 65 54 65 6d 70 43 75 72 73 6f 72 28 26 74 6d 70  eTempCursor(&tmp
2ead0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Cur);.  return S
2eae0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
2eaf0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2eb00 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
2eb10 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
2eb20 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
2eb30 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
2eb40 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
2eb50 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
2eb60 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
2eb70 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
2eb80 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
2eb90 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
2eba0 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63  /*.** This struc
2ebb0 74 75 72 65 20 69 73 20 70 61 73 73 65 64 20 61  ture is passed a
2ebc0 72 6f 75 6e 64 20 74 68 72 6f 75 67 68 20 61 6c  round through al
2ebd0 6c 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  l the sanity che
2ebe0 63 6b 69 6e 67 20 72 6f 75 74 69 6e 65 73 0a 2a  cking routines.*
2ebf0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  * in order to ke
2ec00 65 70 20 74 72 61 63 6b 20 6f 66 20 73 6f 6d 65  ep track of some
2ec10 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 69 6e   global state in
2ec20 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  formation..*/.ty
2ec30 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 74  pedef struct Int
2ec40 65 67 72 69 74 79 43 6b 20 49 6e 74 65 67 72 69  egrityCk Integri
2ec50 74 79 43 6b 3b 0a 73 74 72 75 63 74 20 49 6e 74  tyCk;.struct Int
2ec60 65 67 72 69 74 79 43 6b 20 7b 0a 20 20 42 74 53  egrityCk {.  BtS
2ec70 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 2f  hared *pBt;    /
2ec80 2a 20 54 68 65 20 74 72 65 65 20 62 65 69 6e 67  * The tree being
2ec90 20 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f 0a   checked out */.
2eca0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
2ecb0 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74   /* The associat
2ecc0 65 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20  ed pager.  Also 
2ecd0 61 63 63 65 73 73 69 62 6c 65 20 62 79 20 70 42  accessible by pB
2ece0 74 2d 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20 69  t->pPager */.  i
2ecf0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 2f 2a  nt nPage;     /*
2ed00 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2ed10 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ed20 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65 66   */.  int *anRef
2ed30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
2ed40 66 20 74 69 6d 65 73 20 65 61 63 68 20 70 61 67  f times each pag
2ed50 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 20  e is referenced 
2ed60 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
2ed70 73 67 3b 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20  sg; /* An error 
2ed80 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20 6f  message.  NULL o
2ed90 66 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65 6e  f no errors seen
2eda0 2e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  . */.};..#ifndef
2edb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2edc0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
2edd0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
2ede0 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
2edf0 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
2ee00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ee10 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
2ee20 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
2ee30 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
2ee40 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
2ee50 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
2ee60 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2ee70 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
2ee80 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  2;.  va_start(ap
2ee90 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d  , zFormat);.  zM
2eea0 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  sg2 = sqlite3VMP
2eeb0 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
2eec0 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2eed0 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30  ;.  if( zMsg1==0
2eee0 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20   ) zMsg1 = "";. 
2eef0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72   if( pCheck->zEr
2ef00 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72  rMsg ){.    char
2ef10 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d   *zOld = pCheck-
2ef20 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43  >zErrMsg;.    pC
2ef30 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  heck->zErrMsg = 
2ef40 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
2ef50 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
2ef60 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20  >zErrMsg, zOld, 
2ef70 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  "\n", zMsg1, zMs
2ef80 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
2ef90 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4f     sqliteFree(zO
2efa0 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ld);.  }else{.  
2efb0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
2efc0 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
2efd0 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67  Msg, zMsg1, zMsg
2efe0 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
2eff0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  }.  sqliteFree(z
2f000 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Msg2);.}.#endif 
2f010 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
2f020 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
2f030 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2f040 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
2f050 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
2f060 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
2f070 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
2f080 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
2f090 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
2f0a0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
2f0b0 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
2f0c0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2f0d0 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
2f0e0 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
2f0f0 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
2f100 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
2f110 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
2f120 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
2f130 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
2f140 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2f150 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
2f160 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
2f170 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
2f180 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
2f190 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
2f1a0 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
2f1b0 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65  Check, int iPage
2f1c0 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74  , char *zContext
2f1d0 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  ){.  if( iPage==
2f1e0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2f1f0 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b  if( iPage>pCheck
2f200 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65  ->nPage || iPage
2f210 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  <0 ){.    checkA
2f220 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
2f230 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61   zContext, "inva
2f240 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
2f250 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
2f260 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2f270 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52   if( pCheck->anR
2f280 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a  ef[iPage]==1 ){.
2f290 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
2f2a0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
2f2b0 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65  ext, "2nd refere
2f2c0 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c  nce to page %d",
2f2d0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
2f2e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2f2f0 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e  urn  (pCheck->an
2f300 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b  Ref[iPage]++)>1;
2f310 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2f320 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f330 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  UM./*.** Check t
2f340 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e  hat the entry in
2f350 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f360 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64   for page iChild
2f370 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67   maps to .** pag
2f380 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74  e iParent, point
2f390 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e  er type ptrType.
2f3a0 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20   If not, append 
2f3b0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2f3c0 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a  .** to pCheck..*
2f3d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
2f3e0 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74  eckPtrmap(.  Int
2f3f0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
2f400 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  ,   /* Integrity
2f410 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a   check context *
2f420 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
2f430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2f440 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ild page number 
2f450 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
2f460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2f470 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
2f480 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67  map type */.  Pg
2f490 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20  no iParent,     
2f4a0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
2f4b0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72   pointer map par
2f4c0 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
2f4d0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
2f4e0 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ext         /* C
2f4f0 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69  ontext descripti
2f500 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72  on (used for err
2f510 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20  or msg) */.){.  
2f520 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74  int rc;.  u8 ePt
2f530 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f  rmapType;.  Pgno
2f540 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a   iPtrmapParent;.
2f550 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65  .  rc = ptrmapGe
2f560 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69  t(pCheck->pBt, i
2f570 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54  Child, &ePtrmapT
2f580 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72  ype, &iPtrmapPar
2f590 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
2f5a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f5b0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2f5c0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2f5d0 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61  , "Failed to rea
2f5e0 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22  d ptrmap key=%d"
2f5f0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  , iChild);.    r
2f600 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
2f610 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65  ( ePtrmapType!=e
2f620 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50  Type || iPtrmapP
2f630 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29  arent!=iParent )
2f640 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
2f650 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
2f660 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42  ntext, .      "B
2f670 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79  ad ptr map entry
2f680 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64   key=%d expected
2f690 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64  =(%d,%d) got=(%d
2f6a0 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43  ,%d)", .      iC
2f6b0 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61  hild, eType, iPa
2f6c0 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70  rent, ePtrmapTyp
2f6d0 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  e, iPtrmapParent
2f6e0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
2f6f0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
2f700 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
2f710 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66  e freelist or of
2f720 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2f730 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66  e list..** Verif
2f740 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
2f750 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2f760 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a  e list is N..*/.
2f770 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
2f780 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69  kList(.  Integri
2f790 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
2f7a0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
2f7b0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  king context */.
2f7c0 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74    int isFreeList
2f7d0 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
2f7e0 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20  for a freelist. 
2f7f0 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66   False for overf
2f800 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  low page list */
2f810 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
2f820 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2f830 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73   number for firs
2f840 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  t page in the li
2f850 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  st */.  int N,  
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f870 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
2f880 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2f890 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
2f8a0 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
2f8b0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
2f8c0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
2f8d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
2f8e0 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e  int expected = N
2f8f0 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d  ;.  int iFirst =
2f900 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28   iPage;.  while(
2f910 20 4e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   N-- > 0 ){.    
2f920 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2f930 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 69 50  Ovfl;.    if( iP
2f940 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
2f950 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2f960 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
2f970 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
2f980 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
2f990 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
2f9a0 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
2f9b0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
2f9c0 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
2f9d0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
2f9e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2f9f0 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
2fa00 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
2fa10 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
2fa20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
2fa30 72 5f 67 65 74 28 70 43 68 65 63 6b 2d 3e 70 50  r_get(pCheck->pP
2fa40 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67  ager, (Pgno)iPag
2fa50 65 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66  e, (void**)&pOvf
2fa60 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  l) ){.      chec
2fa70 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2fa80 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61  k, zContext, "fa
2fa90 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65  iled to get page
2faa0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
2fab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2fac0 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c  .    if( isFreeL
2fad0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
2fae0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
2faf0 4f 76 66 6c 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Ovfl[4]);.#ifnde
2fb00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2fb10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
2fb20 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
2fb30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2fb40 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
2fb50 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
2fb60 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
2fb70 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
2fb80 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2fb90 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
2fba0 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
2fbb0 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20  ze/4-8 ){.      
2fbc0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2fbd0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
2fbe0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
2fbf0 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
2fc00 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
2fc10 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
2fc20 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
2fc30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fc40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
2fc50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2fc60 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
2fc70 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
2fc80 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65  [8+i*4]);.#ifnde
2fc90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2fca0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
2fcb0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
2fcc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2fcd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
2fce0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
2fcf0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52  , iFreePage, PTR
2fd00 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
2fd10 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
2fd20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2fd30 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65           checkRe
2fd40 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  f(pCheck, iFreeP
2fd50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
2fd60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fd70 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20    N -= n;.      
2fd80 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
2fd90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2fda0 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b  VACUUM.    else{
2fdb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
2fdc0 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  s database suppo
2fdd0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  rts auto-vacuum 
2fde0 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74  and iPage is not
2fdf0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20   the last.      
2fe00 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
2fe10 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63  overflow list, c
2fe20 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f  heck that the po
2fe30 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
2fe40 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
2fe50 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20   following page 
2fe60 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20  matches iPage.. 
2fe70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2fe80 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
2fe90 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30  utoVacuum && N>0
2fea0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
2feb0 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 29 3b  get4byte(pOvfl);
2fec0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
2fed0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
2fee0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
2fef0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
2ff00 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2ff10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
2ff20 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
2ff30 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vfl);.    sqlite
2ff40 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f 76  3pager_unref(pOv
2ff50 66 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  fl);.  }.}.#endi
2ff60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2ff70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2ff80 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2ff90 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
2ffa0 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44  TY_CHECK./*.** D
2ffb0 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79  o various sanity
2ffc0 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e   checks on a sin
2ffd0 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72  gle page of a tr
2ffe0 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ee.  Return.** t
2fff0 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20  he tree depth.  
30000 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72  Root pages retur
30010 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66  n 0.  Parents of
30020 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72   root pages.** r
30030 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20  eturn 1, and so 
30040 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  forth..** .** Th
30050 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64  ese checks are d
30060 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  one:.**.**      
30070 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  1.  Make sure th
30080 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65  at cells and fre
30090 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f  eblocks do not o
300a0 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20  verlap.**       
300b0 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74     but combine t
300c0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76  o completely cov
300d0 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  er the page..** 
300e0 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75   NO  2.  Make su
300f0 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65  re cell keys are
30100 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e   in order..**  N
30110 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  3.  Make sure
30120 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20   no key is less 
30130 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
30140 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zLowerBound..**
30150 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73    NO  4.  Make s
30160 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72  ure no key is gr
30170 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
30180 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75  ual to zUpperBou
30190 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20  nd..**      5.  
301a0 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
301b0 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ity of overflow 
301c0 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36  pages..**      6
301d0 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  .  Recursively c
301e0 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67  all checkTreePag
301f0 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  e on all childre
30200 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56  n..**      7.  V
30210 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
30220 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c  epth of all chil
30230 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65  dren is the same
30240 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61  ..**      8.  Ma
30250 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67  ke sure this pag
30260 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33  e is at least 33
30270 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69  % full or else i
30280 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  t is.**         
30290 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
302a0 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
302b0 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61   int checkTreePa
302c0 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ge(.  IntegrityC
302d0 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43  k *pCheck,  /* C
302e0 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73  ontext for the s
302f0 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
30300 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
30310 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
30320 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
30330 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
30340 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
30350 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
30360 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  page */.  char *
30370 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 2c 20  zParentContext, 
30380 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78  /* Parent contex
30390 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  t */.  char *zLo
303a0 77 65 72 42 6f 75 6e 64 2c 20 20 20 20 2f 2a 20  werBound,    /* 
303b0 41 6c 6c 20 6b 65 79 73 20 73 68 6f 75 6c 64 20  All keys should 
303c0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
303d0 74 68 69 73 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  this, if not NUL
303e0 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 77 65  L */.  int nLowe
303f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
30400 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
30410 74 65 72 73 20 69 6e 20 7a 4c 6f 77 65 72 42 6f  ters in zLowerBo
30420 75 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  und */.  char *z
30430 55 70 70 65 72 42 6f 75 6e 64 2c 20 20 20 20 2f  UpperBound,    /
30440 2a 20 41 6c 6c 20 6b 65 79 73 20 73 68 6f 75 6c  * All keys shoul
30450 64 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74  d be less than t
30460 68 69 73 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  his, if not NULL
30470 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 70 70 65 72   */.  int nUpper
30480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30490 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
304a0 65 72 73 20 69 6e 20 7a 55 70 70 65 72 42 6f 75  ers in zUpperBou
304b0 6e 64 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  nd */.){.  MemPa
304c0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
304d0 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64   i, rc, depth, d
304e0 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20  2, pgno, cnt;.  
304f0 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61  int hdr, cellSta
30500 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  rt;.  int nCell;
30510 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42  .  u8 *data;.  B
30520 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20  tShared *pBt;.  
30530 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
30540 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b    char zContext[
30550 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69  100];.  char *hi
30560 74 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43  t;..  sprintf(zC
30570 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
30580 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
30590 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
305a0 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
305b0 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
305c0 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
305d0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
305e0 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
305f0 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
30600 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
30610 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
30620 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
30630 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
30640 66 28 20 28 72 63 20 3d 20 67 65 74 50 61 67 65  f( (rc = getPage
30650 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67  (pBt, (Pgno)iPag
30660 65 2c 20 26 70 50 61 67 65 29 29 21 3d 30 20 29  e, &pPage))!=0 )
30670 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
30680 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30690 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75  ntext,.       "u
306a0 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  nable to get the
306b0 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64   page. error cod
306c0 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e=%d", rc);.    
306d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
306e0 69 66 28 20 28 72 63 20 3d 20 69 6e 69 74 50 61  if( (rc = initPa
306f0 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ge(pPage, pParen
30700 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  t))!=0 ){.    ch
30710 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
30720 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
30730 69 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72  initPage() retur
30740 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  ns error code %d
30750 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65  ", rc);.    rele
30760 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
30770 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
30780 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75  }..  /* Check ou
30790 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e  t all the cells.
307a0 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20  .  */.  depth = 
307b0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
307c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
307d0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
307e0 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
307f0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
30800 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
30810 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77  payload overflow
30820 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20   pages.    */.  
30830 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65    sprintf(zConte
30840 78 74 2c 20 22 4f 6e 20 74 72 65 65 20 70 61 67  xt, "On tree pag
30850 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c  e %d cell %d: ",
30860 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   iPage, i);.    
30870 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
30880 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 70  (pPage,i);.    p
30890 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
308a0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
308b0 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
308c0 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
308d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
308e0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
308f0 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f  .    if( sz>info
30900 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
30910 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a   int nPage = (sz
30920 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
30930 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29   usableSize - 5)
30940 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  /(usableSize - 4
30950 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  );.      Pgno pg
30960 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
30970 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
30980 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64  verflow]);.#ifnd
30990 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
309a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
309b0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
309c0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
309d0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
309e0 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  k, pgnoOvfl, PTR
309f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69  MAP_OVERFLOW1, i
30a00 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
30a10 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
30a20 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28        checkList(
30a30 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f  pCheck, 0, pgnoO
30a40 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e  vfl, nPage, zCon
30a50 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  text);.    }..  
30a60 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74    /* Check sanit
30a70 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20  y of left child 
30a80 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
30a90 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30aa0 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20  f ){.      pgno 
30ab0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
30ac0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30ad0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30ae0 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
30af0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
30b00 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
30b10 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
30b20 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
30b30 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
30b40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
30b50 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b        d2 = check
30b60 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
30b70 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74  pgno,pPage,zCont
30b80 65 78 74 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ext,0,0,0,0);.  
30b90 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64      if( i>0 && d
30ba0 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20  2!=depth ){.    
30bb0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30bc0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30bd0 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65  ext, "Child page
30be0 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29   depth differs")
30bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30c00 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20  depth = d2;.    
30c10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  }.  }.  if( !pPa
30c20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30c30 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
30c40 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
30c50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
30c60 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ]);.    sprintf(
30c70 7a 43 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 70 61  zContext, "On pa
30c80 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63  ge %d at right c
30c90 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  hild: ", iPage);
30ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30cb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30cc0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
30cd0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30ce0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
30cf0 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
30d00 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
30d10 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
30d20 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
30d30 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ge(pCheck, pgno,
30d40 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   pPage, zContext
30d50 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20  ,0,0,0,0);.  }. 
30d60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
30d70 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67  complete coverag
30d80 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20  e of the page.  
30d90 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  */.  data = pPag
30da0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
30db0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
30dc0 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69  et;.  hit = sqli
30dd0 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61 62 6c 65  teMalloc( usable
30de0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69  Size );.  if( hi
30df0 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
30e00 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65  hit, 1, get2byte
30e10 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b  (&data[hdr+5]));
30e20 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  .    nCell = get
30e30 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
30e40 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61  3]);.    cellSta
30e50 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  rt = hdr + 12 - 
30e60 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
30e70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
30e80 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
30e90 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
30ea0 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61  te(&data[cellSta
30eb0 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  rt+i*2]);.      
30ec0 69 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53  int size = cellS
30ed0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
30ee0 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
30ef0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
30f00 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73   (pc+size-1)>=us
30f10 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30  ableSize || pc<0
30f20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
30f30 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30f40 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
30f50 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
30f60 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
30f70 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
30f80 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
30f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30fa0 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b  for(j=pc+size-1;
30fb0 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74   j>=pc; j--) hit
30fc0 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  [j]++;.      }. 
30fd0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74     }.    for(cnt
30fe0 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26  =0, i=get2byte(&
30ff0 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e  data[hdr+1]); i>
31000 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a  0 && i<usableSiz
31010 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20  e && cnt<10000; 
31020 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b  .           cnt+
31030 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  +){.      int si
31040 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
31050 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  ata[i+2]);.     
31060 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
31070 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73  ( (i+size-1)>=us
31080 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20  ableSize || i<0 
31090 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
310a0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
310b0 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20  , 0,  .         
310c0 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
310d0 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
310e0 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
310f0 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
31100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31110 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20  for(j=i+size-1; 
31120 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  j>=i; j--) hit[j
31130 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
31140 20 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28     i = get2byte(
31150 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d  &data[i]);.    }
31160 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30  .    for(i=cnt=0
31170 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20  ; i<usableSize; 
31180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
31190 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  hit[i]==0 ){.   
311a0 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
311b0 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b    }else if( hit[
311c0 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  i]>1 ){.        
311d0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
311e0 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20  Check, 0,.      
311f0 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73      "Multiple us
31200 65 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f  es for byte %d o
31210 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69  f page %d", i, i
31220 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Page);.        b
31230 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
31240 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
31250 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a  =data[hdr+7] ){.
31260 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
31270 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
31280 0a 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67  .          "Frag
31290 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20  mented space is 
312a0 25 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64  %d byte reported
312b0 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25   as %d on page %
312c0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e  d",.          cn
312d0 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20  t, data[hdr+7], 
312e0 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iPage);.    }.  
312f0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 68  }.  sqliteFree(h
31300 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50  it);..  releaseP
31310 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
31320 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a  turn depth+1;.}.
31330 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31340 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
31350 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
31360 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
31370 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
31380 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
31390 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65   does a complete
313a0 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69   check of the gi
313b0 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20  ven BTree file. 
313c0 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61   aRoot[] is.** a
313d0 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73  n array of pages
313e0 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61   numbers were ea
313f0 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ch page number i
31400 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
31410 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20  of.** a table.  
31420 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d  nRoot is the num
31430 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
31440 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  n aRoot..**.** I
31450 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65  f everything che
31460 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f  cks out, this ro
31470 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
31480 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e  LL.  If somethin
31490 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61  g is.** amiss, a
314a0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
314b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
314c0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
314d0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  from malloc().**
314e0 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
314f0 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73  o that error mes
31500 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  sage is returned
31510 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
31520 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
31530 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72  sponsible for fr
31540 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  eeing the error 
31550 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20  message when it 
31560 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72  is done..*/.char
31570 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e   *sqlite3BtreeIn
31580 74 65 67 72 69 74 79 43 68 65 63 6b 28 42 74 72  tegrityCheck(Btr
31590 65 65 20 2a 70 2c 20 69 6e 74 20 2a 61 52 6f 6f  ee *p, int *aRoo
315a0 74 2c 20 69 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20  t, int nRoot){. 
315b0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52   int i;.  int nR
315c0 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ef;.  IntegrityC
315d0 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68  k sCheck;.  BtSh
315e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
315f0 42 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 2a 73  Bt;..  nRef = *s
31600 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
31610 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  s(pBt->pPager);.
31620 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
31630 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
31640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
31650 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75  turn sqliteStrDu
31660 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
31670 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
31680 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31690 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
316a0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
316b0 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
316c0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
316d0 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
316e0 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
316f0 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
31700 29 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e  );.  if( sCheck.
31710 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
31720 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
31730 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65  sed(pBt);.    re
31740 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43  turn 0;.  }.  sC
31750 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c  heck.anRef = sql
31760 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73  iteMallocRaw( (s
31770 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
31780 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
31790 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  ef[0]) );.  if( 
317a0 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b  !sCheck.anRef ){
317b0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
317c0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
317d0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
317e0 33 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65  3MPrintf("Unable
317f0 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79   to malloc %d by
31800 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28  tes", .        (
31810 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a  sCheck.nPage+1)*
31820 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e  sizeof(sCheck.an
31830 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  Ref[0]));.  }.  
31840 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65  for(i=0; i<=sChe
31850 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
31860 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
31870 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e  = 0; }.  i = PEN
31880 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31890 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43  Bt);.  if( i<=sC
318a0 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20  heck.nPage ){.  
318b0 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69    sCheck.anRef[i
318c0 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68  ] = 1;.  }.  sCh
318d0 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  eck.zErrMsg = 0;
318e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
318f0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
31900 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a  e freelist.  */.
31910 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68    checkList(&sCh
31920 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65  eck, 1, get4byte
31930 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
31940 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20  Data[32]),.     
31950 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
31960 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
31970 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20  ata[36]), "Main 
31980 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20  freelist: ");.. 
31990 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68   /* Check all th
319a0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
319b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f   for(i=0; i<nRoo
319c0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
319d0 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63   aRoot[i]==0 ) c
319e0 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
319f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31a00 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
31a10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31a20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b  && aRoot[i]>1 ){
31a30 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d  .      checkPtrm
31a40 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ap(&sCheck, aRoo
31a50 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  t[i], PTRMAP_ROO
31a60 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20  TPAGE, 0, 0);.  
31a70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
31a80 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43  heckTreePage(&sC
31a90 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
31aa0 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65  0, "List of tree
31ab0 20 72 6f 6f 74 73 3a 20 22 2c 20 30 2c 30 2c 30   roots: ", 0,0,0
31ac0 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ,0);.  }..  /* M
31ad0 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70  ake sure every p
31ae0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
31af0 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20  is referenced.  
31b00 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
31b10 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69  =sCheck.nPage; i
31b20 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
31b30 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31b40 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63  UM.    if( sChec
31b50 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b  k.anRef[i]==0 ){
31b60 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
31b70 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
31b80 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
31b90 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
31ba0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
31bb0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
31bc0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
31bd0 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72  vacuum, make sur
31be0 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74  e no tables cont
31bf0 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  ain.    ** refer
31c00 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72  ences to pointer
31c10 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20  -map pages..    
31c20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63  */.    if( sChec
31c30 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26  k.anRef[i]==0 &&
31c40 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50   .       (PTRMAP
31c50 5f 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61  _PAGENO(pBt->usa
31c60 62 6c 65 53 69 7a 65 2c 20 69 29 21 3d 69 20 7c  bleSize, i)!=i |
31c70 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  | !pBt->autoVacu
31c80 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
31c90 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
31ca0 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
31cb0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
31cc0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   i);.    }.    i
31cd0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
31ce0 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]!=0 && .      
31cf0 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
31d00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c  pBt->usableSize,
31d10 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61   i)==i && pBt->a
31d20 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
31d30 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31d40 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
31d50 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
31d60 20 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65   %d is reference
31d70 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65  d", i);.    }.#e
31d80 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ndif.  }..  /* M
31d90 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e  ake sure this an
31da0 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c  alysis did not l
31db0 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29  eave any unref()
31dc0 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e   pages.  */.  un
31dd0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
31de0 64 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52  d(pBt);.  if( nR
31df0 65 66 20 21 3d 20 2a 73 71 6c 69 74 65 33 70 61  ef != *sqlite3pa
31e00 67 65 72 5f 73 74 61 74 73 28 70 42 74 2d 3e 70  ger_stats(pBt->p
31e10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68  Pager) ){.    ch
31e20 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
31e30 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
31e40 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67  "Outstanding pag
31e50 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f  e count goes fro
31e60 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e  m %d to %d durin
31e70 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22  g this analysis"
31e80 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 2a 73  ,.      nRef, *s
31e90 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
31ea0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20  s(pBt->pPager). 
31eb0 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
31ec0 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65  Clean  up and re
31ed0 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a  port errors..  *
31ee0 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73  /.  sqliteFree(s
31ef0 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
31f00 72 65 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45  return sCheck.zE
31f10 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  rrMsg;.}.#endif 
31f20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
31f30 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
31f40 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
31f50 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
31f60 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
31f70 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
31f80 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
31f90 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
31fa0 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20  tFilename(Btree 
31fb0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
31fc0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
31fd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
31fe0 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
31ff0 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
32000 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
32010 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
32020 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
32030 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
32040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32050 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
32060 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
32070 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a  tDirname(Btree *
32080 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
32090 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
320a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
320b0 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65  te3pager_dirname
320c0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
320d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
320e0 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
320f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
32100 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  le for this data
32110 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e  base. The return
32120 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69  .** value of thi
32130 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
32140 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73   same regardless
32150 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
32160 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
32170 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
32180 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73   or not..*/.cons
32190 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
321a0 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
321b0 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
321c0 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
321d0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
321e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67  eturn sqlite3pag
321f0 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  er_journalname(p
32200 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
32210 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
32220 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
32230 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
32240 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
32250 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
32260 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
32270 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
32280 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
32290 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
322a0 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74  size of file pBt
322b0 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75  From may be redu
322c0 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
322d0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
322e0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
322f0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
32300 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20  n on pBtFrom is 
32310 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
32320 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
32330 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
32340 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
32350 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
32360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
32370 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61   i, nPage, nToPa
32380 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74  ge, iSkip;..  Bt
32390 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
323a0 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
323b0 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
323c0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69  pFrom->pBt;..  i
323d0 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21  f( pTo->inTrans!
323e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
323f0 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d  pFrom->inTrans!=
32400 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
32410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32420 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
32430 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72  ( pBtTo->pCursor
32440 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
32450 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65  _BUSY;.  nToPage
32460 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
32470 70 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d  pagecount(pBtTo-
32480 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67  >pPager);.  nPag
32490 65 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  e = sqlite3pager
324a0 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72  _pagecount(pBtFr
324b0 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  om->pPager);.  i
324c0 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42  Skip = PENDING_B
324d0 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b  YTE_PAGE(pBtTo);
324e0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d  .  for(i=1; rc==
324f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
32500 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
32510 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
32520 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29    if( i==iSkip )
32530 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72   continue;.    r
32540 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
32550 5f 67 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  _get(pBtFrom->pP
32560 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
32570 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
32580 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  reak;.    rc = s
32590 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
325a0 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  write(pBtTo->pPa
325b0 67 65 72 2c 20 69 2c 20 70 50 61 67 65 29 3b 0a  ger, i, pPage);.
325c0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
325d0 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70  ak;.    sqlite3p
325e0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
325f0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e  );.  }.  for(i=n
32600 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49  Page+1; rc==SQLI
32610 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50  TE_OK && i<=nToP
32620 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  age; i++){.    v
32630 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
32640 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63  if( i==iSkip ) c
32650 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20  ontinue;.    rc 
32660 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
32670 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  et(pBtTo->pPager
32680 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
32690 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
326a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
326b0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
326c0 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
326d0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
326e0 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
326f0 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
32700 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
32710 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  i);.  }.  if( !r
32720 63 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61  c && nPage<nToPa
32730 67 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ge ){.    rc = s
32740 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
32750 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  cate(pBtTo->pPag
32760 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  er, nPage);.  }.
32770 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
32780 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
32790 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20  back(pTo);.  }. 
327a0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
327b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
327c0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a  _OMIT_VACUUM */.
327d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
327e0 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e  n-zero if a tran
327f0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
32800 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
32810 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
32820 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
32830 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e  urn (p && (p->in
32840 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
32850 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  TE));.}../*.** R
32860 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
32870 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
32880 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
32890 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
328a0 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74  te3BtreeIsInStmt
328b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
328c0 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20  turn (p->pBt && 
328d0 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b  p->pBt->inStmt);
328e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63  .}../*.** This c
328f0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
32900 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
32910 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
32920 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
32930 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
32940 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
32950 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
32960 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
32970 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
32980 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
32990 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
329a0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
329b0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
329c0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
329d0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
329e0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
329f0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
32a00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
32a10 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
32a20 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
32a30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
32a40 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
32a50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
32a60 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
32a70 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
32a80 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
32a90 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
32aa0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
32ab0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
32ac0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
32ad0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
32ae0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
32af0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
32b00 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
32b10 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
32b20 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
32b30 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
32b40 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
32b50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
32b60 42 74 72 65 65 53 79 6e 63 28 42 74 72 65 65 20  BtreeSync(Btree 
32b70 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
32b80 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 66 28 20  zMaster){.  if( 
32b90 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
32ba0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
32bb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32bc0 2d 3e 70 42 74 3b 0a 23 69 66 6e 64 65 66 20 53  ->pBt;.#ifndef S
32bd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32be0 41 43 55 55 4d 0a 20 20 20 20 50 67 6e 6f 20 6e  ACUUM.    Pgno n
32bf0 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 69  Trunc = 0;.    i
32c00 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
32c10 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  um ){.      int 
32c20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
32c30 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75  ommit(pBt, &nTru
32c40 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  nc); .      if( 
32c50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
32c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
32c70 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
32c80 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 42  te3pager_sync(pB
32c90 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
32ca0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 23 65 6e  er, nTrunc);.#en
32cb0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 73  dif.    return s
32cc0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
32cd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
32ce0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  aster, 0);.  }. 
32cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32d00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
32d10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
32d20 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
32d30 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
32d40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
32d50 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72  ** a single shar
32d60 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65  ed-btree. The me
32d70 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20  mory is used by 
32d80 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20  client code for 
32d90 69 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70  it's own.** purp
32da0 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c  oses (for exampl
32db0 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69  e, to store a hi
32dc0 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20  gh-level schema 
32dd0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32de0 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62  .** the shared-b
32df0 74 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65  tree). The btree
32e00 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72   layer manages r
32e10 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e  eference countin
32e20 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  g issues..**.** 
32e30 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
32e40 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  his is called on
32e50 20 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c   a shared-btree,
32e60 20 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66   nBytes bytes of
32e70 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61   memory.** are a
32e80 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64  llocated, zeroed
32e90 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74  , and returned t
32ea0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f  o the caller. Fo
32eb0 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
32ec0 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e  t .** call the n
32ed0 42 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20  Bytes parameter 
32ee0 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61  is ignored and a
32ef0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32f00 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20  same blob.** of 
32f10 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e  memory returned.
32f20 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66   .**.** Just bef
32f30 6f 72 65 20 74 68 65 20 73 68 61 72 65 64 2d 62  ore the shared-b
32f40 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  tree is closed, 
32f50 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73  the function pas
32f60 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78  sed as the .** x
32f70 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68  Free argument wh
32f80 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  en the memory al
32f90 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64  location was mad
32fa0 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  e is invoked on 
32fb0 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20  the .** blob of 
32fc0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
32fd0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
32fe0 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20  should not call 
32ff0 73 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a 20  sqliteFree().** 
33000 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74  on the memory, t
33010 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64  he btree layer d
33020 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69  oes that..*/.voi
33030 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53  d *sqlite3BtreeS
33040 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20  chema(Btree *p, 
33050 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64  int nBytes, void
33060 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29  (*xFree)(void *)
33070 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33080 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
33090 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61  f( !pBt->pSchema
330a0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63   ){.    pBt->pSc
330b0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  hema = sqliteMal
330c0 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 20  loc(nBytes);.   
330d0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
330e0 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20  a = xFree;.  }. 
330f0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63   return pBt->pSc
33100 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  hema;.}../*.** R
33110 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
33120 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68  other user of th
33130 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74  e same shared bt
33140 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d  ree as the argum
33150 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f  ent.** handle ho
33160 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
33170 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c   lock on the sql
33180 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
33190 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
331a0 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65  BtreeSchemaLocke
331b0 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  d(Btree *p){.  r
331c0 65 74 75 72 6e 20 28 71 75 65 72 79 54 61 62 6c  eturn (queryTabl
331d0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
331e0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
331f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  !=SQLITE_OK);.}.
33200 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33210 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65  eLockTable(Btree
33220 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 75   *p, int iTab, u
33230 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a  8 isWriteLock){.
33240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33250 45 5f 4f 4b 3b 0a 23 69 66 6e 64 65 66 20 53 51  E_OK;.#ifndef SQ
33260 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
33270 5f 43 41 43 48 45 0a 20 20 75 38 20 6c 6f 63 6b  _CACHE.  u8 lock
33280 54 79 70 65 20 3d 20 28 69 73 57 72 69 74 65 4c  Type = (isWriteL
33290 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a 52  ock?WRITE_LOCK:R
332a0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 63 20  EAD_LOCK);.  rc 
332b0 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
332c0 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
332d0 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pe);.  if( rc==S
332e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
332f0 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
33300 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
33310 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
33320 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.