System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 9f448041f23a2825ebef8bc05e3f1467aed97ff0:


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 32 35 20 32 30 30 36 2f 30 38  c,v 1.25 2006/08
0190: 2f 31 33 20 31 35 3a 35 35 3a 30 30 20 72 6d 73  /13 15:55:00 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 20  E.  void *pKey; 
4580: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 6b 65       /* Saved ke
4590: 79 20 74 68 61 74 20 77 61 73 20 63 75 72 73 6f  y that was curso
45a0: 72 27 73 20 6c 61 73 74 20 6b 6e 6f 77 6e 20 70  r's last known p
45b0: 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34  osition */.  i64
45c0: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a   nKey;        /*
45d0: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 2c 20 6f   Size of pKey, o
45e0: 72 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 6b  r last integer k
45f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  ey */.  int skip
4600: 3b 20 20 20 20 20 20 20 20 2f 2a 20 28 73 6b 69  ;        /* (ski
4610: 70 3c 30 29 20 2d 3e 20 50 72 65 76 28 29 20 69  p<0) -> Prev() i
4620: 73 20 61 20 6e 6f 2d 6f 70 2e 20 28 73 6b 69 70  s a no-op. (skip
4630: 3e 30 29 20 2d 3e 20 4e 65 78 74 28 29 20 69 73  >0) -> Next() is
4640: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
4650: 2a 0a 2a 2a 20 50 6f 74 65 6e 74 69 61 6c 20 76  *.** Potential v
4660: 61 6c 75 65 73 20 66 6f 72 20 42 74 43 75 72 73  alues for BtCurs
4670: 6f 72 2e 65 53 74 61 74 65 2e 20 54 68 65 20 66  or.eState. The f
4680: 69 72 73 74 20 74 77 6f 20 76 61 6c 75 65 73 20  irst two values 
4690: 28 56 41 4c 49 44 20 61 6e 64 20 0a 2a 2a 20 49  (VALID and .** I
46a0: 4e 56 41 4c 49 44 29 20 6d 61 79 20 6f 63 63 75  NVALID) may occu
46b0: 72 20 69 6e 20 61 6e 79 20 62 75 69 6c 64 2e 20  r in any build. 
46c0: 54 68 65 20 74 68 69 72 64 20 28 52 45 51 55 49  The third (REQUI
46d0: 52 45 53 45 45 4b 29 20 6d 61 79 20 6f 6e 6c 79  RESEEK) may only
46e0: 20 6f 63 63 75 72 20 0a 2a 2a 20 69 66 20 73 71   occur .** if sq
46f0: 6c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c 65  lite was compile
4700: 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 4f 4d  d without the OM
4710: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
4720: 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2e 0a  symbol defined..
4730: 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 56 41 4c  **.** CURSOR_VAL
4740: 49 44 3a 0a 2a 2a 20 20 20 43 75 72 73 6f 72 20  ID:.**   Cursor 
4750: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
4760: 64 20 65 6e 74 72 79 2e 20 67 65 74 50 61 79 6c  d entry. getPayl
4770: 6f 61 64 28 29 20 65 74 63 2e 20 6d 61 79 20 62  oad() etc. may b
4780: 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
4790: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3a 0a  CURSOR_INVALID:.
47a0: 2a 2a 20 20 20 43 75 72 73 6f 72 20 64 6f 65 73  **   Cursor does
47b0: 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20   not point to a 
47c0: 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 54 68 69  valid entry. Thi
47d0: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 28 66 6f  s can happen (fo
47e0: 72 20 65 78 61 6d 70 6c 65 29 20 0a 2a 2a 20 20  r example) .**  
47f0: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
4800: 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 62  le is empty or b
4810: 65 63 61 75 73 65 20 42 74 72 65 65 43 75 72 73  ecause BtreeCurs
4820: 6f 72 46 69 72 73 74 28 29 20 68 61 73 20 6e 6f  orFirst() has no
4830: 74 20 62 65 65 6e 0a 2a 2a 20 20 20 63 61 6c 6c  t been.**   call
4840: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52  ed..**.** CURSOR
4850: 5f 52 45 51 55 49 52 45 53 45 45 4b 3a 0a 2a 2a  _REQUIRESEEK:.**
4860: 20 20 20 54 68 65 20 74 61 62 6c 65 20 74 68 61     The table tha
4870: 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61  t this cursor wa
4880: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 73 74 69 6c  s opened on stil
4890: 6c 20 65 78 69 73 74 73 2c 20 62 75 74 20 68 61  l exists, but ha
48a0: 73 20 62 65 65 6e 20 0a 2a 2a 20 20 20 6d 6f 64  s been .**   mod
48b0: 69 66 69 65 64 20 73 69 6e 63 65 20 74 68 65 20  ified since the 
48c0: 63 75 72 73 6f 72 20 77 61 73 20 6c 61 73 74 20  cursor was last 
48d0: 75 73 65 64 2e 20 54 68 65 20 63 75 72 73 6f 72  used. The cursor
48e0: 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 73 61 76   position is sav
48f0: 65 64 0a 2a 2a 20 20 20 69 6e 20 76 61 72 69 61  ed.**   in varia
4900: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 70 4b  bles BtCursor.pK
4910: 65 79 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ey and BtCursor.
4920: 6e 4b 65 79 2e 20 57 68 65 6e 20 61 20 63 75 72  nKey. When a cur
4930: 73 6f 72 20 69 73 20 69 6e 20 0a 2a 2a 20 20 20  sor is in .**   
4940: 74 68 69 73 20 73 74 61 74 65 2c 20 72 65 73 74  this state, rest
4950: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
4960: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6e 20 62  Position() can b
4970: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 74 74 65  e called to atte
4980: 6d 70 74 20 74 6f 0a 2a 2a 20 20 20 73 65 65 6b  mpt to.**   seek
4990: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
49a0: 68 65 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  he saved positio
49b0: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 55  n..*/.#define CU
49c0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 20 20 20  RSOR_INVALID    
49d0: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
49e0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
49f0: 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66            1.#def
4a00: 69 6e 65 20 43 55 52 53 4f 52 5f 52 45 51 55 49  ine CURSOR_REQUI
4a10: 52 45 53 45 45 4b 20 20 20 20 20 20 20 32 0a 0a  RESEEK       2..
4a20: 2f 2a 0a 2a 2a 20 54 68 65 20 54 52 41 43 45 20  /*.** The TRACE 
4a30: 6d 61 63 72 6f 20 77 69 6c 6c 20 70 72 69 6e 74  macro will print
4a40: 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 74 61 74   high-level stat
4a50: 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  us information a
4a60: 62 6f 75 74 20 74 68 65 0a 2a 2a 20 62 74 72 65  bout the.** btre
4a70: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e  e operation when
4a80: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
4a90: 61 62 6c 65 20 73 71 6c 69 74 65 33 5f 62 74 72  able sqlite3_btr
4aa0: 65 65 5f 74 72 61 63 65 20 69 73 0a 2a 2a 20 65  ee_trace is.** e
4ab0: 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 23 69 66 20 53  nabled..*/.#if S
4ac0: 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66  QLITE_TEST.# def
4ad0: 69 6e 65 20 54 52 41 43 45 28 58 29 20 20 20 69  ine TRACE(X)   i
4ae0: 66 28 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65  f( sqlite3_btree
4af0: 5f 74 72 61 63 65 20 29 5c 0a 20 20 20 20 20 20  _trace )\.      
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67    { sqlite3Debug
4b20: 50 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68  Printf X; fflush
4b30: 28 73 74 64 6f 75 74 29 3b 20 7d 0a 69 6e 74 20  (stdout); }.int 
4b40: 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72  sqlite3_btree_tr
4b50: 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  ace=0;  /* True 
4b60: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
4b70: 67 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66  g */.#else.# def
4b80: 69 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e  ine TRACE(X).#en
4b90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
4ba0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
4bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4bc0: 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 53 68  ckReadLocks(BtSh
4bd0: 61 72 65 64 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  ared*,Pgno,BtCur
4be0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  sor*);../*.** Re
4bf0: 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 74 77  ad or write a tw
4c00: 6f 2d 20 61 6e 64 20 66 6f 75 72 2d 62 79 74 65  o- and four-byte
4c10: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
4c20: 67 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ger values..*/.s
4c30: 74 61 74 69 63 20 75 33 32 20 67 65 74 32 62 79  tatic u32 get2by
4c40: 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  te(unsigned char
4c50: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
4c60: 70 5b 30 5d 3c 3c 38 29 20 7c 20 70 5b 31 5d 3b  p[0]<<8) | p[1];
4c70: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 67 65  .}.static u32 ge
4c80: 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t4byte(unsigned 
4c90: 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  char *p){.  retu
4ca0: 72 6e 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c 20  rn (p[0]<<24) | 
4cb0: 28 70 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70 5b  (p[1]<<16) | (p[
4cc0: 32 5d 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d  2]<<8) | p[3];.}
4cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74  .static void put
4ce0: 32 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63  2byte(unsigned c
4cf0: 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a  har *p, u32 v){.
4d00: 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 38 3b 0a 20    p[0] = v>>8;. 
4d10: 20 70 5b 31 5d 20 3d 20 76 3b 0a 7d 0a 73 74 61   p[1] = v;.}.sta
4d20: 74 69 63 20 76 6f 69 64 20 70 75 74 34 62 79 74  tic void put4byt
4d30: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4d40: 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b  *p, u32 v){.  p[
4d50: 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b  0] = v>>24;.  p[
4d60: 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b  1] = v>>16;.  p[
4d70: 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33  2] = v>>8;.  p[3
4d80: 5d 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = v;.}../*.** 
4d90: 52 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61 64  Routines to read
4da0: 20 61 6e 64 20 77 72 69 74 65 20 76 61 72 69 61   and write varia
4db0: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
4dc0: 65 72 73 2e 20 20 54 68 65 73 65 20 75 73 65 64  ers.  These used
4dd0: 20 74 6f 0a 2a 2a 20 62 65 20 64 65 66 69 6e 65   to.** be define
4de0: 64 20 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 20 6e  d locally, but n
4df0: 6f 77 20 77 65 20 75 73 65 20 74 68 65 20 76 61  ow we use the va
4e00: 72 69 6e 74 20 72 6f 75 74 69 6e 65 73 20 69 6e  rint routines in
4e10: 20 74 68 65 20 75 74 69 6c 2e 63 0a 2a 2a 20 66   the util.c.** f
4e20: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
4e30: 67 65 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c  getVarint    sql
4e40: 69 74 65 33 47 65 74 56 61 72 69 6e 74 0a 2f 2a  ite3GetVarint./*
4e50: 20 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69   #define getVari
4e60: 6e 74 33 32 20 20 73 71 6c 69 74 65 33 47 65 74  nt32  sqlite3Get
4e70: 56 61 72 69 6e 74 33 32 20 2a 2f 0a 23 64 65 66  Varint32 */.#def
4e80: 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 28  ine getVarint32(
4e90: 41 2c 42 29 20 20 28 28 2a 42 3d 2a 28 41 29 29  A,B)  ((*B=*(A))
4ea0: 3c 3d 30 78 37 66 3f 31 3a 73 71 6c 69 74 65 33  <=0x7f?1:sqlite3
4eb0: 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29  GetVarint32(A,B)
4ec0: 29 0a 23 64 65 66 69 6e 65 20 70 75 74 56 61 72  ).#define putVar
4ed0: 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 50 75  int    sqlite3Pu
4ee0: 74 56 61 72 69 6e 74 0a 0a 2f 2a 20 54 68 65 20  tVarint../* The 
4ef0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74 68  database page th
4f00: 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6f  e PENDING_BYTE o
4f10: 63 63 75 70 69 65 73 2e 20 54 68 69 73 20 70 61  ccupies. This pa
4f20: 67 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  ge is never used
4f30: 2e 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  ..** TODO: This 
4f40: 6d 61 63 72 6f 20 69 73 20 76 65 72 79 20 73 69  macro is very si
4f50: 6d 69 6c 61 72 79 20 74 6f 20 50 41 47 45 52 5f  milary to PAGER_
4f60: 4d 4a 5f 50 47 4e 4f 28 29 20 69 6e 20 70 61 67  MJ_PGNO() in pag
4f70: 65 72 2e 63 2e 20 54 68 65 79 0a 2a 2a 20 73 68  er.c. They.** sh
4f80: 6f 75 6c 64 20 70 6f 73 73 69 62 6c 79 20 62 65  ould possibly be
4f90: 20 63 6f 6e 73 6f 6c 69 64 61 74 65 64 20 28 70   consolidated (p
4fa0: 72 65 73 75 6d 61 62 6c 79 20 69 6e 20 70 61 67  resumably in pag
4fb0: 65 72 2e 68 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er.h)..**.** If 
4fc0: 64 69 73 6b 20 49 2f 4f 20 69 73 20 6f 6d 69 74  disk I/O is omit
4fd0: 74 65 64 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ted (meaning tha
4fe0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
4ff0: 73 20 73 74 6f 72 65 64 20 70 75 72 65 6c 79 0a  s stored purely.
5000: 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 29 20 74 68  ** in memory) th
5010: 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  en there is no p
5020: 65 6e 64 69 6e 67 20 62 79 74 65 2e 0a 2a 2f 0a  ending byte..*/.
5030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5040: 49 54 5f 44 49 53 4b 49 4f 0a 23 20 64 65 66 69  IT_DISKIO.# defi
5050: 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ne PENDING_BYTE_
5060: 50 41 47 45 28 70 42 74 29 20 20 30 78 37 66 66  PAGE(pBt)  0x7ff
5070: 66 66 66 66 66 0a 23 65 6c 73 65 0a 23 20 64 65  fffff.#else.# de
5080: 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54  fine PENDING_BYT
5090: 45 5f 50 41 47 45 28 70 42 74 29 20 28 28 50 45  E_PAGE(pBt) ((PE
50a0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 70 42 74 29  NDING_BYTE/(pBt)
50b0: 2d 3e 70 61 67 65 53 69 7a 65 29 2b 31 29 0a 23  ->pageSize)+1).#
50c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  endif../*.** A l
50d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68  inked list of th
50e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
50f0: 63 74 75 72 65 73 20 69 73 20 73 74 6f 72 65 64  ctures is stored
5100: 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4c 6f   at BtShared.pLo
5110: 63 6b 2e 0a 2a 2a 20 4c 6f 63 6b 73 20 61 72 65  ck..** Locks are
5120: 20 61 64 64 65 64 20 28 6f 72 20 75 70 67 72 61   added (or upgra
5130: 64 65 64 20 66 72 6f 6d 20 52 45 41 44 5f 4c 4f  ded from READ_LO
5140: 43 4b 20 74 6f 20 57 52 49 54 45 5f 4c 4f 43 4b  CK to WRITE_LOCK
5150: 29 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20  ) when a cursor 
5160: 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  .** is opened on
5170: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
5180: 72 6f 6f 74 20 70 61 67 65 20 42 74 53 68 61 72  root page BtShar
5190: 65 64 2e 69 54 61 62 6c 65 2e 20 4c 6f 63 6b 73  ed.iTable. Locks
51a0: 20 61 72 65 20 72 65 6d 6f 76 65 64 0a 2a 2a 20   are removed.** 
51b0: 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 77  from this list w
51c0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
51d0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f  n is committed o
51e0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 6f  r rolled back, o
51f0: 72 20 77 68 65 6e 0a 2a 2a 20 61 20 62 74 72 65  r when.** a btre
5200: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
5210: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74  ed..*/.struct Bt
5220: 4c 6f 63 6b 20 7b 0a 20 20 42 74 72 65 65 20 2a  Lock {.  Btree *
5230: 70 42 74 72 65 65 3b 20 20 20 20 20 20 20 20 2f  pBtree;        /
5240: 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 68  * Btree handle h
5250: 6f 6c 64 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b  olding this lock
5260: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 61 62 6c   */.  Pgno iTabl
5270: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  e;          /* R
5280: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
5290: 65 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  e */.  u8 eLock;
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
52c0: 54 45 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 42 74 4c  TE_LOCK */.  BtL
52d0: 6f 63 6b 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ock *pNext;     
52e0: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 42 74     /* Next in Bt
52f0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
5300: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 61 6e 64  t */.};../* Cand
5310: 69 64 61 74 65 20 76 61 6c 75 65 73 20 66 6f 72  idate values for
5320: 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f   BtLock.eLock */
5330: 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 4c 4f  .#define READ_LO
5340: 43 4b 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  CK     1.#define
5350: 20 57 52 49 54 45 5f 4c 4f 43 4b 20 20 20 20 32   WRITE_LOCK    2
5360: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5370: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
5380: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  E.  /*.  ** The 
5390: 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54  functions queryT
53a0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b  ableLock(), lock
53b0: 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f  Table() and unlo
53c0: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20  ckAllTables().  
53d0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
53e0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
53f0: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
5400: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
5410: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
5420: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
5430: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
5440: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
5450: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
5460: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
5470: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
5480: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
5490: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
54a0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
54b0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
54c0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
54d0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
54e0: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
54f0: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
5500: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
5510: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
5520: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
5530: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c  ueryTableLock(a,
5540: 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  b,c) SQLITE_OK. 
5550: 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62   #define lockTab
5560: 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  le(a,b,c) SQLITE
5570: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  _OK.  #define un
5580: 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29  lockAllTables(a)
5590: 0a 20 20 23 64 65 66 69 6e 65 20 72 65 73 74 6f  .  #define resto
55a0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
55b0: 6f 73 69 74 69 6f 6e 28 61 2c 62 29 20 53 51 4c  osition(a,b) SQL
55c0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
55d0: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
55e0: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
55f0: 0a 0a 23 65 6c 73 65 0a 0a 73 74 61 74 69 63 20  ..#else..static 
5600: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
5610: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5620: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  ;../*.** Save th
5630: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5640: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5650: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5660: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5670: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5680: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5690: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
56a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
56b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
56c0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
56d0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
56e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
56f0: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5700: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5710: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5720: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5730: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5740: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
5750: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
5760: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5770: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
5780: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
5790: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
57a0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
57b0: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
57c0: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
57d0: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
57e0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
57f0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
5800: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
5810: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
5820: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
5830: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
5840: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
5850: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
5860: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
5870: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
5880: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
5890: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58a0: 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70  OK && 0==pCur->p
58b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  Page->intKey){. 
58c0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
58d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 43 75  sqliteMalloc(pCu
58e0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  r->nKey);.    if
58f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ( pKey ){.      
5900: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5910: 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70 43  eKey(pCur, 0, pC
5920: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
5930: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
5940: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5950: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5960: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
5970: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5980: 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  teFree(pKey);.  
5990: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
59a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
59b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
59c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
59d0: 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
59e0: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
59f0: 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  y );..  if( rc==
5a00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5a10: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
5a20: 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
5a30: 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a  Cur->pPage = 0;.
5a40: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5a50: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5a60: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  ESEEK;.  }..  re
5a70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5a80: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a90: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5aa0: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
5ab0: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
5ac0: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
5ad0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
5ae0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
5af0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b00: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
5b10: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
5b20: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
5b30: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
5b40: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5b50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5b60: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5b70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5b80: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
5b90: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
5ba0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5bb0: 69 66 28 20 73 71 6c 69 74 65 33 54 68 72 65 61  if( sqlite3Threa
5bc0: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
5bd0: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 29  >useSharedData )
5be0: 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 2d  {.    for(p=pBt-
5bf0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5c00: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
5c10: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
5c20: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
5c30: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
5c40: 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  t) && .         
5c50: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5c60: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
5c70: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
5c80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5c90: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
5ca0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
5cb0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5cc0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
5cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5cf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
5d00: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
5d10: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
5d20: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
5d30: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
5d40: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
5d50: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5d60: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
5d70: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
5d80: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
5d90: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
5da0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
5db0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
5dc0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
5dd0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
5de0: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
5df0: 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ve restoreOrClea
5e00: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
5e10: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
5e20: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
5e30: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a  Position()..**.*
5e40: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
5e50: 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e  argument argumen
5e60: 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69 73 20  t - doSeek - is 
5e70: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
5e80: 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72  ead of .** retur
5e90: 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
5ea0: 74 6f 20 69 74 27 73 20 73 61 76 65 64 20 70 6f  to it's saved po
5eb0: 73 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65  sition, any save
5ec0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 64 65  d position is de
5ed0: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  leted.** and the
5ee0: 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 73 65   cursor state se
5ef0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41  t to CURSOR_INVA
5f00: 4c 49 44 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LID..*/.static i
5f10: 6e 74 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  nt restoreOrClea
5f20: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 58  rCursorPositionX
5f30: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
5f40: 20 69 6e 74 20 64 6f 53 65 65 6b 29 7b 0a 20 20   int doSeek){.  
5f50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5f60: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  OK;.  assert( sq
5f70: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
5f80: 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68  eadOnly()->useSh
5f90: 61 72 65 64 44 61 74 61 20 29 3b 0a 20 20 61 73  aredData );.  as
5fa0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
5fb0: 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te==CURSOR_REQUI
5fc0: 52 45 53 45 45 4b 20 29 3b 0a 20 20 70 43 75 72  RESEEK );.  pCur
5fd0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
5fe0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 69 66 28  R_INVALID;.  if(
5ff0: 20 64 6f 53 65 65 6b 20 29 7b 0a 20 20 20 20 72   doSeek ){.    r
6000: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6010: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
6020: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
6030: 4b 65 79 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  Key, &pCur->skip
6040: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6050: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6060: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
6070: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
6080: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6090: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
60a0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
60b0: 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 49  tate || CURSOR_I
60c0: 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
60d0: 74 61 74 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65  tate );.  }.  re
60e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
60f0: 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ine restoreOrCle
6100: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
6110: 28 70 2c 78 29 20 5c 0a 20 20 28 70 2d 3e 65 53  (p,x) \.  (p->eS
6120: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51  tate==CURSOR_REQ
6130: 55 49 52 45 53 45 45 4b 3f 72 65 73 74 6f 72 65  UIRESEEK?restore
6140: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
6150: 69 74 69 6f 6e 58 28 70 2c 78 29 3a 53 51 4c 49  itionX(p,x):SQLI
6160: 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 51 75  TE_OK)../*.** Qu
6170: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
6180: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
6190: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
61a0: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
61b0: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
61c0: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
61d0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
61e0: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
61f0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
6200: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
6210: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
6220: 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62   calling lockTab
6230: 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c  le()), or.** SQL
6240: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
6250: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6260: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
6270: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
6280: 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  Tab, u8 eLock){.
6290: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
62a0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
62b0: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 2f 2a  ck *pIter;..  /*
62c0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
62d0: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
62e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
62f0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  led */.  if( 0==
6300: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
6310: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
6320: 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20  SharedData ){.  
6330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6340: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  OK;.  }..  /* Th
6350: 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c  is (along with l
6360: 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77  ockTable()) is w
6370: 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63  here the ReadUnc
6380: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
6390: 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
63a0: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
63b0: 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20  is querying for 
63c0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20  a read-lock and 
63d0: 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a  the flag is.  **
63e0: 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f   set, it is unco
63f0: 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e  nditionally gran
6400: 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68  ted - even if th
6410: 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f  ere are write-lo
6420: 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  cks.  ** on the 
6430: 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74  table. If a writ
6440: 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e-lock is reques
6450: 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63  ted, the ReadUnc
6460: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20  ommitted flag.  
6470: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
6480: 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ered..  **.  ** 
6490: 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b  In function lock
64a0: 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65  Table(), if a re
64b0: 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e  ad-lock is deman
64c0: 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ded and the .  *
64d0: 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  * ReadUncommitte
64e0: 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e  d flag is set, n
64f0: 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64  o entry is added
6500: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69   to the locks li
6510: 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72  st .  ** (BtShar
6520: 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a  ed.pLock)..  **.
6530: 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a    ** To summariz
6540: 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e  e: If the ReadUn
6550: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
6560: 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64  s set, then read
6570: 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a   cursors do.  **
6580: 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72   not create or r
6590: 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63  espect table loc
65a0: 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  ks. The locking 
65b0: 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20  procedure for a 
65c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73  .  ** write-curs
65d0: 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  or does not chan
65e0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  ge..  */.  if( .
65f0: 20 20 20 20 21 70 2d 3e 70 53 71 6c 69 74 65 20      !p->pSqlite 
6600: 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 70  || .    0==(p->p
6610: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
6620: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
6630: 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c  tted) || .    eL
6640: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
6650: 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53  ||.    iTab==MAS
6660: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
6670: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
6680: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
6690: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
66a0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
66b0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
66c0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
66d0: 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20 20 20  =iTab && .      
66e0: 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63      (pIter->eLoc
66f0: 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63  k!=eLock || eLoc
6700: 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b  k!=READ_LOCK) ){
6710: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6720: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
6730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6740: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6750: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
6760: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
6770: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
6780: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
6790: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
67a0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
67b0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
67c0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
67d0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
67e0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
67f0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
6800: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6810: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
6820: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
6830: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
6840: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
6850: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
6860: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61  tatic int lockTa
6880: 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ble(Btree *p, Pg
6890: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
68a0: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
68b0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
68c0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
68d0: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
68e0: 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Iter;..  /* This
68f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
6900: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
6910: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
6920: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
6930: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
6940: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
6950: 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74  dData ){.    ret
6960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6970: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
6980: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61  LITE_OK==queryTa
6990: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
69a0: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
69b0: 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75  /* If the read-u
69c0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
69d0: 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61  is set and a rea
69e0: 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  d-lock is reques
69f0: 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ted,.  ** return
6a00: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61   early without a
6a10: 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74  dding an entry t
6a20: 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  o the BtShared.p
6a30: 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20  Lock list. See. 
6a40: 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66   ** comment in f
6a50: 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62  unction queryTab
6a60: 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72  leLock() for mor
6a70: 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69  e info on handli
6a80: 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61  ng .  ** the Rea
6a90: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
6aa0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
6ab0: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 29 20     (p->pSqlite) 
6ac0: 26 26 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c  && .    (p->pSql
6ad0: 69 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  ite->flags&SQLIT
6ae0: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
6af0: 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63  d) && .    (eLoc
6b00: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26  k==READ_LOCK) &&
6b10: 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53  .    iTable!=MAS
6b20: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
6b30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6b40: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  OK;.  }..  /* Fi
6b50: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
6b60: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
6b70: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
6b80: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
6b90: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
6ba0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
6bb0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
6bc0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
6bd0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
6be0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
6bf0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
6c00: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
6c10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6c20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
6c30: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
6c40: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
6c50: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
6c60: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
6c70: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
6c80: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
6c90: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
6ca0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
6cb0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
6cc0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
6cd0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  ock *)sqliteMall
6ce0: 6f 63 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  oc(sizeof(BtLock
6cf0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
6d00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
6d10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6d20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
6d30: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
6d40: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
6d50: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
6d60: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
6d70: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
6d80: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
6d90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
6da0: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
6db0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
6dc0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
6dd0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
6de0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
6df0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
6e00: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
6e10: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
6e20: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
6e30: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
6e40: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
6e50: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
6e60: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
6e70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
6e80: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
6e90: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
6ea0: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
6eb0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
6ec0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
6ed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6ee0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
6ef0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
6f00: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
6f10: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
6f20: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
6f30: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
6f40: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
6f50: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
6f60: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
6f70: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
6f80: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
6f90: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
6fa0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  t->pLock;..  /* 
6fb0: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  If the shared-ca
6fc0: 63 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  che extension is
6fd0: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 2c 20 74 68   not enabled, th
6fe0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  ere should be no
6ff0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 74  .  ** locks in t
7000: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
7010: 6b 20 6c 69 73 74 2c 20 6d 61 6b 69 6e 67 20 74  k list, making t
7020: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 20  his procedure a 
7030: 6e 6f 2d 6f 70 2e 20 41 73 73 65 72 74 0a 20 20  no-op. Assert.  
7040: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
7050: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
7060: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7070: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
7080: 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44  ly()->useSharedD
7090: 61 74 61 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ata || 0==*ppIte
70a0: 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  r );..  while( *
70b0: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
70c0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
70d0: 70 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20 70  pIter;.    if( p
70e0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
70f0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
7100: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
7110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7120: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65  e(pLock);.    }e
7130: 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65  lse{.      ppIte
7140: 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78  r = &pLock->pNex
7150: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  t;.    }.  }.}.#
7160: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7170: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
7180: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
7190: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
71a0: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  CUUM./*.** These
71b0: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74   macros define t
71c0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
71d0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
71e0: 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a 20 64  ntry for a .** d
71f0: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
7200: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
7210: 20 74 6f 20 65 61 63 68 20 69 73 20 74 68 65 20   to each is the 
7220: 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  number of usable
7230: 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65 61 63  .** bytes on eac
7240: 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  h page of the da
7250: 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20 31 30  tabase (often 10
7260: 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  24). The second 
7270: 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
7280: 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70  umber to look up
7290: 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
72a0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  map..**.** PTRMA
72b0: 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72 6e 73  P_PAGENO returns
72c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
72d0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
72e0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
72f0: 70 61 67 65 20 74 68 61 74 20 73 74 6f 72 65 73  page that stores
7300: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 70 6f   the required po
7310: 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f 50 54  inter. PTRMAP_PT
7320: 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e 73 0a  ROFFSET returns.
7330: 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  ** the offset of
7340: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
7350: 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ap entry..**.** 
7360: 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72 67 75  If the pgno argu
7370: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 50  ment passed to P
7380: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69 73 20  TRMAP_PAGENO is 
7390: 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
73a0: 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67 6e 6f  ge,.** then pgno
73b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 53 6f   is returned. So
73c0: 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50   (pgno==PTRMAP_P
73d0: 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f  AGENO(pgsz, pgno
73e0: 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75 73 65  )) can be.** use
73f0: 64 20 74 6f 20 74 65 73 74 20 69 66 20 70 67 6e  d to test if pgn
7400: 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d  o is a pointer-m
7410: 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41 50 5f  ap page. PTRMAP_
7420: 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65 6e 74  ISPAGE implement
7430: 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74 2e 0a  s.** this test..
7440: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41  */.#define PTRMA
7450: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67  P_PAGENO(pBt, pg
7460: 6e 6f 29 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  no) ptrmapPageno
7470: 28 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64 65 66  (pBt, pgno).#def
7480: 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  ine PTRMAP_PTROF
7490: 46 53 45 54 28 70 42 74 2c 20 70 67 6e 6f 29 20  FSET(pBt, pgno) 
74a0: 28 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61 70 50  (5*(pgno-ptrmapP
74b0: 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29  ageno(pBt, pgno)
74c0: 2d 31 29 29 0a 23 64 65 66 69 6e 65 20 50 54 52  -1)).#define PTR
74d0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
74e0: 70 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f 50 41  pgno) (PTRMAP_PA
74f0: 47 45 4e 4f 28 28 70 42 74 29 2c 28 70 67 6e 6f  GENO((pBt),(pgno
7500: 29 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73 74 61  ))==(pgno))..sta
7510: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
7520: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
7530: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
7540: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
7550: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
7560: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
7570: 0a 20 20 69 6e 74 20 69 50 74 72 4d 61 70 20 3d  .  int iPtrMap =
7580: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7590: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 69 6e  PerMapPage;.  in
75a0: 74 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70  t ret = (iPtrMap
75b0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
75c0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
75d0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
75e0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
75f0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
7600: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
7610: 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
7620: 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20  map is a lookup 
7630: 74 61 62 6c 65 20 74 68 61 74 20 69 64 65 6e 74  table that ident
7640: 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74  ifies the parent
7650: 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65 61 63   page for.** eac
7660: 68 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 20  h child page in 
7670: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7680: 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74 20 70  e.  The parent p
7690: 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
76a0: 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  that.** contains
76b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
76c0: 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72 79 20  e child.  Every 
76d0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
76e0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  base contains.**
76f0: 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74 20 70   0 or 1 parent p
7700: 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69 73 20  ages.  (In this 
7710: 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62 61 73  context 'databas
7720: 65 20 70 61 67 65 27 20 72 65 66 65 72 73 0a 2a  e page' refers.*
7730: 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20 74 68  * to any page th
7740: 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  at is not part o
7750: 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  f the pointer ma
7760: 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61 63 68  p itself.)  Each
7770: 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20   pointer map.** 
7780: 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f  entry consists o
7790: 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  f a single byte 
77a0: 27 74 79 70 65 27 20 61 6e 64 20 61 20 34 20 62  'type' and a 4 b
77b0: 79 74 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  yte parent page 
77c0: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20 50  number..** The P
77d0: 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e 74 69  TRMAP_XXX identi
77e0: 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72 65 20  fiers below are 
77f0: 74 68 65 20 76 61 6c 69 64 20 74 79 70 65 73 2e  the valid types.
7800: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f  .**.** The purpo
7810: 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  se of the pointe
7820: 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61 63 69  r map is to faci
7830: 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61 67 65  lity moving page
7840: 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70 6f  s from one.** po
7850: 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69  sition in the fi
7860: 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 61 73  le to another as
7870: 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76 61 63   part of autovac
7880: 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70 61 67  uum.  When a pag
7890: 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c 20 74  e.** is moved, t
78a0: 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 69 74  he pointer in it
78b0: 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  s parent must be
78c0: 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
78d0: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20  t to the.** new 
78e0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  location.  The p
78f0: 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 75 73  ointer map is us
7900: 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
7910: 20 70 61 72 65 6e 74 20 70 61 67 65 20 71 75 69   parent page qui
7920: 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  ckly..**.** PTRM
7930: 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54 68 65  AP_ROOTPAGE: The
7940: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
7950: 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e 20 54  s a root-page. T
7960: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
7970: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
7980: 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20 69            used i
7990: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
79a0: 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  ** PTRMAP_FREEPA
79b0: 47 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  GE: The database
79c0: 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e 75 73   page is an unus
79d0: 65 64 20 28 66 72 65 65 29 20 70 61 67 65 2e 20  ed (free) page. 
79e0: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
79f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7a00: 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73 65 64       is not used
7a10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
7a20: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
7a30: 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74 61 62  FLOW1: The datab
7a40: 61 73 65 20 70 61 67 65 20 69 73 20 74 68 65 20  ase page is the 
7a50: 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 61 20  first page in a 
7a60: 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20 20 20  list of .**     
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
7a80: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
7a90: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 64  e page number id
7aa0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 67  entifies the pag
7ab0: 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  e that.**       
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
7ad0: 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 77 69  ains the cell wi
7ae0: 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  th a pointer to 
7af0: 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
7b00: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
7b10: 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68 65 20  _OVERFLOW2: The 
7b20: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73  database page is
7b30: 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 6c   the second or l
7b40: 61 74 65 72 20 70 61 67 65 20 69 6e 20 61 20 6c  ater page in a l
7b50: 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
7b70: 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
7b80: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64 65 6e  page-number iden
7b90: 74 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  tifies the previ
7ba0: 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ous.**          
7bb0: 20 20 20 20 20 20 20 20 20 70 61 67 65 20 69 6e           page in
7bc0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
7bd0: 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50  ge list..**.** P
7be0: 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54 68 65  TRMAP_BTREE: The
7bf0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
7c00: 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74 72  s a non-root btr
7c10: 65 65 20 70 61 67 65 2e 20 54 68 65 20 70 61 67  ee page. The pag
7c20: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
7c30: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
7c40: 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  fies the parent 
7c50: 70 61 67 65 20 69 6e 20 74 68 65 20 62 74 72 65  page in the btre
7c60: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54  e..*/.#define PT
7c70: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 31 0a  RMAP_ROOTPAGE 1.
7c80: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 46  #define PTRMAP_F
7c90: 52 45 45 50 41 47 45 20 32 0a 23 64 65 66 69 6e  REEPAGE 2.#defin
7ca0: 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  e PTRMAP_OVERFLO
7cb0: 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50 54 52  W1 3.#define PTR
7cc0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 34 0a  MAP_OVERFLOW2 4.
7cd0: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 42  #define PTRMAP_B
7ce0: 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57 72  TREE 5../*.** Wr
7cf0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
7d00: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
7d10: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
7d20: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
7d30: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7d40: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
7d50: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
7d60: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
7d70: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
7d80: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
7d90: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41  ber 'pgno'..** A
7da0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
7db0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
7dc0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7dd0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
7de0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
7df0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42   int ptrmapPut(B
7e00: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7e10: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
7e20: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a  , Pgno parent){.
7e30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7e40: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7e50: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50   map page */.  P
7e60: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 2f  gno iPtrmap;   /
7e70: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7e80: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
7e90: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7ea0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7eb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7ec0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
7ed0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7ee0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7ef0: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7f00: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7f10: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7f20: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7f30: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7f40: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7f50: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7f60: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7f70: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7f80: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
7f90: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7fa0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
7fb0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7fc0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7fd0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
7fe0: 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50  ager_get(pBt->pP
7ff0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 28  ager, iPtrmap, (
8000: 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d 61 70  void **)&pPtrmap
8010: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
8030: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
8040: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
8050: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
8060: 79 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  y);..  if( eType
8070: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
8080: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
8090: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
80a0: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
80b0: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
80c0: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
80d0: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
80e0: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
80f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
8100: 67 65 72 5f 77 72 69 74 65 28 70 50 74 72 6d 61  ger_write(pPtrma
8110: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
8120: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8130: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
8140: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
8150: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
8160: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
8170: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
8180: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  }..  sqlite3page
8190: 72 5f 75 6e 72 65 66 28 70 50 74 72 6d 61 70 29  r_unref(pPtrmap)
81a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
81b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
81c0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
81d0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
81e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
81f0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8200: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8210: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8220: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8230: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8240: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8250: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8260: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8270: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8280: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8290: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
82a0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
82b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
82c0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
82d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
82f0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8300: 6f 29 7b 0a 20 20 69 6e 74 20 69 50 74 72 6d 61  o){.  int iPtrma
8310: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8320: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8330: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8340: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8350: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8360: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
8370: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
8380: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8390: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
83a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 50  .  int rc;..  iP
83b0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
83c0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
83d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
83e0: 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50  ager_get(pBt->pP
83f0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 28  ager, iPtrmap, (
8400: 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d 61 70  void **)&pPtrmap
8410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8430: 0a 20 20 7d 0a 0a 20 20 6f 66 66 73 65 74 20 3d  .  }..  offset =
8440: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
8450: 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61  T(pBt, key);.  a
8460: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
8470: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
8480: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
8490: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
84a0: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
84b0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
84c0: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
84d0: 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 74 72  pager_unref(pPtr
84e0: 6d 61 70 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  map);.  if( *pET
84f0: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
8500: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
8510: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8520: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8530: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
8540: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
8550: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
8560: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
8570: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
8580: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
8590: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
85a0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
85b0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
85c0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
85d0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
85e0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
85f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
8600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8610: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
8620: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
8630: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
8640: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  low cells..*/.st
8650: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c  atic u8 *findCel
8660: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
8670: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
8680: 75 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  u8 *data = pPage
8690: 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72  ->aData;.  asser
86a0: 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20  t( iCell>=0 );. 
86b0: 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67   assert( iCell<g
86c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
86d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
86e0: 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  ]) );.  return d
86f0: 61 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26  ata + get2byte(&
8700: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
8710: 4f 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29  Offset+2*iCell])
8720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8730: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
8740: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
8750: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
8760: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
8770: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
8780: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65  rflow cells.  Se
8790: 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74  e insert.*/.stat
87a0: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
87b0: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
87c0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
87d0: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
87e0: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
87f0: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
8800: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
8810: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
8820: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
8830: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
8840: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
8850: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
8860: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
8870: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
8880: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
8890: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
88a0: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
88b0: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
88c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
88d0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
88e0: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
88f0: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
8900: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
8910: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
8920: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
8930: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
8940: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
8950: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61  is function.  pa
8960: 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20  rseCell() takes 
8970: 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20  a cell index.** 
8980: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
8990: 67 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65  gument and parse
89a0: 43 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20  CellPtr() takes 
89b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
89c0: 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20  .** body of the 
89d0: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
89e0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
89f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
8a00: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
8a10: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8a20: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8a30: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8a40: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a60: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8a70: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8a80: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8a90: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8aa0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8ab0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20   */.){.  int n; 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
8ae0: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
8af0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
8b00: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
8b10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8b20: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
8b30: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49  payload */..  pI
8b40: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
8b50: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
8b60: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
8b70: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
8b80: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
8b90: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
8ba0: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
8bb0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
8bc0: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
8bd0: 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  a ){.    n += ge
8be0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
8bf0: 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b  [n], &nPayload);
8c00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
8c10: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a  ayload = 0;.  }.
8c20: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
8c30: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28   nPayload;.  if(
8c40: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
8c50: 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  {.    n += getVa
8c60: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
8c70: 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e  (u64 *)&pInfo->n
8c80: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
8c90: 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20     u32 x;.    n 
8ca0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
8cb0: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20  pCell[n], &x);. 
8cc0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
8cd0: 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   x;.    nPayload
8ce0: 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e   += x;.  }.  pIn
8cf0: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
8d00: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
8d10: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
8d30: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
8d40: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
8d50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
8d60: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
8d70: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8d80: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
8d90: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
8da0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  */.    int nSize
8db0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
8dc0: 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  tal size of cell
8dd0: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65   content in byte
8de0: 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  s */.    pInfo->
8df0: 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61  nLocal = nPayloa
8e00: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
8e10: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
8e20: 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61   nSize = nPayloa
8e30: 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e  d + n;.    if( n
8e40: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20  Size<4 ){.      
8e50: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
8e60: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
8e70: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
8e80: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
8e90: 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20  nSize = nSize;. 
8ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
8eb0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
8ec0: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
8ed0: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
8ee0: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
8ef0: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
8f00: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8f10: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8f20: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8f30: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
8f40: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
8f50: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
8f60: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
8f70: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
8f80: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
8f90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
8fa0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
8fb0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
8fc0: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
8fd0: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
8fe0: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
8ff0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
9000: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
9010: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
9020: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
9030: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
9040: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
9050: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9060: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9070: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
9080: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9090: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
90a0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
90b0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
90c0: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
90d0: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
90e0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
90f0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
9100: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
9110: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9120: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9130: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9140: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
9150: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
9160: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
9170: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
9180: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
9190: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
91a0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
91b0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
91c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
91d0: 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70  4);.    if( surp
91e0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
91f0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
9200: 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73  nLocal = surplus
9210: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9220: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9230: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
9240: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
9250: 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d  verflow = pInfo-
9260: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20  >nLocal + n;.   
9270: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9280: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
9290: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74   + 4;.  }.}.stat
92a0: 69 63 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c  ic void parseCel
92b0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
92c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
92d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
92e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
92f0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
9300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
9310: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
9320: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
9330: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9340: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9350: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9360: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
9370: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
9380: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
9390: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
93a0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
93b0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
93c0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
93d0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
93e0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
93f0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
9400: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
9410: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
9420: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
9430: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
9440: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
9450: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
9460: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
9470: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
9480: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
9490: 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ter..*/.#ifndef 
94a0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
94b0: 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  t cellSize(MemPa
94c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
94d0: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
94e0: 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43  o info;.  parseC
94f0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9500: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
9510: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
9520: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
9530: 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  nt cellSizePtr(M
9540: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
9550: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
9560: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61  lInfo info;.  pa
9570: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
9580: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
9590: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
95a0: 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Size;.}..#ifndef
95b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
95c0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
95d0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
95e0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
95f0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
9600: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
9610: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
9620: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
9630: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
9640: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
9650: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
9660: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
9670: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
9680: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9690: 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70  *pCell){.  if( p
96a0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c  Cell ){.    Cell
96b0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
96c0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
96d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
96e0: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e  ;.    if( (info.
96f0: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
9700: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
9710: 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
9720: 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66  {.      Pgno ovf
9730: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
9740: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
9750: 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ow]);.      retu
9760: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
9770: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9780: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9790: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
97a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
97b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
97c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
97d0: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
97e0: 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20  l on page pPage 
97f0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
9800: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
9810: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
9820: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
9830: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
9840: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
9850: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
9860: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
9870: 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tOvfl(MemPage *p
9880: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
9890: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  {.  u8 *pCell;. 
98a0: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
98b0: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
98c0: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
98d0: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
98e0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
98f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
9900: 2a 2a 20 44 6f 20 73 61 6e 69 74 79 20 63 68 65  ** Do sanity che
9910: 63 6b 69 6e 67 20 6f 6e 20 61 20 70 61 67 65 2e  cking on a page.
9920: 20 20 54 68 72 6f 77 20 61 6e 20 65 78 63 65 70    Throw an excep
9930: 74 69 6f 6e 20 69 66 20 61 6e 79 74 68 69 6e 67  tion if anything
9940: 20 69 73 0a 2a 2a 20 6e 6f 74 20 72 69 67 68 74   is.** not right
9950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9960: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
9970: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
9980: 63 68 65 63 6b 69 6e 67 20 6f 6e 6c 79 2e 20 20  checking only.  
9990: 49 74 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  It is omitted.**
99a0: 20 66 72 6f 6d 20 6d 6f 73 74 20 62 75 69 6c 64   from most build
99b0: 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
99c0: 64 28 42 54 52 45 45 5f 44 45 42 55 47 29 20 26  d(BTREE_DEBUG) &
99d0: 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  & !defined(NDEBU
99e0: 47 29 20 26 26 20 30 0a 73 74 61 74 69 63 20 76  G) && 0.static v
99f0: 6f 69 64 20 5f 70 61 67 65 49 6e 74 65 67 72 69  oid _pageIntegri
9a00: 74 79 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ty(MemPage *pPag
9a10: 65 29 7b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  e){.  int usable
9a20: 53 69 7a 65 3b 0a 20 20 75 38 20 2a 64 61 74 61  Size;.  u8 *data
9a30: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 69 64  ;.  int i, j, id
9a40: 78 2c 20 63 2c 20 70 63 2c 20 68 64 72 2c 20 6e  x, c, pc, hdr, n
9a50: 46 72 65 65 3b 0a 20 20 69 6e 74 20 63 65 6c 6c  Free;.  int cell
9a60: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 43  Offset;.  int nC
9a70: 65 6c 6c 2c 20 63 65 6c 6c 4c 69 6d 69 74 3b 0a  ell, cellLimit;.
9a80: 20 20 75 38 20 2a 75 73 65 64 3b 0a 0a 20 20 75    u8 *used;..  u
9a90: 73 65 64 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  sed = sqliteMall
9aa0: 6f 63 52 61 77 28 20 70 50 61 67 65 2d 3e 70 42  ocRaw( pPage->pB
9ab0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
9ac0: 20 69 66 28 20 75 73 65 64 3d 3d 30 20 29 20 72   if( used==0 ) r
9ad0: 65 74 75 72 6e 3b 0a 20 20 75 73 61 62 6c 65 53  eturn;.  usableS
9ae0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9af0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9b00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
9b10: 44 61 74 61 3d 3d 26 28 28 75 6e 73 69 67 6e 65  Data==&((unsigne
9b20: 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d  d char*)pPage)[-
9b30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
9b40: 53 69 7a 65 5d 20 29 3b 0a 20 20 68 64 72 20 3d  Size] );.  hdr =
9b50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9b60: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64 72  t;.  assert( hdr
9b70: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
9b80: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
9b90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9ba0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61  >pgno==sqlite3pa
9bb0: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70  ger_pagenumber(p
9bc0: 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
9bd0: 20 20 63 20 3d 20 70 50 61 67 65 2d 3e 61 44 61    c = pPage->aDa
9be0: 74 61 5b 68 64 72 5d 3b 0a 20 20 69 66 28 20 70  ta[hdr];.  if( p
9bf0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
9c00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9c10: 65 2d 3e 6c 65 61 66 20 3d 3d 20 28 28 63 20 26  e->leaf == ((c &
9c20: 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 29 20 29   PTF_LEAF)!=0) )
9c30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9c40: 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 3d  age->zeroData ==
9c50: 20 28 28 63 20 26 20 50 54 46 5f 5a 45 52 4f 44   ((c & PTF_ZEROD
9c60: 41 54 41 29 21 3d 30 29 20 29 3b 0a 20 20 20 20  ATA)!=0) );.    
9c70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9c80: 65 61 66 44 61 74 61 20 3d 3d 20 28 28 63 20 26  eafData == ((c &
9c90: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 29 21 3d   PTF_LEAFDATA)!=
9ca0: 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
9cb0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
9cc0: 3d 3d 20 28 28 63 20 26 20 28 50 54 46 5f 49 4e  == ((c & (PTF_IN
9cd0: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
9ce0: 41 29 29 21 3d 30 29 20 29 3b 0a 20 20 20 20 61  A))!=0) );.    a
9cf0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 61  ssert( pPage->ha
9d00: 73 44 61 74 61 20 3d 3d 0a 20 20 20 20 20 20 20  sData ==.       
9d10: 20 20 20 20 20 20 21 28 70 50 61 67 65 2d 3e 7a        !(pPage->z
9d20: 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61  eroData || (!pPa
9d30: 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67  ge->leaf && pPag
9d40: 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 20 29 3b  e->leafData)) );
9d50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9d60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3d 3d  ge->cellOffset==
9d70: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9d80: 2b 31 32 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  +12-4*pPage->lea
9d90: 66 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f );.    assert(
9da0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
9db0: 67 65 74 32 62 79 74 65 28 26 70 50 61 67 65 2d  get2byte(&pPage-
9dc0: 3e 61 44 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  >aData[hdr+3]) )
9dd0: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 20 3d 20 70  ;.  }.  data = p
9de0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  Page->aData;.  m
9df0: 65 6d 73 65 74 28 75 73 65 64 2c 20 30 2c 20 75  emset(used, 0, u
9e00: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 66 6f  sableSize);.  fo
9e10: 72 28 69 3d 30 3b 20 69 3c 68 64 72 2b 31 30 2d  r(i=0; i<hdr+10-
9e20: 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 20 69  pPage->leaf*4; i
9e30: 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b  ++) used[i] = 1;
9e40: 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
9e50: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
9e60: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77  ata[hdr+1]);.  w
9e70: 68 69 6c 65 28 20 70 63 20 29 7b 0a 20 20 20 20  hile( pc ){.    
9e80: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 20 20 61 73  int size;.    as
9e90: 73 65 72 74 28 20 70 63 3e 30 20 26 26 20 70 63  sert( pc>0 && pc
9ea0: 3c 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  <usableSize-4 );
9eb0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
9ec0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9ed0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9ee0: 63 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  c+size<=usableSi
9ef0: 7a 65 20 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  ze );.    nFree 
9f00: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 66 6f 72  += size;.    for
9f10: 28 69 3d 70 63 3b 20 69 3c 70 63 2b 73 69 7a 65  (i=pc; i<pc+size
9f20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
9f30: 73 65 72 74 28 20 75 73 65 64 5b 69 5d 3d 3d 30  sert( used[i]==0
9f40: 20 29 3b 0a 20 20 20 20 20 20 75 73 65 64 5b 69   );.      used[i
9f50: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 1;.    }.   
9f60: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
9f70: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 0a 20  data[pc]);.  }. 
9f80: 20 69 64 78 20 3d 20 30 3b 0a 20 20 6e 43 65 6c   idx = 0;.  nCel
9f90: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
9fa0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
9fb0: 6c 6c 4c 69 6d 69 74 20 3d 20 67 65 74 32 62 79  llLimit = get2by
9fc0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9fd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9fe0: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 0a 20 20  e->isInit==0 .  
9ff0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 2d         || pPage-
a000: 3e 6e 46 72 65 65 3d 3d 6e 46 72 65 65 2b 64 61  >nFree==nFree+da
a010: 74 61 5b 68 64 72 2b 37 5d 2b 63 65 6c 6c 4c 69  ta[hdr+7]+cellLi
a020: 6d 69 74 2d 28 63 65 6c 6c 4f 66 66 73 65 74 2b  mit-(cellOffset+
a030: 32 2a 6e 43 65 6c 6c 29 20 29 3b 0a 20 20 63 65  2*nCell) );.  ce
a040: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a050: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a060: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
a070: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
a080: 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 67  size;.    pc = g
a090: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
a0a0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 69 5d 29 3b 0a  llOffset+2*i]);.
a0b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 30      assert( pc>0
a0c0: 20 26 26 20 70 63 3c 75 73 61 62 6c 65 53 69 7a   && pc<usableSiz
a0d0: 65 2d 34 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  e-4 );.    size 
a0e0: 3d 20 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  = cellSize(pPage
a0f0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
a100: 20 20 61 73 73 65 72 74 28 20 70 63 2b 73 69 7a    assert( pc+siz
a110: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e<=usableSize );
a120: 0a 20 20 20 20 66 6f 72 28 6a 3d 70 63 3b 20 6a  .    for(j=pc; j
a130: 3c 70 63 2b 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a  <pc+size; j++){.
a140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73        assert( us
a150: 65 64 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  ed[j]==0 );.    
a160: 20 20 75 73 65 64 5b 6a 5d 20 3d 20 31 3b 0a 20    used[j] = 1;. 
a170: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
a180: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
a190: 65 6c 6c 3b 20 69 3c 63 65 6c 6c 69 6d 69 74 3b  ell; i<cellimit;
a1a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
a1b0: 74 28 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29 3b  t( used[i]==0 );
a1c0: 0a 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31  .    used[i] = 1
a1d0: 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20  ;.  }.  nFree = 
a1e0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
a1f0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
a200: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 73  {.    assert( us
a210: 65 64 5b 69 5d 3c 3d 31 20 29 3b 0a 20 20 20 20  ed[i]<=1 );.    
a220: 69 66 28 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29  if( used[i]==0 )
a230: 20 6e 46 72 65 65 2b 2b 3b 0a 20 20 7d 0a 20 20   nFree++;.  }.  
a240: 61 73 73 65 72 74 28 20 6e 46 72 65 65 3d 3d 64  assert( nFree==d
a250: 61 74 61 5b 68 64 72 2b 37 5d 20 29 3b 0a 20 20  ata[hdr+7] );.  
a260: 73 71 6c 69 74 65 46 72 65 65 28 75 73 65 64 29  sqliteFree(used)
a270: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 67 65  ;.}.#define page
a280: 49 6e 74 65 67 72 69 74 79 28 58 29 20 5f 70 61  Integrity(X) _pa
a290: 67 65 49 6e 74 65 67 72 69 74 79 28 58 29 0a 23  geIntegrity(X).#
a2a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
a2b0: 67 65 49 6e 74 65 67 72 69 74 79 28 58 29 0a 23  geIntegrity(X).#
a2c0: 65 6e 64 69 66 0a 0a 2f 2a 20 41 20 62 75 6e 63  endif../* A bunc
a2d0: 68 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  h of assert() st
a2e0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 63 68 65 63  atements to chec
a2f0: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
a300: 6e 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  n state variable
a310: 73 0a 2a 2a 20 6f 66 20 68 61 6e 64 6c 65 20 70  s.** of handle p
a320: 20 28 74 79 70 65 20 42 74 72 65 65 2a 29 20 61   (type Btree*) a
a330: 72 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  re internally co
a340: 6e 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 23 64 65  nsistent..*/.#de
a350: 66 69 6e 65 20 62 74 72 65 65 49 6e 74 65 67 72  fine btreeIntegr
a360: 69 74 79 28 70 29 20 5c 0a 20 20 61 73 73 65 72  ity(p) \.  asser
a370: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  t( p->inTrans!=T
a380: 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e  RANS_NONE || p->
a390: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
a3a0: 6e 3c 70 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29  n<p->pBt->nRef )
a3b0: 3b 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ; \.  assert( p-
a3c0: 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
a3d0: 6f 6e 3c 3d 70 2d 3e 70 42 74 2d 3e 6e 52 65 66  on<=p->pBt->nRef
a3e0: 20 29 3b 20 5c 0a 20 20 61 73 73 65 72 74 28 20   ); \.  assert( 
a3f0: 70 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  p->pBt->inTransa
a400: 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 4e 4f 4e  ction!=TRANS_NON
a410: 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72  E || p->pBt->nTr
a420: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 29 3b 20  ansaction==0 ); 
a430: 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  \.  assert( p->p
a440: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
a450: 6e 3e 3d 70 2d 3e 69 6e 54 72 61 6e 73 20 29 3b  n>=p->inTrans );
a460: 20 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d   ../*.** Defragm
a470: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
a480: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
a490: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
a4a0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
a4b0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
a4c0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
a4d0: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
a4e0: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
a4f0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
a500: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
a510: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
a520: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
a530: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a550: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
a560: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
a570: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a590: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
a5a0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5c0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74  Address of a i-t
a5d0: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
a5e0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
a5f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
a600: 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61   of first byte a
a610: 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65  fter cell pointe
a620: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
a630: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
a640: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
a650: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
a660: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
a670: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
a680: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a690: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
a6a0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
a6b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a6c0: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
a6d0: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
a6e0: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
a6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
a700: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
a710: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
a720: 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20  /.  int brk;    
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a740: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
a750: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a760: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
a770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a780: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a790: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
a7a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
a7b0: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
a7c0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
a7d0: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
a7e0: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
a7f0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
a800: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
a810: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
a820: 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
a830: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44  teable(pPage->aD
a840: 61 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ata) );.  assert
a850: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
a860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a870: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a880: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
a890: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
a8a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a8b0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
a8c0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d    temp = sqliteM
a8d0: 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42  alloc( pPage->pB
a8e0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
a8f0: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72   if( temp==0 ) r
a900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a910: 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  EM;.  data = pPa
a920: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
a930: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
a940: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
a950: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
a960: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
a970: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
a980: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
a990: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a9a0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
a9b0: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
a9c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
a9d0: 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
a9e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
a9f0: 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b  .  memcpy(&temp[
aa00: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
aa10: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62  , usableSize - b
aa20: 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61  rk);.  brk = usa
aa30: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
aa40: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
aa50: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
aa60: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
aa70: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
aa80: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
aa90: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
aaa0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
aab0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
aac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
aad0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
aae0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
aaf0: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
ab00: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
ab10: 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73  ]);.    brk -= s
ab20: 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ize;.    memcpy(
ab30: 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d  &data[brk], &tem
ab40: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
ab50: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
ab60: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73  , brk);.  }.  as
ab70: 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f  sert( brk>=cellO
ab80: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
ab90: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
aba0: 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a  a[hdr+5], brk);.
abb0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
abc0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
abd0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
abe0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
abf0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
ac00: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
ac10: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62  data[addr], 0, b
ac20: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  rk-addr);.  sqli
ac30: 74 65 46 72 65 65 28 74 65 6d 70 29 3b 0a 20 20  teFree(temp);.  
ac40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ac50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
ac60: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
ac70: 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61  of space on a pa
ac80: 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ge..**.** Return
ac90: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
aca0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f  pPage->aData[] o
acb0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
acc0: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61   of.** the new a
acd0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65  llocation. Or re
ace0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
acf0: 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72  is not enough fr
ad00: 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74  ee.** space on t
ad10: 68 65 20 70 61 67 65 20 74 6f 20 73 61 74 69 73  he page to satis
ad20: 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  fy the allocatio
ad30: 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  n request..**.**
ad40: 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   If the page con
ad50: 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66 20  tains nBytes of 
ad60: 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20 64  free space but d
ad70: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  oes not contain.
ad80: 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e  ** nBytes of con
ad90: 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70 61  tiguous free spa
ada0: 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ce, then this ro
adb0: 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63 61  utine automatica
adc0: 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66  lly.** calls def
add0: 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20 74  ragementPage() t
ade0: 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c  o consolidate al
adf0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65 66  l free space bef
ae00: 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  ore .** allocati
ae10: 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e 6b  ng the new chunk
ae20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ae30: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
ae40: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ae50: 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  t nByte){.  int 
ae60: 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20  addr, pc, hdr;. 
ae70: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74   int size;.  int
ae80: 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f   nFrag;.  int to
ae90: 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  p;.  int nCell;.
aea0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
aeb0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
aec0: 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64 61  r *data;.  .  da
aed0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
aee0: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  a;.  assert( sql
aef0: 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
af00: 65 61 62 6c 65 28 64 61 74 61 29 20 29 3b 0a 20  eable(data) );. 
af10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af20: 70 42 74 20 29 3b 0a 20 20 69 66 28 20 6e 42 79  pBt );.  if( nBy
af30: 74 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34  te<4 ) nByte = 4
af40: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
af50: 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50  Free<nByte || pP
af60: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
af70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
af80: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e  Page->nFree -= n
af90: 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50  Byte;.  hdr = pP
afa0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
afb0: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
afc0: 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46  hdr+7];.  if( nF
afd0: 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a  rag<60 ){.    /*
afe0: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
aff0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
b000: 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75   a slot big enou
b010: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
b020: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72  e.    ** space r
b030: 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61  equest. */.    a
b040: 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20  ddr = hdr+1;.   
b050: 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65   while( (pc = ge
b060: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
b070: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  r]))>0 ){.      
b080: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
b090: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
b0a0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
b0b0: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
b0c0: 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20  f( size<nByte+4 
b0d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
b0e0: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
b0f0: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
b100: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
b110: 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20  dr+7] = nFrag + 
b120: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
b130: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
b140: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
b150: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  {.          put2
b160: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
b170: 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20  , size-nByte);. 
b180: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b190: 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  pc + size - nByt
b1a0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
b1b0: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
b1c0: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
b1d0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
b1e0: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
b1f0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
b200: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
b210: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
b220: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
b230: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
b240: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b250: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
b260: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b270: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
b280: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
b290: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
b2a0: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
b2b0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
b2c0: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
b2d0: 79 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64  yte ){.    if( d
b2e0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b2f0: 61 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  age) ) return 0;
b300: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
b310: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b320: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
b330: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
b340: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
b350: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
b360: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b370: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
b380: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
b390: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
b3a0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
b3b0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
b3c0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
b3d0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b3e0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
b3f0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
b400: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
b410: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
b420: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
b430: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
b440: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
b450: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
b460: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
b470: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
b480: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
b490: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
b4a0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
b4b0: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
b4c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
b4d0: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
b4e0: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
b4f0: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
b500: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
b510: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
b520: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
b530: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
b540: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b550: 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
b560: 6c 65 28 64 61 74 61 29 20 29 3b 0a 20 20 61 73  le(data) );.  as
b570: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
b580: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
b590: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
b5a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
b5b0: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
b5c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b5d0: 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73  eSize );.  if( s
b5e0: 69 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34  ize<4 ) size = 4
b5f0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
b600: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
b610: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
b620: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
b630: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
b640: 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c  n the SECURE_DEL
b650: 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  ETE .  ** option
b660: 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63   is enabled at c
b670: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20  ompile-time */. 
b680: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74   memset(&data[st
b690: 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a  art], 0, size);.
b6a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
b6b0: 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20   the space back 
b6c0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
b6d0: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
b6e0: 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  ks */.  hdr = pP
b6f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
b700: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
b710: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
b720: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
b730: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
b740: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
b750: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
b760: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
b770: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
b780: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
b790: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
b7a0: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
b7b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
b7c0: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
b7d0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
b7e0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
b7f0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
b800: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
b810: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
b820: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
b830: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
b840: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
b850: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
b860: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
b870: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a  ge->nFree += siz
b880: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
b890: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
b8a0: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
b8b0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
b8c0: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
b8d0: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
b8e0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
b8f0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
b900: 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20  pnext, psize;.  
b910: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
b920: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
b930: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
b940: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b950: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65  ize-4 );.    pne
b960: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
b970: 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20  ata[pbegin]);.  
b980: 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79    psize = get2by
b990: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b9a0: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  2]);.    if( pbe
b9b0: 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20  gin + psize + 3 
b9c0: 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78  >= pnext && pnex
b9d0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
b9e0: 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20   frag = pnext - 
b9f0: 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a  (pbegin+psize);.
ba00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72        assert( fr
ba10: 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e  ag<=data[pPage->
ba20: 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a  hdrOffset+7] );.
ba30: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
ba40: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
ba50: 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75  = frag;.      pu
ba60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ba70: 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26  gin], get2byte(&
ba80: 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20  data[pnext]));. 
ba90: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
baa0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70  ata[pbegin+2], p
bab0: 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64  next+get2byte(&d
bac0: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62  ata[pnext+2])-pb
bad0: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  egin);.    }else
bae0: 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  {.      addr = p
baf0: 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begin;.    }.  }
bb00: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65  ..  /* If the ce
bb10: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
bb20: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72  begins with a fr
bb30: 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20  eeblock, remove 
bb40: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74  it. */.  if( dat
bb50: 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68  a[hdr+1]==data[h
bb60: 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64  dr+5] && data[hd
bb70: 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36  r+2]==data[hdr+6
bb80: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70  ] ){.    int top
bb90: 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67  ;.    pbegin = g
bba0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
bbb0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+1]);.    memcp
bbc0: 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  y(&data[hdr+1], 
bbd0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32  &data[pbegin], 2
bbe0: 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  );.    top = get
bbf0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bc00: 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  5]);.    put2byt
bc10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
bc20: 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26  top + get2byte(&
bc30: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29  data[pbegin+2]))
bc40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
bc50: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
bc60: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
bc70: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
bc80: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
bc90: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
bca0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
bcb0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
bcc0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
bcd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63  .static void dec
bce0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
bcf0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
bd00: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
bd10: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
bd20: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
bd30: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
bd50: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
bd60: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
bd70: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  );.  pPage->intK
bd80: 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26  ey = (flagByte &
bd90: 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46   (PTF_INTKEY|PTF
bda0: 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a  _LEAFDATA))!=0;.
bdb0: 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74    pPage->zeroDat
bdc0: 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  a = (flagByte & 
bdd0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30  PTF_ZERODATA)!=0
bde0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
bdf0: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
be00: 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50  F_LEAF)!=0;.  pP
be10: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
be20: 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65  e = 4*(pPage->le
be30: 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20  af==0);.  pBt = 
be40: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
be50: 28 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46  ( flagByte & PTF
be60: 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20  _LEAFDATA ){.   
be70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
be80: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
be90: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
bea0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
beb0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
bec0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
bed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
bee0: 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a  ->leafData = 0;.
bef0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
bf00: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
bf10: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
bf20: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
bf30: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
bf40: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
bf50: 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
bf60: 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
bf70: 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
bf80: 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a  afData));.}../*.
bf90: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
bfa0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
bfb0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
bfc0: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
bfd0: 54 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  The pParent para
bfe0: 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20  meter must be a 
bff0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
c000: 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20  emPage which.** 
c010: 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  is the parent of
c020: 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
c030: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
c040: 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42  e root of a.** B
c050: 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65  Tree has no pare
c060: 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68  nt and so for th
c070: 61 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74  at page, pParent
c080: 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ==NULL..**.** Re
c090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
c0a0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
c0b0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
c0c0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
c0d0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
c0e0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
c0f0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
c100: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
c110: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
c120: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
c130: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
c140: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
c150: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
c160: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
c170: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
c180: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
c190: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
c1a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
c1b0: 6e 74 20 69 6e 69 74 50 61 67 65 28 0a 20 20 4d  nt initPage(.  M
c1c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
c1d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
c1e0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
c1f0: 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  zed */.  MemPage
c200: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20   *pParent       
c210: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20  /* The parent.  
c220: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c230: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  .){.  int pc;   
c240: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c250: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
c260: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
c270: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  >aData[] */.  in
c280: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
c290: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
c2a0: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
c2b0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
c2c0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
c2d0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
c2e0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
c2f0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
c300: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
c310: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
c320: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
c330: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
c340: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
c350: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
c360: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
c370: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
c380: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
c390: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
c3a0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
c3b0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
c3c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
c3d0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
c3e0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
c3f0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
c400: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
c410: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
c420: 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20   area */..  pBt 
c430: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
c440: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
c450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
c460: 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  ent==0 || pParen
c470: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
c480: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c490: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67  pgno==sqlite3pag
c4a0: 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70 50  er_pagenumber(pP
c4b0: 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
c4c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c4d0: 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69  aData == &((unsi
c4e0: 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65  gned char*)pPage
c4f0: 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
c500: 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ] );.  if( pPage
c510: 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65  ->pParent!=pPare
c520: 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50  nt && (pPage->pP
c530: 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67  arent!=0 || pPag
c540: 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20  e->isInit) ){.  
c550: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
c560: 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  page should neve
c570: 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20  r change unless 
c580: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
c590: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
c5a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5b0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
c5c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
c5d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c5e0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
c5f0: 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50  pParent==0 && pP
c600: 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20  arent!=0 ){.    
c610: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
c620: 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71   pParent;.    sq
c630: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 70  lite3pager_ref(p
c640: 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
c650: 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
c660: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
c670: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c680: 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  ata;.  decodeFla
c690: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
c6a0: 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  dr]);.  pPage->n
c6b0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
c6c0: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
c6d0: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
c6e0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
c6f0: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
c700: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
c710: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
c720: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
c730: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
c740: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c750: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c760: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c770: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28  a[hdr+3]);.  if(
c780: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
c790: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
c7a0: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
c7b0: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
c7c0: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
c7d0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
c7e0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
c7f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c800: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
c810: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ge->nCell==0 && 
c820: 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50  pParent!=0 && pP
c830: 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  arent->pgno!=1 )
c840: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67  {.    /* All pag
c850: 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20  es must have at 
c860: 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20  least one cell, 
c870: 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20  except for root 
c880: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  pages */.    ret
c890: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c8a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
c8b0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c8c0: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c8d0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c8e0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c8f0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
c900: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
c910: 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c  +7] + top - (cel
c920: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
c930: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69  e->nCell);.  whi
c940: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
c950: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
c960: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
c970: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
c980: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69   /* Free block i
c990: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
c9a0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
c9b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c9c0: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
c9d0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
c9e0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73  data[pc]);.    s
c9f0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
ca00: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
ca10: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
ca20: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
ca30: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
ca40: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
ca50: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
ca60: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
ca70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ca80: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
ca90: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
caa0: 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a  .    pc = next;.
cab0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
cac0: 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66  ee = nFree;.  if
cad0: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
cae0: 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72  ize ){.    /* Fr
caf0: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
cb00: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
cb10: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65  e size */.    re
cb20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
cb30: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
cb40: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
cb50: 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e 74 65 67  = 1;.  pageInteg
cb60: 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20 72  rity(pPage);.  r
cb70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
cb90: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
cba0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
cbb0: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
cbc0: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
cbd0: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
cbe0: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
cbf0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
cc00: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
cc10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
cc20: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
cc30: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
cc40: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
cc50: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
cc60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
cc70: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
cc80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61  ssert( sqlite3pa
cc90: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 64  ger_pagenumber(d
cca0: 61 74 61 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  ata)==pPage->pgn
ccb0: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
ccc0: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
ccd0: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
cce0: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
ccf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cd00: 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
cd10: 6c 65 28 64 61 74 61 29 20 29 3b 0a 20 20 6d 65  le(data) );.  me
cd20: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
cd30: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
cd40: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61  ize - hdr);.  da
cd50: 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b  ta[hdr] = flags;
cd60: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
cd70: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
cd80: 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20  TF_LEAF)==0);.  
cd90: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
cda0: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
cdb0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
cdc0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
cdd0: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
cde0: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
cdf0: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  e->nFree = pBt->
ce00: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
ce10: 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  st;.  decodeFlag
ce20: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
ce30: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
ce40: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
ce50: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
ce60: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
ce70: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
ce80: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
ce90: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  t = 0;.  pPage->
cea0: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
ceb0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
cec0: 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28    pageIntegrity(
ced0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cee0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
cef0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
cf00: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
cf10: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
cf20: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
cf30: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
cf40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
cf50: 65 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20  etPage(BtShared 
cf60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pBt, Pgno pgno,
cf70: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
cf80: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
cf90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
cfa0: 44 61 74 61 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Data;.  MemPage 
cfb0: 2a 70 50 61 67 65 3b 0a 20 20 72 63 20 3d 20 73  *pPage;.  rc = s
cfc0: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
cfd0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
cfe0: 6f 2c 20 28 76 6f 69 64 2a 2a 29 26 61 44 61 74  o, (void**)&aDat
cff0: 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  a);.  if( rc ) r
d000: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
d010: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  e = (MemPage*)&a
d020: 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
d030: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ze];.  pPage->aD
d040: 61 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70  ata = aData;.  p
d050: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
d060: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
d070: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
d080: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
d090: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
d0a0: 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20   : 0;.  *ppPage 
d0b0: 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = pPage;.  retur
d0c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0d0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
d0e0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d0f0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
d100: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
d110: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
d120: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
d130: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
d140: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65  e calls to.** ge
d150: 74 50 61 67 65 28 29 20 61 6e 64 20 69 6e 69 74  tPage() and init
d160: 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
d170: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
d180: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d190: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
d1a0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d1b0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d1c0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
d1d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
d1e0: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
d1f0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
d200: 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e,    /* Write t
d210: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
d220: 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  here */.  MemPag
d230: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f  e *pParent     /
d240: 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20  * Parent of the 
d250: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
d260: 20 72 63 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d   rc;.  if( pgno=
d270: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d280: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d290: 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20  BKPT; .  }.  rc 
d2a0: 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 70  = getPage(pBt, p
d2b0: 67 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  gno, ppPage);.  
d2c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d2d0: 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e  K && (*ppPage)->
d2e0: 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
d2f0: 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 2a   rc = initPage(*
d300: 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  ppPage, pParent)
d310: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d320: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
d330: 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
d340: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
d350: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
d360: 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
d370: 6c 20 74 6f 20 67 65 74 50 61 67 65 2e 0a 2a 2f  l to getPage..*/
d380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d390: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d3a0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d3b0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d3c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d3d0: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d3e0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d3f0: 20 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67     assert( &pPag
d400: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
d410: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d  pBt->pageSize]==
d420: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
d430: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 73 71 6c  pPage );.    sql
d440: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
d450: 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
d460: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
d470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d480: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
d490: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
d4a0: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
d4b0: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
d4c0: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
d4d0: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
d4e0: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
d4f0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
d500: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
d510: 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  r(void *pData, i
d520: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
d530: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
d540: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
d550: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
d560: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
d570: 65 2a 29 26 28 28 63 68 61 72 2a 29 70 44 61 74  e*)&((char*)pDat
d580: 61 29 5b 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  a)[pageSize];.  
d590: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
d5a0: 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  nt ){.    MemPag
d5b0: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
d5c0: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
d5d0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
d5e0: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
d5f0: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
d600: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
d610: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
d620: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
d630: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
d640: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
d650: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
d660: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
d670: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
d680: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
d690: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
d6a0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d6b0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
d6c0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
d6d0: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
d6e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
d6f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d700: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
d710: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
d720: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
d730: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
d740: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
d750: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
d760: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
d770: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 76 6f  id pageReinit(vo
d780: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70  id *pData, int p
d790: 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50  ageSize){.  MemP
d7a0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
d7b0: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
d7c0: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61  & 7)==0 );.  pPa
d7d0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  ge = (MemPage*)&
d7e0: 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 70  ((char*)pData)[p
d7f0: 61 67 65 53 69 7a 65 5d 3b 0a 20 20 69 66 28 20  ageSize];.  if( 
d800: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
d810: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d820: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 69 74  it = 0;.    init
d830: 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
d840: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e->pParent);.  }
d850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d860: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d870: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d880: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d890: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d8a0: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d8b0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65   is NULL.** a ne
d8c0: 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  w database with 
d8d0: 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73  a random name is
d8e0: 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20   created.  This 
d8f0: 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a  randomly named.*
d900: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
d910: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
d920: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
d930: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
d940: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
d950: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
d960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d970: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
d980: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
d990: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
d9a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
d9b0: 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20  lite3 *pSqlite, 
d9c0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
d9d0: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
d9e0: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
d9f0: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
da00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
da10: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
da20: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
da30: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
da50: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  ions */.){.  BtS
da60: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
da70: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
da80: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
da90: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
daa0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
dab0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
dac0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
dad0: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65   rc;.  int nRese
dae0: 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  rve;.  unsigned 
daf0: 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
db00: 30 30 5d 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  00];.#if !define
db10: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
db20: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
db30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
db40: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 63 6f  MIT_DISKIO).  co
db50: 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a  nst ThreadData *
db60: 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69 66 0a 0a  pTsdro;.#endif..
db70: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
db80: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
db90: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
dba0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
dbb0: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
dbc0: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
dbd0: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
dbe0: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
dbf0: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
dc00: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
dc10: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
dc20: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
dc30: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
dc40: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
dc50: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
dc60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dc70: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
dc80: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
dc90: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
dca0: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
dcb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
dcc0: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
dcd0: 69 73 4d 65 6d 64 62 20 3d 20 21 7a 46 69 6c 65  isMemdb = !zFile
dce0: 6e 61 6d 65 3b 0a 20 20 23 65 6c 73 65 0a 20 20  name;.  #else.  
dcf0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
dd00: 62 20 3d 20 21 7a 46 69 6c 65 6e 61 6d 65 20 7c  b = !zFilename |
dd10: 7c 20 28 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  | (strcmp(zFilen
dd20: 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
dd30: 3f 30 3a 31 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ?0:1);.  #endif.
dd40: 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73 71  #endif..  p = sq
dd50: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
dd60: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
dd70: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
dd80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
dd90: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
dda0: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
ddb0: 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53   p->pSqlite = pS
ddc0: 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72 79  qlite;..  /* Try
ddd0: 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73   to find an exis
dde0: 74 69 6e 67 20 42 74 72 65 65 20 73 74 72 75 63  ting Btree struc
ddf0: 74 75 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20 7a  ture opened on z
de00: 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66  Filename. */.#if
de10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
de20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
de30: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
de40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
de50: 49 4f 29 0a 20 20 70 54 73 64 72 6f 20 3d 20 73  IO).  pTsdro = s
de60: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
de70: 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
de80: 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61  ( pTsdro->useSha
de90: 72 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65  redData && zFile
dea0: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
deb0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   ){.    char *zF
dec0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
ded0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
dee0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
def0: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
df00: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
df10: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
df20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
df30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
df40: 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 73 64      for(pBt=pTsd
df50: 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b  ro->pBtree; pBt;
df60: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
df70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
df80: 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
df90: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
dfa0: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
dfb0: 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66  , sqlite3pager_f
dfc0: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
dfd0: 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ger)) ){.       
dfe0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
dff0: 20 20 20 20 20 20 20 2a 70 70 42 74 72 65 65 20         *ppBtree 
e000: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 42 74  = p;.        pBt
e010: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
e020: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
e030: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e040: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
e060: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
e070: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e080: 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  e);.  }.#endif..
e090: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    /*.  ** The fo
e0a0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
e0b0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
e0c0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
e0d0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
e0e0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
e0f0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
e100: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
e110: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
e120: 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65   result.  ** whe
e130: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
e140: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
e150: 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  tecture..  */.  
e160: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
e170: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
e180: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (i64)==4 );.  as
e190: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
e1a0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
e1b0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65  64)==4 );.  asse
e1c0: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
e1d0: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
e1e0: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
e1f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
e200: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a  of(Pgno)==4 );..
e210: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61    pBt = sqliteMa
e220: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42  lloc( sizeof(*pB
e230: 74 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d  t) );.  if( pBt=
e240: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 74 72  =0 ){.    *ppBtr
e250: 65 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ee = 0;.    sqli
e260: 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72  teFree(p);.    r
e270: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e280: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
e290: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
e2a0: 28 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  (&pBt->pPager, z
e2b0: 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f  Filename, EXTRA_
e2c0: 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20  SIZE, flags);.  
e2d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e2e0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
e2f0: 2d 3e 70 50 61 67 65 72 20 29 20 73 71 6c 69 74  ->pPager ) sqlit
e300: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 70 42  e3pager_close(pB
e310: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
e320: 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b  sqliteFree(pBt);
e330: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e340: 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
e350: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e360: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42   rc;.  }.  p->pB
e370: 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69  t = pBt;..  sqli
e380: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73  te3pager_set_des
e390: 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61  tructor(pBt->pPa
e3a0: 67 65 72 2c 20 70 61 67 65 44 65 73 74 72 75 63  ger, pageDestruc
e3b0: 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 70  tor);.  sqlite3p
e3c0: 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65  ager_set_reinite
e3d0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
e3e0: 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42  ageReinit);.  pB
e3f0: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
e400: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e410: 30 3b 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  0;.  pBt->readOn
e420: 6c 79 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  ly = sqlite3page
e430: 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  r_isreadonly(pBt
e440: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
e450: 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66  ite3pager_read_f
e460: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
e470: 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 7a 44  Pager, sizeof(zD
e480: 62 48 65 61 64 65 72 29 2c 20 7a 44 62 48 65 61  bHeader), zDbHea
e490: 64 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  der);.  pBt->pag
e4a0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
e4b0: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
e4c0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
e4d0: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
e4e0: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
e4f0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
e500: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
e510: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
e520: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
e530: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  {.    pBt->pageS
e540: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
e550: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
e560: 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65      pBt->maxEmbe
e570: 64 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a  dFrac = 64;   /*
e580: 20 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d   25% */.    pBt-
e590: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
e5a0: 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a  32;   /* 12.5% *
e5b0: 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  /.    pBt->minLe
e5c0: 61 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20  afFrac = 32;    
e5d0: 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e  /* 12.5% */.#ifn
e5e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e5f0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f  AUTOVACUUM.    /
e600: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
e610: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
e620: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
e630: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e640: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f  , then.    ** do
e650: 20 6e 6f 74 20 73 65 74 20 74 68 65 20 61 75 74   not set the aut
e660: 6f 2d 76 61 63 75 75 6d 20 66 6c 61 67 2c 20 65  o-vacuum flag, e
e670: 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 45  ven if SQLITE_DE
e680: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
e690: 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2e  .    ** is true.
e6a0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
e6b0: 6e 64 2c 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  nd, if SQLITE_OM
e6c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
e6d0: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20  been defined,.  
e6e0: 20 20 2a 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f    ** then ":memo
e6f0: 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 20 72  ry:" is just a r
e700: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
e710: 2e 20 52 65 73 70 65 63 74 20 74 68 65 20 61 75  . Respect the au
e720: 74 6f 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  to-vacuum.    **
e730: 20 64 65 66 61 75 6c 74 20 69 6e 20 74 68 69 73   default in this
e740: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
e750: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
e760: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
e770: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
e780: 63 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45  cuum = SQLITE_DE
e790: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
e7a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e7b0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
e7c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52  .  }else{.    nR
e7d0: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
e7e0: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d  er[20];.    pBt-
e7f0: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20  >maxEmbedFrac = 
e800: 7a 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20  zDbHeader[21];. 
e810: 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64     pBt->minEmbed
e820: 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72  Frac = zDbHeader
e830: 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [22];.    pBt->m
e840: 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62  inLeafFrac = zDb
e850: 48 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20  Header[23];.    
e860: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
e870: 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
e880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e890: 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
e8a0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
e8b0: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
e8c0: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
e8d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e8e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e8f0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
e900: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 61 73  - nReserve;.  as
e910: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
e920: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
e930: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
e940: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
e950: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67   */.  sqlite3pag
e960: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
e970: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
e980: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69  ->pageSize);..#i
e990: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
e9a0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e9b0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
e9c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
e9d0: 4b 49 4f 29 0a 20 20 2f 2a 20 41 64 64 20 74 68  KIO).  /* Add th
e9e0: 65 20 6e 65 77 20 62 74 72 65 65 20 74 6f 20 74  e new btree to t
e9f0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
ea00: 74 61 72 74 69 6e 67 20 61 74 20 54 68 72 65 61  tarting at Threa
ea10: 64 44 61 74 61 2e 70 42 74 72 65 65 2e 0a 20 20  dData.pBtree..  
ea20: 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63  ** There is no c
ea30: 68 61 6e 63 65 20 74 68 61 74 20 61 20 6d 61 6c  hance that a mal
ea40: 6c 6f 63 28 29 20 6d 61 79 20 66 61 69 6c 20 69  loc() may fail i
ea50: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 0a 20 20  nside of the .  
ea60: 2a 2a 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  ** sqlite3Thread
ea70: 44 61 74 61 28 29 20 63 61 6c 6c 2c 20 61 73 20  Data() call, as 
ea80: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 73  the ThreadData s
ea90: 74 72 75 63 74 75 72 65 20 6d 75 73 74 20 68 61  tructure must ha
eaa0: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
eab0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 66  been allocated f
eac0: 6f 72 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68  or pTsdro->useSh
ead0: 61 72 65 64 44 61 74 61 20 74 6f 20 62 65 20 6e  aredData to be n
eae0: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  on-zero..  */.  
eaf0: 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53  if( pTsdro->useS
eb00: 68 61 72 65 64 44 61 74 61 20 26 26 20 7a 46 69  haredData && zFi
eb10: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
eb20: 64 62 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  db ){.    pBt->p
eb30: 4e 65 78 74 20 3d 20 70 54 73 64 72 6f 2d 3e 70  Next = pTsdro->p
eb40: 42 74 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74  Btree;.    sqlit
eb50: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e  e3ThreadData()->
eb60: 70 42 74 72 65 65 20 3d 20 70 42 74 3b 0a 20 20  pBtree = pBt;.  
eb70: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  }.#endif.  pBt->
eb80: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 2a 70 70 42  nRef = 1;.  *ppB
eb90: 74 72 65 65 20 3d 20 70 3b 0a 20 20 72 65 74 75  tree = p;.  retu
eba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ebb0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
ebc0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
ebd0: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
ebe0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
ebf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
ec00: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
ec10: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ec20: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
ec30: 6f 72 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64  or *pCur;..#ifnd
ec40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ec50: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 54 68  HARED_CACHE.  Th
ec60: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a  readData *pTsd;.
ec70: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f  #endif..  /* Clo
ec80: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
ec90: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
eca0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75  andle.  */.  pCu
ecb0: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
ecc0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
ecd0: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
ece0: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
ecf0: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
ed00: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
ed10: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
ed20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ed30: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
ed40: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
ed50: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
ed60: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
ed70: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
ed80: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
ed90: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
eda0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
edb0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
edc0: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
edd0: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
ede0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
edf0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
ee00: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
ee10: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 0a 23  qliteFree(p);..#
ee20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
ee40: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
ee50: 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
ee60: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
ee70: 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
ee80: 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
ee90: 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
eea0: 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
eeb0: 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
eec0: 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
eed0: 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
eee0: 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
eef0: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
ef00: 30 20 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  0 );.  pBt->nRef
ef10: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
ef20: 52 65 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Ref ){.    retur
ef30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
ef40: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
ef50: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 66  e shared-btree f
ef60: 72 6f 6d 20 74 68 65 20 74 68 72 65 61 64 20 77  rom the thread w
ef70: 69 64 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a  ide list. Call .
ef80: 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 52    ** ThreadDataR
ef90: 65 61 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68  eadOnly() and th
efa0: 65 6e 20 63 61 73 74 20 61 77 61 79 20 74 68 65  en cast away the
efb0: 20 63 6f 6e 73 74 20 70 72 6f 70 65 72 74 79 20   const property 
efc0: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69  of the .  ** poi
efd0: 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 61 6c  nter to avoid al
efe0: 6c 6f 63 61 74 69 6e 67 20 74 68 72 65 61 64 20  locating thread 
eff0: 64 61 74 61 20 69 66 20 69 74 20 69 73 20 6e 6f  data if it is no
f000: 74 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  t really require
f010: 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d  d..  */.  pTsd =
f020: 20 28 54 68 72 65 61 64 44 61 74 61 20 2a 29 73   (ThreadData *)s
f030: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
f040: 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
f050: 28 20 70 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d  ( pTsd->pBtree==
f060: 70 42 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pBt ){.    asser
f070: 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33  t( pTsd==sqlite3
f080: 54 68 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a  ThreadData() );.
f090: 20 20 20 20 70 54 73 64 2d 3e 70 42 74 72 65 65      pTsd->pBtree
f0a0: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
f0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42 74 53 68   }else{.    BtSh
f0c0: 61 72 65 64 20 2a 70 50 72 65 76 3b 0a 20 20 20  ared *pPrev;.   
f0d0: 20 66 6f 72 28 70 50 72 65 76 3d 70 54 73 64 2d   for(pPrev=pTsd-
f0e0: 3e 70 42 74 72 65 65 3b 20 70 50 72 65 76 20 26  >pBtree; pPrev &
f0f0: 26 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d  & pPrev->pNext!=
f100: 70 42 74 3b 20 70 50 72 65 76 3d 70 50 72 65 76  pBt; pPrev=pPrev
f110: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69  ->pNext){}.    i
f120: 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20  f( pPrev ){.    
f130: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 3d 3d    assert( pTsd==
f140: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
f150: 61 28 29 20 29 3b 0a 20 20 20 20 20 20 70 50 72  a() );.      pPr
f160: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ev->pNext = pBt-
f170: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
f180: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
f190: 6c 6f 73 65 20 74 68 65 20 70 61 67 65 72 20 61  lose the pager a
f1a0: 6e 64 20 66 72 65 65 20 74 68 65 20 73 68 61 72  nd free the shar
f1b0: 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
f1c0: 72 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  re */.  assert( 
f1d0: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
f1e0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
f1f0: 63 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  close(pBt->pPage
f200: 72 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 78  r);.  if( pBt->x
f210: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
f220: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
f230: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
f240: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
f250: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
f260: 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ee(pBt->pSchema)
f270: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
f280: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
f290: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f2a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73  * Change the bus
f2b0: 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y handler callba
f2c0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ck function..*/.
f2d0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f2e0: 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42  SetBusyHandler(B
f2f0: 74 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e  tree *p, BusyHan
f300: 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b  dler *pHandler){
f310: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f320: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74   = p->pBt;.  pBt
f330: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
f340: 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c   pHandler;.  sql
f350: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
f360: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
f370: 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29  Pager, pHandler)
f380: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f390: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f3a0: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
f3b0: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
f3c0: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
f3d0: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
f3e0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
f3f0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
f400: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
f410: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
f420: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
f430: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
f440: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
f450: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
f460: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
f470: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
f480: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
f490: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
f4a0: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
f4b0: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
f4c0: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
f4d0: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
f4e0: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
f4f0: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
f500: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
f510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
f520: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
f530: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
f540: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
f550: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
f560: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
f570: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
f580: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
f590: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
f5a0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
f5b0: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
f5c0: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
f5d0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
f5e0: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
f5f0: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
f600: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
f610: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
f620: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
f630: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
f640: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
f650: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f660: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
f670: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
f680: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
f690: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f6a0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
f6b0: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 70 42  set_cachesize(pB
f6c0: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
f6d0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
f6e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f6f0: 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
f700: 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
f710: 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
f720: 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
f730: 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
f740: 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
f750: 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
f760: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
f770: 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
f780: 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
f790: 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
f7a0: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
f7b0: 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
f7c0: 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
f7d0: 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
f7e0: 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
f7f0: 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
f800: 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
f810: 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
f820: 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
f830: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
f840: 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
f850: 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
f860: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
f870: 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
f880: 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
f890: 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
f8a0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
f8b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
f8c0: 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
f8d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
f8e0: 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
f8f0: 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
f900: 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
f910: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f920: 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
f930: 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  3pager_set_safet
f940: 79 5f 6c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  y_level(pBt->pPa
f950: 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
f960: 53 79 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Sync);.  return 
f970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
f980: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
f990: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
f9a0: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
f9b0: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
f9c0: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
f9d0: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
f9e0: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
f9f0: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
fa00: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
fa10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
fa20: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
fa30: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
fa40: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
fa50: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
fa60: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
fa70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
fa80: 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28 70 42 74  pager_nosync(pBt
fa90: 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69  ->pPager);.}..#i
faa0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
fab0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
fac0: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
fad0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
fae0: 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
faf0: 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
fb00: 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
fb10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
fb20: 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
fb30: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
fb40: 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
fb50: 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
fb60: 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
fb70: 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
fb80: 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
fb90: 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
fba0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
fbb0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
fbc0: 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
fbd0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
fbe0: 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
fbf0: 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
fc00: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
fc10: 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
fc20: 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
fc30: 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
fc40: 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
fc50: 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
fc60: 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
fc70: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
fc80: 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
fc90: 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
fca0: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
fcb0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
fcc0: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
fcd0: 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
fce0: 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
fcf0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
fd00: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
fd10: 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
fd20: 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
fd30: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
fd40: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
fd50: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
fd60: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
fd70: 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
fd80: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fd90: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
fda0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
fdb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fdc0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
fdd0: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
fde0: 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
fdf0: 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
fe00: 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
fe10: 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  leSize;.  }.  if
fe20: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
fe30: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
fe40: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
fe50: 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
fe60: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
fe70: 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
fe80: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
fe90: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
fea0: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
feb0: 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
fec0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
fed0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 71 6c  ->pageSize = sql
fee0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61  ite3pager_set_pa
fef0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
ff00: 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  er, pageSize);. 
ff10: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
ff20: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
ff30: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
ff40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ff50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ff60: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
ff70: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
ff80: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
ff90: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
ffa0: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
ffb0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
ffc0: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
ffd0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
ffe0: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
fff0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
10000 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
10010 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
10020 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
10030 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10040 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
10050 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
10060 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
10070 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
10080 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
10090 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
100a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
100b0 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
100c0 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
100d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
100e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
100f0 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
10100 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
10110 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
10120 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
10130 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
10140 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
10150 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
10160 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
10170 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
10180 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
10190 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
101a0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
101b0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
101c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
101d0 3d 20 70 2d 3e 70 42 74 3b 3b 0a 23 69 66 64 65  = p->pBt;;.#ifde
101e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
101f0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
10200 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
10210 59 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70  Y;.#else.  if( p
10220 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
10230 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
10240 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
10250 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f  .  }.  pBt->auto
10260 56 61 63 75 75 6d 20 3d 20 28 61 75 74 6f 56 61  Vacuum = (autoVa
10270 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 72 65 74  cuum?1:0);.  ret
10280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
10290 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
102a0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
102b0 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
102c0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
102d0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
102e0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
102f0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
10300 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
10310 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
10320 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
10330 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
10340 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
10350 55 4d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  UM.  return 0;.#
10360 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 2d  else.  return p-
10370 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
10380 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
10390 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
103a0 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
103b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
103c0 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
103d0 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
103e0 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
103f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
10400 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10410 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
10420 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
10430 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
10440 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
10450 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
10460 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
10470 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
10480 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
10490 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
104a0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
104b0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
104c0 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
104d0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
104e0 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
104f0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
10500 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6c 6f  if there is a lo
10510 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 76  cking protocol v
10520 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  iolation..*/.sta
10530 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
10540 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10550 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65  {.  int rc, page
10560 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Size;.  MemPage 
10570 2a 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70  *pPage1;.  if( p
10580 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74  Bt->pPage1 ) ret
10590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
105a0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
105b0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 29 3b 0a  t, 1, &pPage1);.
105c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
105d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
105e0 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  .  ..  /* Do som
105f0 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
10600 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
10610 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
10620 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
10630 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
10640 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
10650 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
10660 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
10670 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  r_pagecount(pBt-
10680 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20  >pPager)>0 ){.  
10690 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
106a0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
106b0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
106c0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
106d0 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
106e0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
106f0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10700 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
10710 3e 31 20 7c 7c 20 70 61 67 65 31 5b 31 39 5d 3e  >1 || page1[19]>
10720 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
10730 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10740 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
10750 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
10760 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20  (&page1[16]);.  
10770 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
10780 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
10790 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
107a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
107b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
107c0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
107d0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  7)==0 );.    pBt
107e0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
107f0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
10800 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
10810 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
10820 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ];.    if( pBt->
10830 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29  usableSize<500 )
10840 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
10850 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
10860 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d      }.    pBt->m
10870 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61  axEmbedFrac = pa
10880 67 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74  ge1[21];.    pBt
10890 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
108a0 20 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20   page1[22];.    
108b0 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
108c0 20 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69   = page1[23];.#i
108d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
108e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
108f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
10900 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
10910 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
10920 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
10930 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
10940 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
10950 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
10960 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
10970 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
10980 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
10990 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
109a0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
109b0 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
109c0 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
109d0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
109e0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
109f0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
10a00 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
10a10 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
10a20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
10a30 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
10a40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10a50 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
10a60 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
10a70 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
10a80 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
10a90 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
10aa0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
10ab0 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
10ac0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
10ad0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
10ae0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
10af0 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
10b00 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
10b10 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
10b20 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
10b30 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
10b40 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
10b50 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
10b60 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
10b70 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
10b80 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
10b90 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10ba0 2d 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62  -12)*pBt->maxEmb
10bb0 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b  edFrac/255 - 23;
10bc0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
10bd0 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10be0 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
10bf0 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20  EmbedFrac/255 - 
10c00 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
10c10 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
10c20 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
10c30 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
10c40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
10c50 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61  *pBt->minLeafFra
10c60 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66  c/255 - 23;.  if
10c70 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e  ( pBt->minLocal>
10c80 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c  pBt->maxLocal ||
10c90 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30   pBt->maxLocal<0
10ca0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   ){.    goto pag
10cb0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
10cc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
10cd0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
10ce0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
10cf0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
10d00 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
10d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10d20 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
10d30 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
10d40 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
10d50 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
10d60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10d70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10d80 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
10d90 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65  lockBtree() exce
10da0 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20  pt that it also 
10db0 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62  invokes the.** b
10dc0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
10dd0 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f  there is lock co
10de0 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ntention..*/.sta
10df0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
10e00 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65  eWithRetry(Btree
10e10 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72   *pRef){.  int r
10e20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10e30 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61   if( pRef->inTra
10e40 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
10e50 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73  {.    u8 inTrans
10e60 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70  action = pRef->p
10e70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10e80 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65  n;.    btreeInte
10e90 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20  grity(pRef);.   
10ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10eb0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65  eeBeginTrans(pRe
10ec0 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d  f, 0);.    pRef-
10ed0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
10ee0 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74  ion = inTransact
10ef0 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69  ion;.    pRef->i
10f00 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
10f10 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ONE;.    if( rc=
10f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10f30 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e      pRef->pBt->n
10f40 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
10f50 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e     }.    btreeIn
10f60 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
10f70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10f80 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  }.       ../*.**
10f90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
10fa0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
10fb0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
10fc0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
10fd0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
10fe0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
10ff0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
11000 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
11010 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
11020 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
11030 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
11040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11050 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
11060 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
11070 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
11080 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
11090 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
110a0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c  tanding cursors,
110b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
110c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
110d0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
110e0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
110f0 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
11100 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
11110 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
11120 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
11130 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
11140 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  ){.  if( pBt->in
11150 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
11160 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
11170 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42  pCursor==0 && pB
11180 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
11190 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
111a0 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b  ge1->aData==0 ){
111b0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
111c0 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
111d0 67 65 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ge1;.      pPage
111e0 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a  ->aData = &((u8*
111f0 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61  )pPage)[-pBt->pa
11200 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 70  geSize];.      p
11210 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
11220 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67  .      pPage->pg
11230 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  no = 1;.    }.  
11240 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
11250 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
11260 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
11270 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
11280 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
11290 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
112a0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
112b0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
112c0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
112d0 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
112e0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
112f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
11300 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
11310 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
11320 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
11330 63 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  c;.  if( sqlite3
11340 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
11350 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
11360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11370 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  K;.  pP1 = pBt->
11380 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
11390 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
113a0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
113b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
113c0 61 67 65 72 5f 77 72 69 74 65 28 64 61 74 61 29  ager_write(data)
113d0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
113e0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
113f0 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
11400 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
11410 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
11420 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
11430 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
11440 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
11450 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67  ta[16], pBt->pag
11460 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31  eSize);.  data[1
11470 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
11480 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32  9] = 1;.  data[2
11490 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  0] = pBt->pageSi
114a0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
114b0 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d  Size;.  data[21]
114c0 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64   = pBt->maxEmbed
114d0 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d  Frac;.  data[22]
114e0 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64   = pBt->minEmbed
114f0 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d  Frac;.  data[23]
11500 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46   = pBt->minLeafF
11510 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  rac;.  memset(&d
11520 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
11530 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
11540 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
11550 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
11560 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
11570 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
11580 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
11590 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
115a0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
115b0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 70  oVacuum ){.    p
115c0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
115d0 20 2b 20 34 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d   + 4*4], 1);.  }
115e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
115f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11600 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
11610 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
11620 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
11630 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
11640 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
11650 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11660 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
11670 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
11680 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
11690 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
116a0 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
116b0 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
116c0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
116d0 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
116e0 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
116f0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
11700 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
11710 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
11720 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
11730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
11740 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
11750 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
11760 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
11770 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
11780 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
11790 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
117a0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
117b0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
117c0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
117d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
117e0 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
117f0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
11800 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
11810 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
11820 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
11830 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
11840 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
11850 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
11860 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
11870 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
11880 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
11890 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
118a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
118b0 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
118c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
118d0 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
118e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
118f0 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
11900 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11910 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
11920 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
11930 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
11940 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
11950 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
11960 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
11970 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
11980 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
11990 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
119a0 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
119b0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
119c0 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
119d0 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
119e0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
119f0 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
11a00 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
11a10 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
11a20 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
11a30 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
11a40 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
11a50 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
11a60 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
11a70 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
11a80 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
11a90 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
11aa0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
11ab0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
11ac0 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
11ad0 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
11ae0 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
11af0 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
11b00 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
11b10 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
11b20 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
11b30 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
11b40 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
11b50 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
11b60 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
11b70 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
11b80 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
11b90 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
11ba0 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
11bb0 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
11bc0 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
11bd0 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
11be0 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
11bf0 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
11c00 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
11c10 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
11c20 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
11c30 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
11c40 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
11c50 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
11c60 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
11c70 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
11c80 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
11c90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11ca0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
11cb0 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
11cc0 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
11cd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11ce0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
11cf0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62 74 72 65  LITE_OK;..  btre
11d00 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
11d10 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
11d20 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
11d30 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
11d40 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
11d50 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
11d60 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
11d70 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
11d80 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
11d90 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
11da0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
11db0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
11dc0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
11dd0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
11de0 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
11df0 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74  flag) ){.    ret
11e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11e10 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
11e20 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
11e30 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
11e40 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
11e50 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42  base */.  if( pB
11e60 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
11e70 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rflag ){.    ret
11e80 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11e90 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  NLY;.  }..  /* I
11ea0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
11eb0 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
11ec0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
11ed0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11ee0 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
11ef0 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
11f00 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
11f10 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
11f20 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
11f30 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
11f40 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f  QLITE_BUSY..  */
11f50 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
11f60 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11f70 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61 67  _WRITE && wrflag
11f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11f90 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
11fa0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20  .  do {.    if( 
11fb0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
11fc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
11fd0 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
11fe0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
11ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
12000 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72  rflag ){.      r
12010 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
12020 5f 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  _begin(pBt->pPag
12030 65 31 2d 3e 61 44 61 74 61 2c 20 77 72 66 6c 61  e1->aData, wrfla
12040 67 3e 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  g>1);.      if( 
12050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65  .        rc = ne
12070 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
12080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12090 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
120a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
120b0 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
120c0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
120d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
120e0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
120f0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
12100 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
12110 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
12120 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
12130 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
12140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
12150 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
12160 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c  (pBt->pBusyHandl
12170 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  er) );..  if( rc
12180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12190 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
121a0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
121b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
121c0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
121d0 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
121e0 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
121f0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
12200 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
12210 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
12220 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
12230 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
12240 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
12250 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ns;.    }.  }.. 
12260 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12270 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12280 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12290 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
122a0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
122b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
122c0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
122d0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
122e0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
122f0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
12300 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
12310 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
12320 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
12330 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
12340 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
12350 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
12360 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
12370 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
12380 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
12390 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
123c0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
123d0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12400 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
12410 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
12420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12440 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
12450 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12460 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
12470 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
12480 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
12490 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
124a0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69  ge->pgno;..  ini
124b0 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
124c0 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
124d0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
124e0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
124f0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
12500 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
12510 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
12520 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
12530 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
12540 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12560 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
12570 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
12580 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
12590 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
125a0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
125b0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
125c0 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
125d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
125e0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
125f0 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
12600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12610 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
12620 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
12630 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
12640 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
12650 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
12660 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
12670 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12680 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12690 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
126a0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
126b0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
126c0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
126d0 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
126e0 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
126f0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12700 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
12710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
12720 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
12730 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
12740 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  enteed to be a b
12750 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
12760 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
12770 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
12780 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
12790 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
127a0 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
127b0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
127c0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
127d0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
127e0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
127f0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
12800 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
12810 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
12820 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
12830 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
12840 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
12850 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
12880 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12890 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
128a0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
128b0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
128c0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
128d0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
128e0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
128f0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
12900 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
12910 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
12920 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
12930 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
12940 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
12950 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
12960 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
12970 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
12980 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
12990 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
129a0 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
129b0 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
129c0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
129d0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
129e0 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65 54  eType){.  if( eT
129f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
12a00 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
12a10 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
12a20 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
12a30 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
12a40 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
12a50 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
12a60 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
12a70 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
12a80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12a90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12aa0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
12ab0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
12ac0 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
12ad0 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
12ae0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
12af0 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
12b00 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
12b10 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61      initPage(pPa
12b20 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
12b30 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
12b40 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12b50 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12b60 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
12b70 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
12b80 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
12b90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12ba0 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12bb0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12bc0 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
12bd0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
12be0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
12bf0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
12c00 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
12c10 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
12c20 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
12c30 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
12c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
12c50 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
12c60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
12c70 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
12c80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12c90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12cb0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
12cc0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
12cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
12ce0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
12cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12d00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12d20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
12d30 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
12d40 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
12d50 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
12d60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
12d70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
12d80 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
12d90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
12da0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12db0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
12dc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
12dd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
12de0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
12df0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
12e00 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12e10 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
12e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12e30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12e40 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
12e50 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
12e60 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
12e70 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
12e80 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
12e90 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
12ea0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
12eb0 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
12ec0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
12ed0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12ee0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
12ef0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
12f00 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
12f10 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
12f20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
12f30 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
12f40 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12f50 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
12f60 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
12f70 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
12f80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12f90 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
12fa0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
12fb0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
12fc0 20 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20   iFreePage      
12fd0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
12fe0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
12ff0 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  Page to */.){.  
13000 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
13010 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
13020 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
13030 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
13040 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
13050 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
13060 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
13070 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
13080 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
13090 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
130a0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
130b0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
130c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
130d0 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
130e0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
130f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
13100 54 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d  TPAGE );..  /* M
13110 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
13120 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65   from it's curre
13130 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
13140 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
13150 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
13160 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
13170 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
13180 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
13190 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
131a0 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
131b0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
131c0 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
131d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
131e0 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 70 50 61  ger_movepage(pPa
131f0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 61 44  ger, pDbPage->aD
13200 61 74 61 2c 20 69 46 72 65 65 50 61 67 65 29 3b  ata, iFreePage);
13210 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
13230 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
13240 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
13250 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
13260 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
13270 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
13280 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
13290 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
132a0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
132b0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
132c0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
132d0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
132e0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
132f0 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
13300 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
13310 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
13320 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
13330 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
13340 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
13350 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
13360 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
13370 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
13380 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
13390 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
133a0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
133b0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
133c0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
133d0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
133e0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
133f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13400 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
13410 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
13420 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
13430 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
13440 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
13450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13460 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13470 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
13480 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
13490 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
134a0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
134b0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
134c0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
134d0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
134e0 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
134f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
13500 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
13510 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13520 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
13530 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13540 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13550 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
13560 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
13570 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
13580 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
13590 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
135a0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
135b0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
135c0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
135d0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
135e0 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
135f0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
13600 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
13610 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
13620 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
13630 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
13640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13650 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13660 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
13670 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13680 77 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  write(pPtrPage->
13690 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
136a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
136b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
136c0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
136d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
136e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
136f0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13700 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
13710 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
13720 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
13730 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
13740 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13760 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
13770 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
13780 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
13790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
137a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
137b0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
137c0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61 75  n required by au
137d0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 29  toVacuumCommit()
137e0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
137f0 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 42 74 53  allocatePage(BtS
13800 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
13810 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
13820 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  o, u8);../*.** T
13830 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13840 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
13850 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
13860 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
13870 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
13880 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
13890 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
138a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
138b0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
138c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
138d0 50 67 6e 6f 20 2a 6e 54 72 75 6e 63 29 7b 0a 20  Pgno *nTrunc){. 
138e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
138f0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
13900 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
13910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13920 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
13930 6d 61 69 6e 69 6e 67 20 6f 6e 20 74 68 65 20 66  maining on the f
13940 72 65 65 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20 69  ree-list. */.  i
13950 6e 74 20 6e 50 74 72 4d 61 70 3b 20 20 20 20 20  nt nPtrMap;     
13960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13970 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  ber of pointer-m
13980 61 70 20 70 61 67 65 73 20 64 65 61 6c 6c 6f 63  ap pages dealloc
13990 61 74 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  ated */.  Pgno o
139a0 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
139b0 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 69 6e       /* Pages in
139c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
139d0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 66 69 6e  le */.  Pgno fin
139e0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
139f0 20 20 20 2f 2a 20 50 61 67 65 73 20 69 6e 20 74     /* Pages in t
13a00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a10 20 61 66 74 65 72 20 74 72 75 6e 63 61 74 69 6f   after truncatio
13a20 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
13a50 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 0a   */.  u8 eType;.
13a60 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74    int pgsz = pBt
13a70 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20  ->pageSize;  /* 
13a80 50 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68  Page size for th
13a90 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
13aa0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 3b 20 20   Pgno iDbPage;  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13ac0 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
13ad0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 4d 65   to move */.  Me
13ae0 6d 50 61 67 65 20 2a 70 44 62 4d 65 6d 50 61 67  mPage *pDbMemPag
13af0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 22 22 20 2a  e = 0;   /* "" *
13b00 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
13b10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
13b20 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
13b30 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
13b40 65 72 20 74 6f 20 69 44 62 50 61 67 65 20 2a 2f  er to iDbPage */
13b50 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
13b60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
13b70 20 54 68 65 20 66 72 65 65 2d 6c 69 73 74 20 70   The free-list p
13b80 61 67 65 20 74 6f 20 6d 6f 76 65 20 69 44 62 50  age to move iDbP
13b90 61 67 65 20 74 6f 20 2a 2f 0a 20 20 4d 65 6d 50  age to */.  MemP
13ba0 61 67 65 20 2a 70 46 72 65 65 4d 65 6d 50 61 67  age *pFreeMemPag
13bb0 65 20 3d 20 30 3b 20 2f 2a 20 22 22 20 2a 2f 0a  e = 0; /* "" */.
13bc0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13bd0 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c    int nRef = sql
13be0 69 74 65 33 70 61 67 65 72 5f 72 65 66 63 6f 75  ite3pager_refcou
13bf0 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64  nt(pPager);.#end
13c00 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  if..  assert( pB
13c10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
13c20 0a 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53  .  if( PTRMAP_IS
13c30 50 41 47 45 28 70 42 74 2c 20 73 71 6c 69 74 65  PAGE(pBt, sqlite
13c40 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
13c50 28 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20  (pPager)) ){.   
13c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13c70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
13c80 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
13c90 74 20 68 6f 77 20 6d 61 6e 79 20 66 72 65 65 2d  t how many free-
13ca0 70 61 67 65 73 20 61 72 65 20 69 6e 20 74 68 65  pages are in the
13cb0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
13cc0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
13cd0 66 72 65 65 20 70 61 67 65 73 2c 20 74 68 65 6e  free pages, then
13ce0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
13cf0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
13d00 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
13d10 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
13d20 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
13d30 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
13d40 30 20 29 7b 0a 20 20 20 20 2a 6e 54 72 75 6e 63  0 ){.    *nTrunc
13d50 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
13d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13d70 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
13d80 20 66 69 67 75 72 65 73 20 6f 75 74 20 68 6f 77   figures out how
13d90 20 6d 61 6e 79 20 70 61 67 65 73 20 74 68 65 72   many pages ther
13da0 65 20 61 72 65 20 69 6e 20 74 68 65 20 64 61 74  e are in the dat
13db0 61 62 61 73 65 0a 20 20 2a 2a 20 6e 6f 77 20 28  abase.  ** now (
13dc0 76 61 72 69 61 62 6c 65 20 6f 72 69 67 53 69 7a  variable origSiz
13dd0 65 29 2c 20 61 6e 64 20 68 6f 77 20 6d 61 6e 79  e), and how many
13de0 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61   there will be a
13df0 66 74 65 72 20 74 68 65 0a 20 20 2a 2a 20 74 72  fter the.  ** tr
13e00 75 6e 63 61 74 69 6f 6e 20 28 76 61 72 69 61 62  uncation (variab
13e10 6c 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a  le finSize)..  *
13e20 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 6e 61 6c  *.  ** The final
13e30 20 73 69 7a 65 20 69 73 20 74 68 65 20 6f 72 69   size is the ori
13e40 67 69 6e 61 6c 20 73 69 7a 65 2c 20 6c 65 73 73  ginal size, less
13e50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
13e60 72 65 65 20 70 61 67 65 73 0a 20 20 2a 2a 20 69  ree pages.  ** i
13e70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
13e80 6c 65 73 73 20 61 6e 79 20 70 6f 69 6e 74 65 72  less any pointer
13e90 2d 6d 61 70 20 70 61 67 65 73 20 74 68 61 74 20  -map pages that 
13ea0 77 69 6c 6c 20 6e 6f 20 6c 6f 6e 67 65 72 0a 20  will no longer. 
13eb0 20 2a 2a 20 62 65 20 72 65 71 75 69 72 65 64 2c   ** be required,
13ec0 20 6c 65 73 73 20 31 20 69 66 20 74 68 65 20 70   less 1 if the p
13ed0 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
13ee0 20 77 61 73 20 70 61 72 74 20 6f 66 20 74 68 65   was part of the
13ef0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 62   database.  ** b
13f00 75 74 20 69 73 20 6e 6f 74 20 61 66 74 65 72 20  ut is not after 
13f10 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a  the truncation..
13f20 20 20 2a 2a 2f 0a 20 20 6f 72 69 67 53 69 7a 65    **/.  origSize
13f30 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13f40 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
13f50 29 3b 0a 20 20 69 66 28 20 6f 72 69 67 53 69 7a  );.  if( origSiz
13f60 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
13f70 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13f80 20 6f 72 69 67 53 69 7a 65 2d 2d 3b 0a 20 20 7d   origSize--;.  }
13f90 0a 20 20 6e 50 74 72 4d 61 70 20 3d 20 28 6e 46  .  nPtrMap = (nF
13fa0 72 65 65 4c 69 73 74 2d 6f 72 69 67 53 69 7a 65  reeList-origSize
13fb0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
13fc0 42 74 2c 20 6f 72 69 67 53 69 7a 65 29 2b 70 67  Bt, origSize)+pg
13fd0 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a  sz/5)/(pgsz/5);.
13fe0 20 20 66 69 6e 53 69 7a 65 20 3d 20 6f 72 69 67    finSize = orig
13ff0 53 69 7a 65 20 2d 20 6e 46 72 65 65 4c 69 73 74  Size - nFreeList
14000 20 2d 20 6e 50 74 72 4d 61 70 3b 0a 20 20 69 66   - nPtrMap;.  if
14010 28 20 6f 72 69 67 53 69 7a 65 3e 50 45 4e 44 49  ( origSize>PENDI
14020 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
14030 29 20 26 26 20 66 69 6e 53 69 7a 65 3c 3d 50 45  ) && finSize<=PE
14040 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
14050 70 42 74 29 20 29 7b 0a 20 20 20 20 66 69 6e 53  pBt) ){.    finS
14060 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  ize--;.  }.  whi
14070 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
14080 45 28 70 42 74 2c 20 66 69 6e 53 69 7a 65 29 20  E(pBt, finSize) 
14090 7c 7c 20 66 69 6e 53 69 7a 65 3d 3d 50 45 4e 44  || finSize==PEND
140a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
140b0 74 29 20 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a  t) ){.    finSiz
140c0 65 2d 2d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  e--;.  }.  TRACE
140d0 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 42  (("AUTOVACUUM: B
140e0 65 67 69 6e 20 28 64 62 20 73 69 7a 65 20 25 64  egin (db size %d
140f0 2d 3e 25 64 29 5c 6e 22 2c 20 6f 72 69 67 53 69  ->%d)\n", origSi
14100 7a 65 2c 20 66 69 6e 53 69 7a 65 29 29 3b 0a 0a  ze, finSize));..
14110 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 27 66    /* Variable 'f
14120 69 6e 53 69 7a 65 27 20 77 69 6c 6c 20 62 65 20  inSize' will be 
14130 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
14140 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 61 66  file in pages af
14150 74 65 72 0a 20 20 2a 2a 20 74 68 65 20 61 75 74  ter.  ** the aut
14160 6f 2d 76 61 63 75 75 6d 20 68 61 73 20 63 6f 6d  o-vacuum has com
14170 70 6c 65 74 65 64 20 28 74 68 65 20 63 75 72 72  pleted (the curr
14180 65 6e 74 20 66 69 6c 65 20 73 69 7a 65 20 6d 69  ent file size mi
14190 6e 75 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  nus the number. 
141a0 20 2a 2a 20 6f 66 20 70 61 67 65 73 20 6f 6e 20   ** of pages on 
141b0 74 68 65 20 66 72 65 65 20 6c 69 73 74 29 2e 20  the free list). 
141c0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
141d0 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
141e0 62 65 79 6f 6e 64 0a 20 20 2a 2a 20 74 68 69 73  beyond.  ** this
141f0 20 6d 61 72 6b 2c 20 61 6e 64 20 69 66 20 74 68   mark, and if th
14200 65 79 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  ey are not alrea
14210 64 79 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  dy on the free l
14220 69 73 74 2c 20 6d 6f 76 65 20 74 68 65 6d 0a 20  ist, move them. 
14230 20 2a 2a 20 74 6f 20 61 20 66 72 65 65 20 70 61   ** to a free pa
14240 67 65 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68  ge earlier in th
14250 65 20 66 69 6c 65 20 28 73 6f 6d 65 77 68 65 72  e file (somewher
14260 65 20 62 65 66 6f 72 65 20 66 69 6e 53 69 7a 65  e before finSize
14270 29 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 20 69  )..  */.  for( i
14280 44 62 50 61 67 65 3d 66 69 6e 53 69 7a 65 2b 31  DbPage=finSize+1
14290 3b 20 69 44 62 50 61 67 65 3c 3d 6f 72 69 67 53  ; iDbPage<=origS
142a0 69 7a 65 3b 20 69 44 62 50 61 67 65 2b 2b 20 29  ize; iDbPage++ )
142b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62 50  {.    /* If iDbP
142c0 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
142d0 20 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68   map page, or th
142e0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
142f0 61 67 65 2c 20 73 6b 69 70 20 69 74 2e 20 2a 2f  age, skip it. */
14300 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
14310 49 53 50 41 47 45 28 70 42 74 2c 20 69 44 62 50  ISPAGE(pBt, iDbP
14320 61 67 65 29 20 7c 7c 20 69 44 62 50 61 67 65 3d  age) || iDbPage=
14330 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
14340 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
14350 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
14360 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
14370 70 47 65 74 28 70 42 74 2c 20 69 44 62 50 61 67  pGet(pBt, iDbPag
14380 65 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  e, &eType, &iPtr
14390 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
143a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
143b0 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
143c0 75 74 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70  ut;.    if( eTyp
143d0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
143e0 47 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  GE ){.      rc =
143f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
14400 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
14410 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b   autovacuum_out;
14420 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14430 66 20 69 44 62 50 61 67 65 20 69 73 20 66 72 65  f iDbPage is fre
14440 65 2c 20 64 6f 20 6e 6f 74 20 73 77 61 70 20 69  e, do not swap i
14450 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  t.  */.    if( e
14460 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
14470 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 63  EPAGE ){.      c
14480 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
14490 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
144a0 70 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 70  pBt, iDbPage, &p
144b0 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20  DbMemPage);.    
144c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
144d0 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63  K ) goto autovac
144e0 75 75 6d 5f 6f 75 74 3b 0a 0a 20 20 20 20 2f 2a  uum_out;..    /*
144f0 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   Find the next p
14500 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
14510 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
14520 20 61 6c 72 65 61 64 79 20 61 74 20 74 68 65 20   already at the 
14530 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
14540 68 65 20 66 69 6c 65 2e 20 41 20 70 61 67 65 20  he file. A page 
14550 63 61 6e 20 62 65 20 70 75 6c 6c 65 64 20 6f 66  can be pulled of
14560 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  f the free list 
14570 75 73 69 6e 67 20 74 68 65 20 0a 20 20 20 20 2a  using the .    *
14580 2a 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 29  * allocatePage()
14590 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
145a0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
145b0 66 28 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20  f( pFreeMemPage 
145c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
145d0 73 65 50 61 67 65 28 70 46 72 65 65 4d 65 6d 50  sePage(pFreeMemP
145e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  age);.        pF
145f0 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a  reeMemPage = 0;.
14600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
14610 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28   = allocatePage(
14620 70 42 74 2c 20 26 70 46 72 65 65 4d 65 6d 50 61  pBt, &pFreeMemPa
14630 67 65 2c 20 26 69 46 72 65 65 50 61 67 65 2c 20  ge, &iFreePage, 
14640 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
14650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14660 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
14670 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61 67 65  ePage(pDbMemPage
14680 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
14690 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a  autovacuum_out;.
146a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
146b0 73 65 72 74 28 20 69 46 72 65 65 50 61 67 65 3c  sert( iFreePage<
146c0 3d 6f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  =origSize );.   
146d0 20 7d 77 68 69 6c 65 28 20 69 46 72 65 65 50 61   }while( iFreePa
146e0 67 65 3e 66 69 6e 53 69 7a 65 20 29 3b 0a 20 20  ge>finSize );.  
146f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
14700 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20  reeMemPage);.   
14710 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20   pFreeMemPage = 
14720 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 6f 63  0;..    /* Reloc
14730 61 74 65 20 74 68 65 20 70 61 67 65 20 69 6e 74  ate the page int
14740 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
14750 65 20 66 69 6c 65 2e 20 4e 6f 74 65 20 74 68 61  e file. Note tha
14760 74 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  t although the .
14770 20 20 20 20 2a 2a 20 70 61 67 65 20 68 61 73 20      ** page has 
14780 6d 6f 76 65 64 20 77 69 74 68 69 6e 20 74 68 65  moved within the
14790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
147a0 74 68 65 20 70 44 62 4d 65 6d 50 61 67 65 20 70  the pDbMemPage p
147b0 6f 69 6e 74 65 72 20 0a 20 20 20 20 2a 2a 20 72  ointer .    ** r
147c0 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 20 54 68  emains valid. Th
147d0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
147e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  is function can 
147f0 72 75 6e 20 77 69 74 68 6f 75 74 0a 20 20 20 20  run without.    
14800 2a 2a 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  ** invalidating 
14810 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
14820 74 68 65 20 62 74 72 65 65 2e 20 54 68 69 73 20  the btree. This 
14830 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20  is important in 
14840 0a 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63  .    ** shared-c
14850 61 63 68 65 20 6d 6f 64 65 2e 0a 20 20 20 20 2a  ache mode..    *
14860 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63  /.    rc = reloc
14870 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 44 62  atePage(pBt, pDb
14880 4d 65 6d 50 61 67 65 2c 20 65 54 79 70 65 2c 20  MemPage, eType, 
14890 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
148a0 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  age);.    releas
148b0 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61 67 65  ePage(pDbMemPage
148c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
148d0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
148e0 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a  autovacuum_out;.
148f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e    }..  /* The en
14900 74 69 72 65 20 66 72 65 65 2d 6c 69 73 74 20 68  tire free-list h
14910 61 73 20 62 65 65 6e 20 73 77 61 70 70 65 64 20  as been swapped 
14920 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
14930 65 20 66 69 6c 65 2e 20 53 6f 0a 20 20 2a 2a 20  e file. So.  ** 
14940 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
14950 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 66 69  abase file to fi
14960 6e 53 69 7a 65 20 70 61 67 65 73 20 61 6e 64 20  nSize pages and 
14970 63 6f 6e 73 69 64 65 72 20 74 68 65 0a 20 20 2a  consider the.  *
14980 2a 20 66 72 65 65 2d 6c 69 73 74 20 65 6d 70 74  * free-list empt
14990 79 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  y..  */.  rc = s
149a0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
149b0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  e(pBt->pPage1->a
149c0 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21  Data);.  if( rc!
149d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
149e0 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
149f0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 42  ;.  put4byte(&pB
14a00 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14a10 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  [32], 0);.  put4
14a20 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
14a30 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
14a40 3b 0a 20 20 2a 6e 54 72 75 6e 63 20 3d 20 66 69  ;.  *nTrunc = fi
14a50 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
14a60 20 66 69 6e 53 69 7a 65 21 3d 50 45 4e 44 49 4e   finSize!=PENDIN
14a70 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
14a80 20 29 3b 0a 0a 61 75 74 6f 76 61 63 75 75 6d 5f   );..autovacuum_
14a90 6f 75 74 3a 0a 20 20 61 73 73 65 72 74 28 20 6e  out:.  assert( n
14aa0 52 65 66 3d 3d 73 71 6c 69 74 65 33 70 61 67 65  Ref==sqlite3page
14ab0 72 5f 72 65 66 63 6f 75 6e 74 28 70 50 61 67 65  r_refcount(pPage
14ac0 72 29 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  r) );.  if( rc!=
14ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14ae0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
14af0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
14b00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14b10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14b20 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
14b30 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
14b40 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
14b50 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
14b60 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
14b70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
14b80 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
14b90 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
14ba0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
14bb0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
14bc0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
14bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14be0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
14bf0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
14c00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
14c10 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14c20 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
14c30 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
14c40 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
14c50 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
14c60 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
14c70 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
14c80 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
14c90 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
14ca0 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
14cb0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
14cc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
14cd0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
14ce0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
14cf0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
14d00 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
14d10 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
14d20 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
14d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
14d40 67 65 72 5f 63 6f 6d 6d 69 74 28 70 42 74 2d 3e  ger_commit(pBt->
14d50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
14d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14d70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
14d80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
14d90 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
14da0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
14db0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
14dc0 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
14dd0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
14de0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
14df0 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
14e00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
14e10 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
14e20 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
14e30 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
14e40 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
14e50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14e60 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
14e70 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
14e80 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
14e90 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
14ea0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
14eb0 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
14ec0 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
14ed0 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
14ee0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14ef0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
14f00 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
14f10 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
14f20 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
14f30 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
14f40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14f50 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
14f60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14f70 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
14f80 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
14f90 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
14fa0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
14fb0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
14fc0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
14fd0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
14fe0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
14ff0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
15000 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
15010 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
15020 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
15030 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
15040 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65  tegrity(p);.  re
15050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15060 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
15070 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
15080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
15090 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
150a0 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
150b0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
150c0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
150d0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
150e0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
150f0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
15100 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
15110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
15120 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
15130 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15140 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
15150 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
15160 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
15170 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
15180 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
15190 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
151a0 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a 20 20  rFlag ) r++; .  
151b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
151c0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
151d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
151e0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
151f0 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
15200 50 72 69 6e 74 20 64 65 62 75 67 67 69 6e 67 20  Print debugging 
15210 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15220 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 6f  t all cursors to
15230 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
15240 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15250 33 42 74 72 65 65 43 75 72 73 6f 72 4c 69 73 74  3BtreeCursorList
15260 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
15270 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
15280 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15290 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28 70 43  p->pBt;.  for(pC
152a0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
152b0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
152c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 4d 65  ->pNext){.    Me
152d0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
152e0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
152f0 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 70 43  char *zMode = pC
15300 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22 72 77  ur->wrFlag ? "rw
15310 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20 73 71  " : "ro";.    sq
15320 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
15330 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f 6f 74  ("CURSOR %p root
15340 65 64 20 61 74 20 25 34 64 28 25 73 29 20 63 75  ed at %4d(%s) cu
15350 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e 25 64  rrently at %d.%d
15360 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %s\n",.       pC
15370 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ur, pCur->pgnoRo
15380 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20 20  ot, zMode,.     
15390 20 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d    pPage ? pPage-
153a0 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75 72 2d  >pgno : 0, pCur-
153b0 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 28 70 43  >idx,.       (pC
153c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
153d0 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22 22 20 3a  OR_VALID) ? "" :
153e0 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b 0a 20   " eof".    );. 
153f0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
15400 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
15410 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
15420 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
15430 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
15440 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
15450 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
15460 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
15470 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
15480 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
15490 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
154a0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
154b0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
154c0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
154d0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
154e0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
154f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15500 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
15510 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
15520 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
15530 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
15540 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
15550 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
15560 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
15570 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
15580 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15590 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
155a0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 72 63 20   *pPage1;..  rc 
155b0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
155c0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
155d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
155e0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
155f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15600 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
15610 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
15620 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
15630 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
15640 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
15650 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
15660 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
15670 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
15680 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
15690 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
156a0 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
156b0 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
156c0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
156d0 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
156e0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
156f0 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
15700 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
15710 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
15720 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
15730 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
15740 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
15750 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
15760 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
15770 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
15780 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
15790 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
157a0 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
157b0 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
157c0 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
157d0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 43    while( pBt->pC
157e0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 73  ursor ){.      s
157f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74  qlite3 *db = pBt
15800 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65  ->pCursor->pBtre
15810 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20  e->pSqlite;.    
15820 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
15830 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74      sqlite3Abort
15840 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73  OtherActiveVdbes
15850 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
15860 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
15870 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
15880 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41  ty(p);.  unlockA
15890 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
158a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
158b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
158c0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
158d0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
158e0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
158f0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
15900 72 63 32 20 3d 20 73 71 6c 69 74 65 33 70 61 67  rc2 = sqlite3pag
15910 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  er_rollback(pBt-
15920 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15930 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
15940 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
15950 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
15960 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
15970 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
15980 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
15990 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
159a0 20 20 20 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61     ** call getPa
159b0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
159c0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72  gain to make sur
159d0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
159e0 69 73 0a 20 20 20 20 2a 2a 20 73 65 74 20 63 6f  is.    ** set co
159f0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
15a00 69 66 28 20 67 65 74 50 61 67 65 28 70 42 74 2c  if( getPage(pBt,
15a10 20 31 2c 20 26 70 50 61 67 65 31 29 3d 3d 53 51   1, &pPage1)==SQ
15a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15a30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
15a40 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
15a50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
15a60 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
15a70 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
15a80 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
15a90 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
15aa0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
15ab0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
15ac0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
15ad0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
15ae0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
15af0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
15b00 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
15b10 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
15b20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15b30 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
15b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
15b50 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
15b60 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
15b70 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
15b80 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
15b90 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
15ba0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72  ntegrity(p);.  r
15bb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15bc0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
15bd0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
15be0 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
15bf0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
15c00 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
15c10 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
15c20 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
15c30 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
15c40 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
15c50 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
15c60 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
15c70 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
15c80 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
15c90 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
15ca0 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
15cb0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
15cc0 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
15cd0 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
15ce0 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
15cf0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
15d00 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
15d10 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
15d20 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
15d30 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
15d40 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
15d50 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
15d60 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
15d70 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
15d80 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
15d90 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
15da0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
15db0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
15dc0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
15dd0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
15de0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
15df0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
15e00 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
15e10 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
15e20 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
15e30 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
15e40 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
15e50 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
15e60 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
15e70 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
15e80 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
15e90 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
15ea0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
15eb0 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
15ec0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
15ed0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15ee0 74 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54  t;.  if( (p->inT
15ef0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
15f00 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d  E) || pBt->inStm
15f10 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
15f20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
15f30 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
15f40 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
15f50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
15f60 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15f70 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
15f80 0a 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61  .  rc = pBt->rea
15f90 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f  dOnly ? SQLITE_O
15fa0 4b 20 3a 20 73 71 6c 69 74 65 33 70 61 67 65 72  K : sqlite3pager
15fb0 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 42 74 2d  _stmt_begin(pBt-
15fc0 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d  >pPager);.  pBt-
15fd0 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72  >inStmt = 1;.  r
15fe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
15ff0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73  .** Commit the s
16000 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  tatment subtrans
16010 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
16020 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49   in progress.  I
16030 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73  f no.** subtrans
16040 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
16050 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
16060 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
16070 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
16080 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16090 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
160a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
160b0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
160c0 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
160d0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
160e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
160f0 74 5f 63 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50  t_commit(pBt->pP
16100 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
16110 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16120 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69  OK;.  }.  pBt->i
16130 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74  nStmt = 0;.  ret
16140 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16150 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63   Rollback the ac
16160 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73  tive statement s
16170 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  ubtransaction.  
16180 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63  If no subtransac
16190 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76  tion.** is activ
161a0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
161b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
161c0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
161d0 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
161e0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
161f0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
16200 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72  .** to use a cur
16210 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  sor that was ope
16220 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
16230 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
16240 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73  tion.** will res
16250 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
16260 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16270 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
16280 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16290 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
162a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
162b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
162c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c  lite3MallocDisal
162d0 6c 6f 77 28 29 3b 0a 20 20 69 66 28 20 70 42 74  low();.  if( pBt
162e0 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
162f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
16300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
16310 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63  ger_stmt_rollbac
16320 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
16330 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
16340 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
16350 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
16360 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
16370 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  }.  sqlite3Mallo
16380 63 41 6c 6c 6f 77 28 29 3b 0a 20 20 72 65 74 75  cAllow();.  retu
16390 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
163a0 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70  Default key comp
163b0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
163c0 74 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f  to be used if no
163d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
163e0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69  tion.** is speci
163f0 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69  fied on the sqli
16400 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
16410 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
16420 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65   int dfltCompare
16430 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
16440 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d,             /
16450 2a 20 55 73 65 72 20 64 61 74 61 20 69 73 20 6e  * User data is n
16460 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
16470 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   n1, const void 
16480 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  *p1,    /* First
16490 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
164a0 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e  */.  int n2, con
164b0 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20  st void *p2     
164c0 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f  /* Second key to
164d0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20   compare */.){. 
164e0 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65   int c;.  c = me
164f0 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c  mcmp(p1, p2, n1<
16500 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20  n2 ? n1 : n2);. 
16510 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
16520 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20   c = n1 - n2;.  
16530 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
16540 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
16550 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
16560 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
16570 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
16580 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
16590 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
165a0 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
165b0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
165c0 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
165d0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
165e0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
165f0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
16600 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
16610 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
16620 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
16630 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
16640 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
16650 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
16660 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
16670 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
16680 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
16690 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
166a0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
166b0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
166c0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
166d0 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
166e0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
166f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
16700 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
16710 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
16720 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4e 6f 20 6f  1.**.** 2:  No o
16730 74 68 65 72 20 63 75 72 73 6f 72 73 20 6d 61 79  ther cursors may
16740 20 62 65 20 6f 70 65 6e 20 77 69 74 68 20 77 72   be open with wr
16750 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
16760 61 6d 65 20 74 61 62 6c 65 0a 2a 2a 0a 2a 2a 20  ame table.**.** 
16770 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
16780 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
16790 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
167a0 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
167b0 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
167c0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
167d0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
167e0 43 6f 6e 64 69 74 69 6f 6e 20 32 20 77 61 72 72  Condition 2 warr
167f0 61 6e 74 73 20 66 75 72 74 68 65 72 20 64 69 73  ants further dis
16800 63 75 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79  cussion.  If any
16810 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65   cursor is opene
16820 64 0a 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 20  d.** on a table 
16830 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20  with wrFlag==0, 
16840 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6c  that prevents al
16850 6c 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  l other cursors 
16860 66 72 6f 6d 0a 2a 2a 20 77 72 69 74 69 6e 67 20  from.** writing 
16870 74 6f 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20  to that table.  
16880 54 68 69 73 20 69 73 20 61 20 6b 69 6e 64 20 6f  This is a kind o
16890 66 20 22 72 65 61 64 2d 6c 6f 63 6b 22 2e 20 20  f "read-lock".  
168a0 57 68 65 6e 20 61 20 63 75 72 73 6f 72 0a 2a 2a  When a cursor.**
168b0 20 69 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20   is opened with 
168c0 77 72 46 6c 61 67 3d 3d 30 20 69 74 20 69 73 20  wrFlag==0 it is 
168d0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
168e0 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 6e  the table will n
168f0 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 20 61 73 20  ot.** change as 
16900 6c 6f 6e 67 20 61 73 20 74 68 65 20 63 75 72 73  long as the curs
16910 6f 72 20 69 73 20 6f 70 65 6e 2e 20 20 54 68 69  or is open.  Thi
16920 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 75 72  s allows the cur
16930 73 6f 72 20 74 6f 0a 2a 2a 20 64 6f 20 61 20 73  sor to.** do a s
16940 65 71 75 65 6e 74 69 61 6c 20 73 63 61 6e 20 6f  equential scan o
16950 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
16960 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 77 6f  out having to wo
16970 72 72 79 20 61 62 6f 75 74 0a 2a 2a 20 65 6e 74  rry about.** ent
16980 72 69 65 73 20 62 65 69 6e 67 20 69 6e 73 65 72  ries being inser
16990 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 64  ted or deleted d
169a0 75 72 69 6e 67 20 74 68 65 20 73 63 61 6e 2e 20  uring the scan. 
169b0 20 43 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 0a   Cursors should.
169c0 2a 2a 20 62 65 20 6f 70 65 6e 65 64 20 77 69 74  ** be opened wit
169d0 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79  h wrFlag==0 only
169e0 20 69 66 20 74 68 69 73 20 72 65 61 64 2d 6c 6f   if this read-lo
169f0 63 6b 20 70 72 6f 70 65 72 74 79 20 69 73 20 6e  ck property is n
16a00 65 65 64 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69  eeded..** That i
16a10 73 20 74 6f 20 73 61 79 2c 20 63 75 72 73 6f 72  s to say, cursor
16a20 73 20 73 68 6f 75 6c 64 20 62 65 20 6f 70 65 6e  s should be open
16a30 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
16a40 30 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 0a 2a  0 only if they.*
16a50 2a 20 69 6e 74 65 6e 64 20 74 6f 20 75 73 65 20  * intend to use 
16a60 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
16a70 4e 65 78 74 28 29 20 73 79 73 74 65 6d 20 63 61  Next() system ca
16a80 6c 6c 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 63  ll.  All other c
16a90 75 72 73 6f 72 73 0a 2a 2a 20 73 68 6f 75 6c 64  ursors.** should
16aa0 20 62 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20   be opened with 
16ab0 77 72 46 6c 61 67 3d 3d 31 20 65 76 65 6e 20 69  wrFlag==1 even i
16ac0 66 20 74 68 65 79 20 6e 65 76 65 72 20 72 65 61  f they never rea
16ad0 6c 6c 79 20 69 6e 74 65 6e 64 0a 2a 2a 20 74 6f  lly intend.** to
16ae0 20 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 4e   write..** .** N
16af0 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
16b00 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
16b10 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
16b20 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
16b30 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
16b40 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
16b50 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
16b60 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
16b70 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
16b80 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
16b90 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** The compariso
16ba0 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  n function must 
16bb0 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65  be logically the
16bc0 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20   same for every 
16bd0 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70  cursor.** on a p
16be0 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
16bf0 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63    Changing the c
16c00 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
16c10 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
16c20 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f  * in incorrect o
16c30 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74  perations.  If t
16c40 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
16c50 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
16c60 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d  a.** default com
16c70 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16c80 20 69 73 20 75 73 65 64 2e 20 20 54 68 65 20 63   is used.  The c
16c90 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
16ca0 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  on is.** always 
16cb0 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b  ignored for INTK
16cc0 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e  EY tables..*/.in
16cd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
16ce0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
16cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
16d20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
16d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
16d60 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
16d70 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
16db0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
16dc0 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69   int (*xCmp)(voi
16dd0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
16de0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
16df0 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70  d*), /* Key Comp
16e00 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20  arison func */. 
16e10 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20   void *pArg,    
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16e40 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
16e50 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
16e60 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20  ursor **ppCur   
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16e90 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
16ea0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
16eb0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
16ec0 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ur;.  BtShared *
16ed0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
16ee0 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20 20 69   *ppCur = 0;.  i
16ef0 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
16f00 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
16f10 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ly ){.      retu
16f20 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
16f30 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
16f40 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
16f50 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29  (pBt, iTable, 0)
16f60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16f70 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
16f80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
16f90 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
16fa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  ){.    rc = lock
16fb0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
16fc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16ff0 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20   }.  }.  pCur = 
17000 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
17010 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20  zeof(*pCur) );. 
17020 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 7b 0a   if( pCur==0 ){.
17030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17040 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
17050 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
17060 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70  ception;.  }.  p
17070 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
17080 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
17090 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
170a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
170b0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
170c0 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ger)==0 ){.    r
170d0 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  c = SQLITE_EMPTY
170e0 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
170f0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
17100 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  on;.  }.  rc = g
17110 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
17120 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
17130 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
17140 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
17150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17160 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
17170 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
17180 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
17190 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
171a0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
171b0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
171c0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
171d0 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20  variables, link 
171e0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
171f0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
17200 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72  t and set *ppCur
17210 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75   (the.  ** outpu
17220 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
17230 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20  is function)..  
17240 2a 2f 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70  */.  pCur->xComp
17250 61 72 65 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d  are = xCmp ? xCm
17260 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b  p : dfltCompare;
17270 0a 20 20 70 43 75 72 2d 3e 70 41 72 67 20 3d 20  .  pCur->pArg = 
17280 70 41 72 67 3b 0a 20 20 70 43 75 72 2d 3e 70 42  pArg;.  pCur->pB
17290 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
172a0 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61  ->wrFlag = wrFla
172b0 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
172c0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
172d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
172e0 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
172f0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
17300 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
17310 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
17320 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
17330 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
17340 0a 20 20 2a 70 70 43 75 72 20 3d 20 70 43 75 72  .  *ppCur = pCur
17350 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
17360 54 45 5f 4f 4b 3b 0a 63 72 65 61 74 65 5f 63 75  TE_OK;.create_cu
17370 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a  rsor_exception:.
17380 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
17390 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
173a0 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
173b0 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 29  sqliteFree(pCur)
173c0 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74  ;.  }.  unlockBt
173d0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
173e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
173f0 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f 74 20  ..#if 0  /* Not 
17400 55 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68  Used */./*.** Ch
17410 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
17420 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
17430 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
17440 79 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  y a cursor..*/.v
17450 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
17460 53 65 74 43 6f 6d 70 61 72 65 28 0a 20 20 42 74  SetCompare(.  Bt
17470 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
17480 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
17490 74 6f 20 77 68 6f 73 65 20 63 6f 6d 70 61 72 69  to whose compari
174a0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  son function is 
174b0 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 69 6e 74  changed */.  int
174c0 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e  (*xCmp)(void*,in
174d0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
174e0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20  t,const void*), 
174f0 2f 2a 20 4e 65 77 20 63 6f 6d 70 61 72 69 73 6f  /* New compariso
17500 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64  n func */.  void
17510 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
17520 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
17530 74 20 74 6f 20 78 43 6d 70 28 29 20 2a 2f 0a 29  t to xCmp() */.)
17540 7b 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  {.  pCur->xCompa
17550 72 65 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70  re = xCmp ? xCmp
17560 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a   : dfltCompare;.
17570 20 20 70 43 75 72 2d 3e 70 41 72 67 20 3d 20 70    pCur->pArg = p
17580 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  Arg;.}.#endif../
17590 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
175a0 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
175b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
175c0 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
175d0 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
175e0 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
175f0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
17600 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
17610 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
17620 2a 70 43 75 72 29 7b 0a 20 20 42 74 53 68 61 72  *pCur){.  BtShar
17630 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
17640 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 72  pBtree->pBt;.  r
17650 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
17660 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
17670 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 75 72  , 0);.  if( pCur
17680 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
17690 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
176a0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
176b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
176c0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
176d0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  r->pNext;.  }.  
176e0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
176f0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
17700 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
17710 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72  ->pPrev;.  }.  r
17720 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
17730 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63  >pPage);.  unloc
17740 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
17750 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Bt);.  sqliteFre
17760 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
17770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17780 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d  /*.** Make a tem
17790 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79  porary cursor by
177a0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
177b0 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43  fields of pTempC
177c0 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f  ur..** The tempo
177d0 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e  rary cursor is n
177e0 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ot on the cursor
177f0 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74   list for the Bt
17800 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ree..*/.static v
17810 6f 69 64 20 67 65 74 54 65 6d 70 43 75 72 73 6f  oid getTempCurso
17820 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
17830 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
17840 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70 79 28  pCur){.  memcpy(
17850 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
17860 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
17870 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
17880 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
17890 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
178a0 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  if( pTempCur->pP
178b0 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
178c0 65 33 70 61 67 65 72 5f 72 65 66 28 70 54 65 6d  e3pager_ref(pTem
178d0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
178e0 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ta);.  }.}../*.*
178f0 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f  * Delete a tempo
17900 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68  rary cursor such
17910 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20   as was made by 
17920 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72  the CreateTempor
17930 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66  aryCursor().** f
17940 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a  unction above..*
17950 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
17960 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
17970 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
17980 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61  .  if( pCur->pPa
17990 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ge ){.    sqlite
179a0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 43 75  3pager_unref(pCu
179b0 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29  r->pPage->aData)
179c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
179d0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
179e0 75 72 73 6f 72 2e 69 6e 66 6f 20 66 69 65 6c 64  ursor.info field
179f0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 75   of the given cu
17a00 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 0a 2a  rsor is valid..*
17a10 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  * If it is not a
17a20 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
17a30 6c 6c 20 70 61 72 73 65 43 65 6c 6c 28 29 20 74  ll parseCell() t
17a40 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
17a50 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
17a60 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
17a70 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
17a80 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
17a90 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
17aa0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
17ab0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
17ac0 61 6c 6c 73 20 74 6f 20 70 61 72 73 65 43 65 6c  alls to parseCel
17ad0 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  l()..*/.static v
17ae0 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
17af0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
17b00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
17b10 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
17b20 20 20 70 61 72 73 65 43 65 6c 6c 28 70 43 75 72    parseCell(pCur
17b30 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
17b40 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dx, &pCur->info)
17b50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64  ;.  }else{.#ifnd
17b60 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 43 65  ef NDEBUG.    Ce
17b70 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
17b80 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
17b90 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
17ba0 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 28 70  .    parseCell(p
17bb0 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
17bc0 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  ->idx, &info);. 
17bd0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
17be0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
17bf0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
17c00 6f 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  o))==0 );.#endif
17c10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
17c20 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
17c30 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
17c40 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
17c50 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
17c60 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
17c70 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
17c80 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
17c90 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
17ca0 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
17cb0 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
17cc0 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
17cd0 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
17ce0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
17cf0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
17d00 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
17d10 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
17d20 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
17d30 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
17d40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17d50 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
17d60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17d70 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
17d80 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
17d90 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
17da0 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66  n(pCur, 1);.  if
17db0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17dc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17dd0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17de0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
17df0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17e00 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
17e10 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
17e20 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
17e30 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a  D ){.      *pSiz
17e40 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
17e50 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
17e60 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
17e70 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
17e80 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d  info.nKey;.    }
17e90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
17eb0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
17ec0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17ed0 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
17ee0 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
17ef0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
17f00 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74   to.  Always ret
17f10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
17f20 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
17f30 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74   possible.  If t
17f40 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
17f50 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
17f60 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74  inting to an ent
17f70 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61  ry (which can ha
17f80 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  ppen, for exampl
17f90 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74  e, if.** the dat
17fa0 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20  abase is empty) 
17fb0 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73  then *pSize is s
17fc0 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20  et to 0..*/.int 
17fd0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
17fe0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
17ff0 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
18000 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  {.  int rc = res
18010 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
18020 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
18030 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
18040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
18050 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
18060 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
18070 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
18080 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18090 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
180a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
180b0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
180c0 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69     /* Not pointi
180d0 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e  ng at a valid en
180e0 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65  try - set *pSize
180f0 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20   to 0. */.      
18100 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
18110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
18120 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
18130 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
18140 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
18150 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18170 20 52 65 61 64 20 70 61 79 6c 6f 61 64 20 69 6e   Read payload in
18180 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
18190 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
181a0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
181b0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  .** pointing to.
181c0 20 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20    Begin reading 
181d0 74 68 65 20 70 61 79 6c 6f 61 64 20 61 74 20 22  the payload at "
181e0 6f 66 66 73 65 74 22 20 61 6e 64 20 72 65 61 64  offset" and read
181f0 0a 2a 2a 20 61 20 74 6f 74 61 6c 20 6f 66 20 22  .** a total of "
18200 61 6d 74 22 20 62 79 74 65 73 2e 20 20 50 75 74  amt" bytes.  Put
18210 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 7a   the result in z
18220 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
18230 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
18240 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
18250 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
18260 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
18270 6a 75 73 74 20 72 65 61 64 73 20 62 79 74 65 73  just reads bytes
18280 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
18290 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
182a0 67 68 74 20 61 70 70 65 61 72 0a 2a 2a 20 6f 6e  ght appear.** on
182b0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f   the main page o
182c0 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
182d0 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
182e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
182f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
18300 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
18310 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
18320 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
18330 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
18340 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
18350 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  t offset,       
18360 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
18370 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
18380 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  o payload */.  i
18390 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
183a0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
183b0 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
183c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
183d0 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
183e0 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
183f0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
18400 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
18410 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
18420 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
18430 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
18440 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
18450 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
18460 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
18470 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
18480 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
18490 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69  Shared *pBt;.  i
184a0 6e 74 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 75  nt ovflSize;.  u
184b0 33 32 20 6e 4b 65 79 3b 0a 0a 20 20 61 73 73 65  32 nKey;..  asse
184c0 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
184d0 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
184e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
184f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18500 56 41 4c 49 44 20 29 3b 0a 20 20 70 42 74 20 3d  VALID );.  pBt =
18510 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
18520 42 74 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  Bt;.  pPage = pC
18530 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 61 67  ur->pPage;.  pag
18540 65 49 6e 74 65 67 72 69 74 79 28 70 50 61 67 65  eIntegrity(pPage
18550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
18560 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
18570 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
18580 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
18590 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
185a0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
185b0 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
185c0 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
185d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
185e0 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
185f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
18600 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
18610 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
18620 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
18630 30 20 29 3b 0a 20 20 69 66 28 20 73 6b 69 70 4b  0 );.  if( skipK
18640 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
18650 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
18660 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
18670 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
18680 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  .nData ){.    re
18690 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
186a0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  R;.  }.  if( off
186b0 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
186c0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
186d0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
186e0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
186f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
18700 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
18710 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
18720 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
18730 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61 50  memcpy(pBuf, &aP
18740 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
18750 61 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 61  a);.    if( a==a
18760 6d 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  mt ){.      retu
18770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18780 20 20 7d 0a 20 20 20 20 6f 66 66 73 65 74 20 3d    }.    offset =
18790 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
187a0 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
187b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
187c0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
187d0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  fo.nLocal;.  }. 
187e0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
187f0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
18800 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
18810 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
18820 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
18830 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
18840 63 61 6c 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65  cal]);.    while
18850 28 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  ( amt>0 && nextP
18860 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  age ){.      rc 
18870 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
18880 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
18890 6e 65 78 74 50 61 67 65 2c 20 28 76 6f 69 64 2a  nextPage, (void*
188a0 2a 29 26 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  *)&aPayload);.  
188b0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
188c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
188d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
188e0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
188f0 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
18900 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
18910 74 3c 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  t<ovflSize ){.  
18920 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
18930 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
18940 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
18950 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18960 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
18970 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
18980 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
18990 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61  y(pBuf, &aPayloa
189a0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b  d[offset+4], a);
189b0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
189c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 6d 74  = 0;.        amt
189d0 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
189e0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
189f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f  }else{.        o
18a00 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
18a10 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
18a20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
18a30 72 65 66 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  ref(aPayload);. 
18a40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18a50 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
18a60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18a70 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
18a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18a90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18aa0 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
18ab0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
18ac0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
18ad0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
18ae0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
18af0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
18b00 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
18b10 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
18b20 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
18b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18b40 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
18b50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
18b60 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18b70 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
18b80 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
18b90 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
18ba0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
18bb0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
18bc0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
18bd0 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
18be0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
18bf0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
18c00 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
18c10 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72   int rc = restor
18c20 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
18c30 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b  sition(pCur, 1);
18c40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
18c60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18c70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18c90 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18ca0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
18cb0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
18cc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18cd0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18ce0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18cf0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
18d00 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
18d10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18d20 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18d30 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
18d40 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
18d50 3d 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75  = getPayload(pCu
18d60 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
18d70 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
18d80 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pBuf, 0);.  }.  
18d90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18da0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
18db0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
18dc0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
18dd0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
18de0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
18df0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
18e00 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
18e10 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
18e20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
18e30 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
18e40 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18e50 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
18e60 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
18e70 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
18e80 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
18e90 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
18ea0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
18eb0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
18ec0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
18ed0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18ee0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
18ef0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
18f00 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
18f10 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
18f20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
18f30 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
18f40 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
18f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18f60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18f70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18f80 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
18f90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18fa0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  pPage!=0 );.    
18fb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
18fc0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
18fd0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
18fe0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
18ff0 20 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72   getPayload(pCur
19000 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
19010 42 75 66 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 1);.  }.  r
19020 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19030 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
19040 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
19050 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
19060 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
19070 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
19080 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
19090 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
190a0 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
190b0 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
190c0 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
190d0 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
190e0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
190f0 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
19100 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
19110 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
19120 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
19130 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
19140 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
19150 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
19160 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19170 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
19180 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
19190 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
191a0 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
191b0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
191c0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
191d0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
191e0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
191f0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
19200 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
19210 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
19220 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
19230 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
19240 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
19250 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
19260 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
19270 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
19280 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
19290 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
192a0 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
192b0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
192c0 2c 20 74 68 65 6e 20 67 65 74 50 61 79 6c 6f 61  , then getPayloa
192d0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
192e0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a   to reassembly.*
192f0 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
19300 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
19310 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
19320 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
19330 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
19340 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
19350 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
19360 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
19370 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
19380 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
19390 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
193a0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
193b0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
193c0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
193d0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
193e0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
193f0 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
19400 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
19410 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
19420 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
19430 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
19440 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
19450 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
19460 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
19470 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
19480 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
19490 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
194a0 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
194b0 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
194c0 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
194d0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
194e0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
194f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19500 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
19510 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  nt nLocal;..  as
19520 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
19530 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
19540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19550 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19560 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61  R_VALID );.  pPa
19570 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
19580 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74  ;.  pageIntegrit
19590 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65  y(pPage);.  asse
195a0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
195b0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
195c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
195d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
195e0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
195f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
19600 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
19610 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
19620 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
19630 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
19640 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
19650 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75  {.    nKey = pCu
19660 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
19670 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
19680 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
19690 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
196a0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
196b0 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
196c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
196d0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
196e0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
196f0 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
19700 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
19710 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
19720 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
19730 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
19740 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
19750 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
19760 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
19770 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
19780 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
19790 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
197a0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
197b0 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
197c0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
197d0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
197e0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
197f0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
19800 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
19810 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
19820 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
19830 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
19840 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
19850 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
19860 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
19870 74 72 65 65 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  tree routine..**
19880 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
19890 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
198a0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
198b0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
198c0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
198d0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
198e0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
198f0 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
19900 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
19910 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
19920 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
19930 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75  pAmt){.  if( pCu
19940 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19950 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
19960 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
19970 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
19980 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
19990 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
199a0 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
199b0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
199c0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
199d0 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
199e0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
199f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19a00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
19a10 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
19a20 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
19a30 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
19a40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
19a50 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
19a60 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
19a70 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
19a80 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
19a90 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
19aa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
19ab0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
19ac0 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
19ad0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
19ae0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19af0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
19b00 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
19b10 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
19b20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67  MemPage *pOldPag
19b30 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
19b40 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
19b50 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  e->pBt;..  asser
19b60 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19b70 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
19b80 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
19b90 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
19ba0 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20  gno, &pNewPage, 
19bb0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
19bc0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19bd0 72 63 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72  rc;.  pageIntegr
19be0 69 74 79 28 70 4e 65 77 50 61 67 65 29 3b 0a 20  ity(pNewPage);. 
19bf0 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61   pNewPage->idxPa
19c00 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78  rent = pCur->idx
19c10 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70  ;.  pOldPage = p
19c20 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f  Cur->pPage;.  pO
19c30 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74  ldPage->idxShift
19c40 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
19c50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20  age(pOldPage);. 
19c60 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
19c70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
19c80 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  >idx = 0;.  pCur
19c90 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
19ca0 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
19cb0 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20  ->nCell<1 ){.   
19cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19cd0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
19ce0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19cf0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
19d00 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
19d10 20 70 61 67 65 20 69 73 20 74 68 65 20 76 69 72   page is the vir
19d20 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73  tual root of its
19d30 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
19d40 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
19d50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
19d60 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61  page for most ta
19d70 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f  bles.  But.** fo
19d80 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  r the table root
19d90 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f  ed on page 1, so
19da0 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20  metime the real 
19db0 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
19dc0 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72  empty except for
19dd0 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
19de0 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73  er.  In such cas
19df0 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  es the.** virtua
19e00 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
19e10 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65  he page that the
19e20 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f   right-pointer o
19e30 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70  f page.** 1 is p
19e40 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 73  ointing to..*/.s
19e50 74 61 74 69 63 20 69 6e 74 20 69 73 52 6f 6f 74  tatic int isRoot
19e60 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
19e70 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
19e80 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  *pParent = pPage
19e90 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28  ->pParent;.  if(
19ea0 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72 65   pParent==0 ) re
19eb0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50  turn 1;.  if( pP
19ec0 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20  arent->pgno>1 ) 
19ed0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19ee0 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65 6e  get2byte(&pParen
19ef0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
19f00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
19f10 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19f20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
19f30 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19f40 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
19f50 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
19f60 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
19f70 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
19f80 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
19f90 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
19fa0 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
19fb0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
19fc0 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
19fd0 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
19fe0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
19ff0 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
1a000 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
1a010 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
1a020 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
1a030 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
1a040 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
1a050 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1a060 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1a070 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67  Parent;.  MemPag
1a080 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
1a090 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73  idxParent;..  as
1a0a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a0b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a0c0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1a0d0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
1a0e0 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b  ert( pPage!=0 );
1a0f0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f  .  assert( !isRo
1a100 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 3b  otPage(pPage) );
1a110 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
1a120 28 70 50 61 67 65 29 3b 0a 20 20 70 50 61 72 65  (pPage);.  pPare
1a130 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
1a140 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
1a150 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 70  Parent!=0 );.  p
1a160 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61  ageIntegrity(pPa
1a170 72 65 6e 74 29 3b 0a 20 20 69 64 78 50 61 72 65  rent);.  idxPare
1a180 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  nt = pPage->idxP
1a190 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
1a1a0 70 61 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e  pager_ref(pParen
1a1b0 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 72 65 6c  t->aData);.  rel
1a1c0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1a1d0 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
1a1e0 20 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72   pParent;.  pCur
1a1f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1a200 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1a210 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30  ent->idxShift==0
1a220 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20   );.  pCur->idx 
1a230 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a  = idxParent;.}..
1a240 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1a250 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
1a260 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
1a270 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
1a280 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1a290 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
1a2a0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1a2b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
1a2c0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1a2d0 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20  >pBtree->pBt;.. 
1a2e0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
1a2f0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1a300 75 72 2c 20 30 29 3b 0a 20 20 70 52 6f 6f 74 20  ur, 0);.  pRoot 
1a310 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1a320 20 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52   if( pRoot && pR
1a330 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
1a340 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  >pgnoRoot ){.   
1a350 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1a360 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73  isInit );.  }els
1a370 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20  e{.    if( .    
1a380 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
1a390 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1a3a0 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
1a3b0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
1a3c0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1a3d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1a3e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1a3f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a400 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
1a410 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
1a420 65 29 3b 0a 20 20 20 20 70 61 67 65 49 6e 74 65  e);.    pageInte
1a430 67 72 69 74 79 28 70 52 6f 6f 74 29 3b 0a 20 20  grity(pRoot);.  
1a440 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a450 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pRoot;.  }.  pCu
1a460 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
1a470 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1a480 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   0;.  if( pRoot-
1a490 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
1a4a0 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
1a4b0 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
1a4c0 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
1a4d0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
1a4e0 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
1a4f0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
1a500 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
1a510 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
1a520 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b  rt( subpage>0 );
1a530 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1a540 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
1a550 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1a560 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
1a570 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75  page);.  }.  pCu
1a580 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43  r->eState = ((pC
1a590 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a5a0 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44  >0)?CURSOR_VALID
1a5b0 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29  :CURSOR_INVALID)
1a5c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a5d0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a5e0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a5f0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
1a600 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1a610 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
1a620 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a630 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
1a650 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
1a660 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
1a670 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
1a680 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
1a690 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1a6a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1a6b0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
1a6c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1a6d0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1a6e0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
1a6f0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1a700 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a710 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a720 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
1a730 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
1a740 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
1a750 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1a760 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
1a770 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1a780 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a790 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1a7a0 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20   pCur->idx));.  
1a7b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a7c0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a7d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1a7e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
1a7f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a800 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a810 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1a820 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1a830 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
1a840 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
1a850 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1a860 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1a870 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
1a880 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
1a890 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
1a8a0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
1a8b0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
1a8c0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
1a8d0 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
1a8e0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1a8f0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
1a900 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
1a910 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
1a920 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
1a930 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1a940 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
1a950 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1a960 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
1a970 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
1a980 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
1a990 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
1a9a0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1a9b0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1a9c0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
1a9d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1a9e0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1a9f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1aa00 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ge;..  assert( p
1aa10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1aa20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1aa30 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
1aa40 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1aa50 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1aa60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1aa70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1aa80 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1aa90 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1aaa0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1aab0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1aac0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1aad0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1aae0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
1aaf0 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1ab00 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72  Cell - 1;.  pCur
1ab10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1ab20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ab30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
1ab40 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1ab50 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1ab60 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1ab70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1ab80 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1ab90 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1aba0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1abb0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1abc0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1abd0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1abe0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1abf0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1ac00 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1ac10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1ac20 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1ac30 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  rc;.  rc = moveT
1ac40 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1ac50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1ac60 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  c;.  if( pCur->e
1ac70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1ac80 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
1ac90 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1aca0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1acb0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1acc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1acd0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1ace0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1acf0 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73  ell>0 );.  *pRes
1ad00 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76   = 0;.  rc = mov
1ad10 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1ad20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ad30 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1ad40 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
1ad50 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1ad60 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1ad70 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1ad80 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1ad90 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1ada0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1adb0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1adc0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1add0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1ade0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1adf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ae00 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
1ae10 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1ae20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
1ae30 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1ae40 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
1ae50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
1ae60 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1ae70 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1ae80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1ae90 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1aea0 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
1aeb0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1aec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1aed0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1aee0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1aef0 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
1af00 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   0;.  rc = moveT
1af10 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1af20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1af30 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1af40 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1af50 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1af60 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65  ry near pKey/nKe
1af70 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  y..** Return a s
1af80 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1af90 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1afa0 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1afb0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1afc0 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
1afd0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
1afe0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e   other tables, n
1aff0 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Key is the numbe
1b000 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1b010 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20  ta.** in pKey.  
1b020 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
1b030 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  unction specifie
1b040 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  d when the curso
1b050 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64  r was.** created
1b060 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
1b070 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  are keys..**.** 
1b080 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1b090 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1b0a0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1b0b0 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1b0c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1b0d0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1b0e0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1b0f0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1b100 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1b110 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1b120 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1b130 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1b140 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1b150 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1b160 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1b170 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1b180 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1b190 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73  hich the.** curs
1b1a0 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  or is written to
1b1b0 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d   *pRes if pRes!=
1b1c0 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69  NULL.  The meani
1b1d0 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61  ng of.** this va
1b1e0 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  lue is as follow
1b1f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
1b200 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
1b210 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1b220 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1b230 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1b240 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
1b250 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20  aller than pKey 
1b260 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1b270 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1b290 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1b2a0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1b2b0 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1b2c0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1b2d0 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1b2e0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b2f0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b300 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b310 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1b320 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a  matches pKey..**
1b330 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1b340 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b350 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b360 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b370 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b380 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1b390 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e  than pKey..*/.in
1b3a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1b3b0 76 65 74 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  veto(BtCursor *p
1b3c0 43 75 72 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Cur, const void 
1b3d0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
1b3e0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1b3f0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74 72 79  nt rc;.  int try
1b400 52 69 67 68 74 6d 6f 73 74 3b 0a 20 20 72 63 20  Rightmost;.  rc 
1b410 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1b420 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
1b430 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65  eturn rc;.  asse
1b440 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
1b450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b460 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
1b470 20 29 3b 0a 20 20 74 72 79 52 69 67 68 74 6d 6f   );.  tryRightmo
1b480 73 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  st = pCur->pPage
1b490 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 69 66 28 20  ->intKey;.  if( 
1b4a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b4b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1b4c0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1b4d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b4e0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1b4f0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1b500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1b510 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1b520 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1b530 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1b540 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b550 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1b560 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
1b570 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
1b580 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
1b590 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
1b5a0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
1b5b0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
1b5c0 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21  ell-1;.    if( !
1b5d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1b5e0 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20   pKey==0 ){.    
1b5f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b600 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b610 20 20 7d 0a 20 20 20 20 70 61 67 65 49 6e 74 65    }.    pageInte
1b620 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
1b630 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70    while( lwr<=up
1b640 72 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  r ){.      void 
1b650 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
1b660 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1b670 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1b680 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20   (lwr+upr)/2;.  
1b690 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1b6a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
1b6b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1b6c0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  y ){.        u8 
1b6d0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pCell;.        
1b6e0 69 66 28 20 74 72 79 52 69 67 68 74 6d 6f 73 74  if( tryRightmost
1b6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
1b700 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20  ur->idx = upr;. 
1b710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b720 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
1b730 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1b740 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1b750 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1b760 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1b770 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1b780 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1b790 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1b7a0 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1b7b0 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ll, &dummy);.   
1b7c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1b7d0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1b7e0 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65 79  (u64 *)&nCellKey
1b7f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1b800 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a  CellKey<nKey ){.
1b810 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
1b820 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b830 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65  if( nCellKey>nKe
1b840 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1b850 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
1b860 20 74 72 79 52 69 67 68 74 6d 6f 73 74 20 3d 20   tryRightmost = 
1b870 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1b880 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1b890 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1b8a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b8b0 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b    int available;
1b8c0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65  .        pCellKe
1b8d0 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63  y = (void *)fetc
1b8e0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26  hPayload(pCur, &
1b8f0 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20  available, 0);. 
1b900 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20         nCellKey 
1b910 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1b920 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  y;.        if( a
1b930 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b  vailable>=nCellK
1b940 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1b950 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
1b960 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
1b970 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1b980 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
1b990 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b9a0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
1b9b0 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
1b9c0 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  Raw( nCellKey );
1b9d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1b9e0 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74  CellKey==0 ) ret
1b9f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1ba00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ba10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1ba20 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
1ba30 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c  ey, (void *)pCel
1ba40 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1ba50 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70   c = pCur->xComp
1ba60 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20  are(pCur->pArg, 
1ba70 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1ba80 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ey, nKey, pKey);
1ba90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1baa0 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  eFree(pCellKey);
1bab0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1bac0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1bad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bae0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1baf0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1bb00 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1bb10 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1bb20 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1bb30 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1bb40 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1bb50 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1bb60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1bb70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bb80 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1bb90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1bba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bbb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bbc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1bbd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1bbe0 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
1bbf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bc00 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
1bc10 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
1bc20 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1bc30 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
1bc40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bc50 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
1bc60 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1bc70 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1bc80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1bc90 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1bca0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1bcb0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1bcc0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1bcd0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1bce0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1bcf0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1bd00 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1bd10 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1bd20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1bd30 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1bd40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1bd50 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1bd60 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
1bd70 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1bd80 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1bd90 20 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   c;.      return
1bda0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bdb0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  }.    pCur->idx 
1bdc0 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  = lwr;.    pCur-
1bdd0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1bde0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1bdf0 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
1be00 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
1be10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1be20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1be30 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a  /* NOT REACHED *
1be40 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  /.}../*.** Retur
1be50 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
1be60 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1be70 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1be80 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1be90 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
1bea0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
1beb0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1bec0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
1bed0 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
1bee0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1bef0 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
1bf00 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
1bf10 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
1bf20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
1bf30 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
1bf40 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
1bf50 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1bf60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
1bf70 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
1bf80 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
1bf90 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
1bfa0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
1bfb0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
1bfc0 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
1bfd0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
1bfe0 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
1bff0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
1c000 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
1c010 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
1c020 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
1c030 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
1c040 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
1c050 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
1c060 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
1c070 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
1c080 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
1c090 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1c0a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c0b0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1c0c0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1c0d0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1c0e0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1c0f0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1c100 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1c110 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1c120 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1c130 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1c140 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1c150 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1c160 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
1c170 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1c180 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1c190 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1c1a0 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
1c1b0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1c1c0 43 41 43 48 45 0a 20 20 72 63 20 3d 20 72 65 73  CACHE.  rc = res
1c1d0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
1c1e0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
1c1f0 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  1);.  if( rc!=SQ
1c200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c210 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1c220 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
1c230 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1c240 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1c250 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1c260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c270 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1c280 30 3b 0a 23 65 6e 64 69 66 20 0a 0a 20 20 61 73  0;.#endif ..  as
1c290 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
1c2a0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1c2b0 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43 55  >pPage;.  if( CU
1c2c0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1c2d0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1c2e0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1c2f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c300 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1c310 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1c320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1c330 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1c340 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1c350 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
1c360 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1c370 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  if( pCur->idx>=p
1c380 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1c390 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1c3a0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1c3b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1c3c0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
1c3d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c3e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
1c3f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1c400 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c410 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1c420 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1c430 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c440 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c450 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
1c460 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67     if( isRootPag
1c470 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1c480 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c490 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
1c4a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1c4b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
1c4c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
1c4e0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1c4f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1c500 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1c510 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69   }while( pCur->i
1c520 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
1c530 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
1c540 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1c550 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ->leafData ){.  
1c560 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c570 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
1c580 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1c590 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c5a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c5c0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1c5d0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1c5e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c5f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
1c600 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1c610 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
1c620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c630 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
1c640 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
1c650 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
1c660 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c670 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1c680 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1c690 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1c6a0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1c6b0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1c6c0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c6d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c6e0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1c6f0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1c700 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1c710 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1c720 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1c730 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
1c740 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1c750 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
1c760 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
1c770 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20  pPage;..#ifndef 
1c780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1c790 45 44 5f 43 41 43 48 45 0a 20 20 72 63 20 3d 20  ED_CACHE.  rc = 
1c7a0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
1c7b0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1c7c0 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 1);.  if( rc!
1c7d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c7e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c7f0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1c800 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p<0 ){.    pCur-
1c810 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1c820 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1c830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c840 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1c850 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
1c860 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1c870 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1c880 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1c890 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1c8a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1c8b0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1c8c0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
1c8d0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1c8e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c8f0 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  idx>=0 );.  if( 
1c900 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c910 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1c920 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50  yte( findCell(pP
1c930 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1c940 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1c950 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1c960 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
1c970 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c980 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1c990 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1c9a0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1c9b0 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b   pCur->idx==0 ){
1c9c0 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 6f  .      if( isRoo
1c9d0 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
1c9e0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1c9f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1ca00 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
1ca10 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1ca20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ca30 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1ca40 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
1ca50 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
1ca60 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1ca70 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1ca80 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72  >idx--;.    pCur
1ca90 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1caa0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1cab0 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50  >leafData && !pP
1cac0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1cae0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
1caf0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1cb00 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1cb10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1cb20 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
1cb30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1cb40 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1cb50 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
1cb60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cb70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
1cb80 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
1cb90 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
1cba0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
1cbb0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1cbc0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1cbd0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1cbe0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1cbf0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1cc00 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1cc10 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1cc20 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1cc30 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1cc40 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1cc50 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1cc60 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
1cc70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
1cc80 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
1cc90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1cca0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
1ccb0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
1ccc0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
1ccd0 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
1cce0 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
1ccf0 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
1cd00 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
1cd10 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
1cd20 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
1cd30 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 6f 6e  pager_unref() on
1cd40 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
1cd50 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1cd60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
1cd70 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
1cd80 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
1cd90 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
1cda0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
1cdb0 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
1cdc0 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
1cdd0 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
1cde0 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
1cdf0 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
1ce00 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
1ce10 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
1ce20 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
1ce30 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1ce40 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
1ce50 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
1ce60 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
1ce70 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
1ce80 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
1ce90 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1cea0 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
1ceb0 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
1cec0 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
1ced0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1cee0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
1cef0 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
1cf00 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
1cf10 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
1cf20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1cf30 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
1cf40 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
1cf50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1cf60 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   allocatePage(. 
1cf70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1cf80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1cf90 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
1cfa0 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
1cfb0 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
1cfc0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1cfd0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
1cfe0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20    int n;     /* 
1cff0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1d000 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1d010 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
1d020 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
1d030 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
1d040 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1d050 20 2a 2f 0a 0a 20 20 70 50 61 67 65 31 20 3d 20   */..  pPage1 = 
1d060 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e  pBt->pPage1;.  n
1d070 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1d080 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1d090 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
1d0a0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
1d0b0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1d0c0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
1d0d0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
1d0e0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
1d0f0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  *pTrunk = 0;.   
1d100 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
1d110 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
1d120 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 75  Trunk = 0;.    u
1d130 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
1d140 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
1d150 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
1d160 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
1d170 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
1d180 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
1d190 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
1d1a0 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
1d1b0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
1d1c0 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
1d1d0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
1d1e0 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
1d1f0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1d200 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
1d210 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
1d220 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
1d230 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
1d240 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
1d250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d260 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1d270 20 65 78 61 63 74 20 29 7b 0a 20 20 20 20 20 20   exact ){.      
1d280 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
1d290 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
1d2a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d2b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1d2c0 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
1d2d0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
1d2e0 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
1d2f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1d300 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d310 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1d320 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1d330 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1d340 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
1d350 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1d360 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
1d370 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
1d380 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
1d390 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
1d3a0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
1d3b0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
1d3c0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
1d3d0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
1d3e0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
1d3f0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
1d400 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1d410 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1d420 28 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  (pPage1->aData);
1d430 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1d440 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
1d450 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1d460 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
1d470 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
1d480 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
1d490 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
1d4a0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
1d4b0 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
1d4c0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
1d4d0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
1d4e0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
1d4f0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
1d500 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
1d510 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
1d520 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
1d530 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
1d540 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
1d550 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
1d560 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
1d570 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
1d580 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1d590 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
1d5a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
1d5b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d5c0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
1d5d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1d5e0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
1d5f0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1d600 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  getPage(pBt, iTr
1d610 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 29 3b 0a 20  unk, &pTrunk);. 
1d620 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1d630 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d640 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1d650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d660 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1d670 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20    /* TODO: This 
1d680 73 68 6f 75 6c 64 20 6d 6f 76 65 20 74 6f 20 61  should move to a
1d690 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3f 20 2a  fter the loop? *
1d6a0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1d6b0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1d6c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a  pTrunk->aData);.
1d6d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d6e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1d6f0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20  age(pTrunk);.   
1d700 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d710 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
1d720 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d730 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d740 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1d750 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
1d760 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
1d770 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
1d780 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1d790 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
1d7a0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
1d7b0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
1d7c0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
1d7d0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
1d7e0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
1d7f0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
1d800 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
1d810 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
1d820 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
1d830 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
1d840 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
1d850 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
1d860 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
1d870 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
1d880 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
1d890 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1d8a0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1d8b0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1d8c0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1d8d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1d8e0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1d8f0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1d900 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1d910 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
1d920 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e  else if( k>pBt->
1d930 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
1d940 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
1d950 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
1d960 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
1d970 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1d980 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
1d990 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d9a0 5f 42 4b 50 54 3b 0a 23 69 66 6e 64 65 66 20 53  _BKPT;.#ifndef S
1d9b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1d9c0 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
1d9d0 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
1d9e0 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
1d9f0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
1da00 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
1da10 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
1da20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
1da30 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
1da40 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
1da50 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
1da60 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
1da70 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
1da80 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1da90 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
1daa0 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
1dab0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1dac0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1dad0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1dae0 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
1daf0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
1db00 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1db10 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1db20 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1db30 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1db40 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1db50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1db60 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
1db70 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1db80 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1db90 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1dba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1dbb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1dbc0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
1dbd0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
1dbe0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
1dbf0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
1dc00 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
1dc10 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
1dc20 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
1dc30 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
1dc40 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
1dc50 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
1dc60 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1dc70 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
1dc80 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
1dc90 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
1dca0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
1dcb0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1dcc0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
1dcd0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1dce0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
1dcf0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1dd00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dd10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dd20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1dd30 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20  ge(pTrunk);.    
1dd40 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1dd50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1dd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1dd70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1dd80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1dd90 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1dda0 77 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  write(pNewTrunk-
1ddb0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
1ddc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ddd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1dde0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ddf0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1de00 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1de10 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20  age(pTrunk);.   
1de20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1de30 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1de40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1de50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1de60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
1de70 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
1de80 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1de90 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1dea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
1deb0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
1dec0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
1ded0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
1dee0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1def0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
1df00 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
1df10 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
1df20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1df30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1df40 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1df50 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
1df60 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1df70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1df90 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1dfa0 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
1dfb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1dfc0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1dfd0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
1dfe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dff0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1e000 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1e010 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1e020 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1e030 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1e040 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
1e050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e060 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1e070 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
1e080 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
1e090 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
1e0a0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
1e0b0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1e0c0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
1e0d0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
1e0e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
1e0f0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
1e100 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20    int i, dist;. 
1e110 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1e120 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e130 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
1e140 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
1e150 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
1e160 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
1e170 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
1e180 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
1e190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e1a0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
1e1b0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
1e1c0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
1e1d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1e1e0 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e200 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
1e210 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1e220 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
1e230 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
1e240 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e270 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
1e280 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1e290 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
1e2a0 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
1e2b0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
1e2c0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
1e2d0 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
1e2e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  y ){.          *
1e2f0 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
1e300 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50           if( *pP
1e310 67 6e 6f 3e 73 71 6c 69 74 65 33 70 61 67 65 72  gno>sqlite3pager
1e320 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  _pagecount(pBt->
1e330 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1e340 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70         /* Free p
1e350 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20  age off the end 
1e360 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1e370 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e380 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e390 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1e3a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
1e3b0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1e3c0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
1e3d0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
1e3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e3f0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
1e400 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
1e420 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
1e430 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
1e440 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
1e450 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
1e460 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1e470 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
1e480 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
1e490 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
1e4a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e4b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e4c0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1e4d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
1e4e0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1e4f0 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 20  no, ppPage);.   
1e500 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1e510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
1e530 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
1e540 63 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  ck((*ppPage)->aD
1e550 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ata);.          
1e560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1e570 67 65 72 5f 77 72 69 74 65 28 28 2a 70 70 50 61  ger_write((*ppPa
1e580 67 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge)->aData);.   
1e590 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1e5c0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
1e5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1e5e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e5f0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1e600 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1e610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1e620 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1e630 72 75 6e 6b 29 3b 0a 20 20 20 20 7d 77 68 69 6c  runk);.    }whil
1e640 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
1e650 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1e660 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 65 6c 73  (pTrunk);.  }els
1e670 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
1e680 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
1e690 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
1e6a0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
1e6b0 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
1e6c0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1e6d0 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d   */.    *pPgno =
1e6e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
1e6f0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1e700 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64  ger) + 1;..#ifnd
1e710 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e720 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1e730 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1e740 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
1e750 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20  GE(pBt, *pPgno) 
1e760 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
1e770 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
1e780 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1e790 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
1e7a0 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
1e7b0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
1e7c0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
1e7d0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
1e7e0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
1e7f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
1e800 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
1e810 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
1e820 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
1e830 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
1e840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52       */.      TR
1e850 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1e860 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1e870 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
1e880 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
1e890 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
1e8a0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
1e8b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e8c0 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67  ) );.      (*pPg
1e8d0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  no)++;.    }.#en
1e8e0 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28  dif..    assert(
1e8f0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1e900 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e910 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  );.    rc = getP
1e920 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
1e930 20 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66   ppPage);.    if
1e940 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e950 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1e960 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 28 2a  e3pager_write((*
1e970 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 29 3b  ppPage)->aData);
1e980 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e9a0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
1e9b0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
1e9c0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1e9d0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
1e9e0 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
1e9f0 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
1ea00 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
1ea10 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1ea20 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
1ea30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1ea40 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1ea50 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68  abase file to th
1ea60 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
1ea70 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  * sqlite3pager_u
1ea80 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61  nref() is NOT ca
1ea90 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a  lled for pPage..
1eaa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
1eab0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
1eac0 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  pPage){.  BtShar
1ead0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1eae0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1eaf0 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1eb00 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c  Page1;.  int rc,
1eb10 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65   n, k;..  /* Pre
1eb20 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f  pare the page fo
1eb30 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61  r freeing */.  a
1eb40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
1eb50 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d  no>1 );.  pPage-
1eb60 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72  >isInit = 0;.  r
1eb70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1eb80 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50  ->pParent);.  pP
1eb90 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
1eba0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1ebb0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
1ebc0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
1ebd0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1ebe0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1ebf0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 69  ge1->aData);.  i
1ec00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1ec10 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  c;.  n = get4byt
1ec20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1ec30 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
1ec40 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1ec50 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66  [36], n+1);..#if
1ec60 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
1ec70 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
1ec80 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
1ec90 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
1eca0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
1ecb0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
1ecc0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
1ecd0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
1ece0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
1ecf0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
1ed00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1ed10 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d  ger_write(pPage-
1ed20 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  >aData);.  if( r
1ed30 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ed40 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
1ed50 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
1ed60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
1ed70 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1ed80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ed90 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74  VACUUM.  /* If t
1eda0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
1edb0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
1edc0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
1edd0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
1ede0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
1edf0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
1ee00 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
1ee10 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1ee20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
1ee30 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
1ee40 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50  , pPage->pgno, P
1ee50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
1ee60 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1ee70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ee80 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d  #endif..  if( n=
1ee90 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1eea0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
1eeb0 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ree page */.    
1eec0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1eed0 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61  r_write(pPage->a
1eee0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72  Data);.    if( r
1eef0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ef00 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
1ef10 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20  >aData, 0, 8);. 
1ef20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1ef30 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1ef40 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1ef50 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1ef60 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22  AGE: %d first\n"
1ef70 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
1ef80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ef90 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65   Other free page
1efa0 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  s already exist.
1efb0 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69    Retrive the fi
1efc0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  rst trunk page. 
1efd0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65     ** of the fre
1efe0 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f  elist and find o
1eff0 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76  ut how many leav
1f000 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20  es it has. */.  
1f010 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1f020 6b 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  k;.    rc = getP
1f030 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
1f040 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1f050 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 29 3b  [32]), &pTrunk);
1f060 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1f070 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d  turn rc;.    k =
1f080 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1f090 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
1f0a0 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73    if( k>=pBt->us
1f0b0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
1f0c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  {.      /* The t
1f0d0 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54  runk is full.  T
1f0e0 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69  urn the page bei
1f0f0 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20  ng freed into a 
1f100 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75  new.      ** tru
1f110 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20  nk page with no 
1f120 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20  leaves. */.     
1f130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1f140 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d 3e  er_write(pPage->
1f150 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  aData);.      if
1f160 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1f170 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1f180 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
1f190 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20  Trunk->pgno);.  
1f1a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1f1b0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
1f1c0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1f1d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1f1e0 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1f1f0 6f 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  o);.      TRACE(
1f200 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1f210 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
1f220 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a  eplacing %d\n",.
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1f240 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e  age->pgno, pTrun
1f250 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  k->pgno));.    }
1f260 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1f270 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65  dd the newly fre
1f280 65 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61  ed page as a lea
1f290 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  f on the current
1f2a0 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
1f2b0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1f2c0 72 5f 77 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  r_write(pTrunk->
1f2d0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  aData);.      if
1f2e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1f2f0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1f300 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1f310 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1f320 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
1f330 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20  ->aData[8+k*4], 
1f340 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69  pPage->pgno);.#i
1f350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
1f360 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
1f370 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
1f380 6e 74 5f 77 72 69 74 65 28 70 42 74 2d 3e 70 50  nt_write(pBt->pP
1f390 61 67 65 72 2c 20 70 50 61 67 65 2d 3e 70 67 6e  ager, pPage->pgn
1f3a0 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  o);.#endif.     
1f3b0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1f3c0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
1f3d0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
1f3e0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
1f3f0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1f400 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1f410 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
1f420 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f430 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
1f440 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
1f450 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f460 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
1f470 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
1f480 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1f490 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
1f4a0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
1f4b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1f4c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
1f4d0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
1f4e0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
1f4f0 74 20 72 63 3b 0a 0a 20 20 70 61 72 73 65 43 65  t rc;..  parseCe
1f500 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
1f510 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
1f520 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
1f530 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1f540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1f550 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
1f560 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
1f570 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
1f580 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
1f590 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1f5a0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1f5b0 66 6c 6f 77 5d 29 3b 0a 20 20 77 68 69 6c 65 28  flow]);.  while(
1f5c0 20 6f 76 66 6c 50 67 6e 6f 21 3d 30 20 29 7b 0a   ovflPgno!=0 ){.
1f5d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
1f5e0 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
1f5f0 50 67 6e 6f 3e 73 71 6c 69 74 65 33 70 61 67 65  Pgno>sqlite3page
1f600 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  r_pagecount(pBt-
1f610 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
1f620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f630 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f640 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
1f650 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
1f660 6e 6f 2c 20 26 70 4f 76 66 6c 29 3b 0a 20 20 20  no, &pOvfl);.   
1f670 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f680 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
1f690 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  o = get4byte(pOv
1f6a0 66 6c 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  fl->aData);.    
1f6b0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f  rc = freePage(pO
1f6c0 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vfl);.    sqlite
1f6d0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f 76  3pager_unref(pOv
1f6e0 66 6c 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  fl->aData);.    
1f6f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f700 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
1f710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f720 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
1f730 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
1f740 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
1f750 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
1f760 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
1f770 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
1f780 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
1f790 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
1f7a0 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
1f7b0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
1f7c0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
1f7d0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
1f7e0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
1f7f0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
1f800 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
1f810 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
1f820 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
1f830 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
1f840 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
1f850 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
1f860 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
1f870 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
1f880 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
1f890 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
1f8a0 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
1f8b0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
1f8c0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
1f8d0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
1f8e0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
1f8f0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
1f900 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
1f910 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
1f920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
1f930 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
1f940 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
1f950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f960 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1f970 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
1f980 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1f990 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
1f9a0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
1f9b0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
1f9c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1f9d0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
1f9e0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
1f9f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
1fa00 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
1fa10 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
1fa20 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
1fa50 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
1fa60 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
1fa70 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
1fa80 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
1fa90 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
1faa0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
1fab0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
1fac0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
1fad0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
1fae0 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
1faf0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1fb00 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
1fb10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1fb20 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
1fb30 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
1fb40 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
1fb50 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
1fb60 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
1fb70 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
1fb80 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
1fb90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1fba0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
1fbb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1fbc0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
1fbd0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
1fbe0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
1fbf0 61 64 65 72 5d 2c 20 6e 44 61 74 61 29 3b 0a 20  ader], nData);. 
1fc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
1fc10 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  a = 0;.  }.  nHe
1fc20 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
1fc30 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
1fc40 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
1fc50 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  ;.  parseCellPtr
1fc60 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1fc70 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
1fc80 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
1fc90 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
1fca0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
1fcb0 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
1fcc0 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61   info.nData==nDa
1fcd0 74 61 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  ta );.  .  /* Fi
1fce0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
1fcf0 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
1fd00 3d 20 6e 44 61 74 61 3b 0a 20 20 69 66 28 20 70  = nData;.  if( p
1fd10 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1fd20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
1fd30 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
1fd40 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
1fd50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1fd60 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  nPayload += nKey
1fd70 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
1fd80 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b  y;.    nSrc = nK
1fd90 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
1fda0 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
1fdb0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
1fdc0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
1fdd0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
1fde0 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
1fdf0 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
1fe00 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
1fe10 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
1fe20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
1fe30 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
1fe40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fe50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1fe60 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
1fe70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
1fe80 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
1fe90 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
1fea0 70 61 67 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  page */.#endif. 
1feb0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1fec0 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  tePage(pBt, &pOv
1fed0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
1fee0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
1fef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ff00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1ff10 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1ff20 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
1ff30 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
1ff40 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
1ff50 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
1ff60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1ff70 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
1ff80 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
1ff90 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
1ffa0 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
1ffb0 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 54  that page now. T
1ffc0 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
1ffd0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
1ffe0 70 61 67 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  page will be.   
1fff0 20 20 20 2a 2a 20 61 64 64 65 64 20 6c 61 74 65     ** added late
20000 72 2c 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  r, by the insert
20010 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Cell() routine..
20020 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20030 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
20040 75 6d 20 26 26 20 70 67 6e 6f 50 74 72 6d 61 70  um && pgnoPtrmap
20050 21 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  !=0 && rc==SQLIT
20060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20070 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
20080 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  Bt, pgnoOvfl, PT
20090 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
200a0 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20  pgnoPtrmap);.   
200b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
200c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
200d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
200e0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
200f0 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 43 65 6c       /* clearCel
20100 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
20110 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
20120 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
20130 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
20140 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
20150 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20160 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
20170 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
20180 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
20190 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
201a0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
201b0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
201c0 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
201d0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
201e0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
201f0 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
20200 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
20210 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
20220 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
20230 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
20240 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28  aceLeft;.    if(
20250 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
20260 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
20270 70 53 72 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63  pSrc );.    memc
20280 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
20290 63 2c 20 6e 29 3b 0a 20 20 20 20 6e 50 61 79 6c  c, n);.    nPayl
202a0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
202b0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
202c0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
202d0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
202e0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
202f0 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
20300 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
20310 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
20320 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
20330 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
20340 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
20350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20360 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
20370 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ge the MemPage.p
20380 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
20390 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73 65  n the page whose
203a0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69   number is.** gi
203b0 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
203c0 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68  d argument so th
203d0 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  at MemPage.pPare
203e0 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  nt holds the.** 
203f0 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74  pointer in the t
20400 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  hird argument..*
20410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
20420 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61 72  arentPage(BtShar
20430 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
20440 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  no, MemPage *pNe
20450 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64 78  wParent, int idx
20460 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
20470 68 69 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  his;.  unsigned 
20480 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 0a 20 20  char *aData;..  
20490 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72 65  assert( pNewPare
204a0 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  nt!=0 );.  if( p
204b0 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  gno==0 ) return 
204c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
204d0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72  ert( pBt->pPager
204e0 21 3d 30 20 29 3b 0a 20 20 61 44 61 74 61 20 3d  !=0 );.  aData =
204f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
20500 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
20510 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 61  , pgno);.  if( a
20520 44 61 74 61 20 29 7b 0a 20 20 20 20 70 54 68 69  Data ){.    pThi
20530 73 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  s = (MemPage*)&a
20540 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
20550 7a 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ze];.    assert(
20560 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 61   pThis->aData==a
20570 44 61 74 61 20 29 3b 0a 20 20 20 20 69 66 28 20  Data );.    if( 
20580 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
20590 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73  .      if( pThis
205a0 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50  ->pParent!=pNewP
205b0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
205c0 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
205d0 65 6e 74 20 29 20 73 71 6c 69 74 65 33 70 61 67  ent ) sqlite3pag
205e0 65 72 5f 75 6e 72 65 66 28 70 54 68 69 73 2d 3e  er_unref(pThis->
205f0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b  pParent->aData);
20600 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e  .        pThis->
20610 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61  pParent = pNewPa
20620 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71  rent;.        sq
20630 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 70  lite3pager_ref(p
20640 4e 65 77 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  NewParent->aData
20650 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20660 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e   pThis->idxParen
20670 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20  t = idx;.    }. 
20680 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
20690 75 6e 72 65 66 28 61 44 61 74 61 29 3b 0a 20 20  unref(aData);.  
206a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
206b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
206c0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
206d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
206e0 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
206f0 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  pBt, pgno, PTRMA
20700 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72  P_BTREE, pNewPar
20710 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent->pgno);.  }.
20720 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
20730 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
20740 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
20750 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72   pParent pointer
20760 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
20770 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69   of pPage to poi
20780 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50  nt back.** to pP
20790 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  age..**.** In ot
207a0 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65  her words, for e
207b0 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50  very child of pP
207c0 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61  age, invoke repa
207d0 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f  rentPage().** to
207e0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
207f0 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73  each child knows
20800 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69   that pPage is i
20810 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  ts parent..**.**
20820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
20830 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  ts called after 
20840 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65  you memcpy() one
20850 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e   page into.** an
20860 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  other..*/.static
20870 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69   int reparentChi
20880 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ldPages(MemPage 
20890 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
208a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
208b0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
208c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
208d0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
208e0 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72  ge->leaf ) retur
208f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
20900 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
20910 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
20920 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
20930 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
20940 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
20950 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
20960 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61   rc = reparentPa
20970 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
20980 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20  (pCell), pPage, 
20990 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
209a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
209b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
209c0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
209d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
209e0 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70  = reparentPage(p
209f0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
20a00 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
20a10 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c  ->hdrOffset+8]),
20a20 20 0a 20 20 20 20 20 20 20 70 50 61 67 65 2c 20   .       pPage, 
20a30 69 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  i);.    pPage->i
20a40 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d  dxShift = 0;.  }
20a50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20a60 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
20a70 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
20a80 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
20a90 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
20aa0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
20ab0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
20ac0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
20ad0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
20ae0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
20af0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
20b00 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
20b10 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
20b20 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
20b30 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
20b40 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
20b50 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
20b60 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
20b70 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
20b80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
20b90 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
20ba0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
20bb0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
20bc0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
20bd0 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
20be0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20bf0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
20c00 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
20c10 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
20c20 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
20c30 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
20c40 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
20c50 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
20c60 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
20c70 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
20c80 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
20c90 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
20ca0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
20cb0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
20cc0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
20cd0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
20ce0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
20cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
20d00 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
20d10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61  eable(pPage->aDa
20d20 74 61 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ta) );.  data = 
20d30 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
20d40 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
20d50 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
20d60 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
20d70 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
20d80 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26  assert( pc>10 &&
20d90 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70   pc+sz<=pPage->p
20da0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
20db0 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50  ;.  freeSpace(pP
20dc0 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
20dd0 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
20de0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
20df0 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
20e00 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
20e10 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
20e20 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
20e30 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
20e40 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
20e50 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
20e60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
20e70 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
20e80 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 2;.  pPage->id
20e90 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  xShift = 1;.}../
20ea0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
20eb0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
20ec0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
20ed0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
20ee0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
20ef0 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
20f00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
20f10 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
20f20 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
20f30 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
20f40 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
20f50 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
20f60 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
20f70 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
20f80 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
20f90 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
20fa0 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
20fb0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
20fc0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
20fd0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
20fe0 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
20ff0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
21000 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
21010 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
21020 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
21030 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
21040 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
21050 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
21060 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
21070 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
21080 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
21090 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
210a0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
210b0 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
210c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
210d0 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
210e0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
210f0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
21100 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
21110 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
21120 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
21130 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
21140 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
21150 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
21160 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
21170 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
21180 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
21190 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
211a0 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
211b0 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id)..*/.static i
211c0 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  nt insertCell(. 
211d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
211e0 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
211f0 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
21200 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
21210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21220 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
21230 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
21240 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
21250 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
21260 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
21270 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
21280 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
21290 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
212a0 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
212b0 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
212c0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
212d0 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
212e0 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
212f0 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20  d */.  u8 nSkip 
21300 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
21310 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72  ot write the fir
21320 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
21330 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  f the cell */.){
21340 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
21350 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
21360 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
21370 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
21380 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
21390 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
213a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
213b0 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
213c0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
213d0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
213e0 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
213f0 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
21400 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
21410 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
21420 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
21430 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
21440 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
21450 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
21460 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
21470 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
21480 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
21490 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
214a0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
214b0 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
214c0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
214d0 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
214e0 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
214f0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
21500 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
21510 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
21520 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
21530 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
21540 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
21550 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
21560 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
21570 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
21580 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
21590 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
215a0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
215b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
215c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
215d0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
215e0 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
215f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61  ssert( sqlite3pa
21600 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
21610 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b  pPage->aData) );
21620 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
21630 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
21640 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
21650 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
21660 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
21670 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
21680 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
21690 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
216a0 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
216b0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
216c0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
216d0 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70  sert( j<sizeof(p
216e0 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
216f0 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
21700 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  [0]) );.    pPag
21710 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
21720 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
21730 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
21740 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67  dx = i;.    pPag
21750 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  e->nFree = 0;.  
21760 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20  }else{.    data 
21770 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
21780 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
21790 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
217a0 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
217b0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
217c0 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
217d0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
217e0 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
217f0 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
21800 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20  ->nCell + 2;.   
21810 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
21820 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28  t + 2*i;.    if(
21830 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20   end > top - sz 
21840 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
21850 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
21860 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (pPage);.      i
21870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21880 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21890 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
218a0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
218b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
218c0 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
218d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
218e0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
218f0 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
21900 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
21910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
21920 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
21930 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
21940 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
21950 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
21960 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
21970 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
21980 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
21990 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
219a0 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
219b0 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
219c0 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
219d0 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
219e0 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
219f0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
21a00 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
21a10 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
21a20 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
21a30 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
21a40 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
21a50 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64  );.    pPage->id
21a60 78 53 68 69 66 74 20 3d 20 31 3b 0a 20 20 20 20  xShift = 1;.    
21a70 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50  pageIntegrity(pP
21a80 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
21a90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21aa0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
21ab0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
21ac0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
21ad0 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
21ae0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
21af0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
21b00 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
21b10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
21b20 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
21b30 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
21b40 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
21b50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
21b60 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
21b70 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
21b80 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
21b90 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
21ba0 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
21bb0 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
21bc0 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
21bd0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
21be0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
21bf0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
21c00 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
21c10 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  );.        int r
21c20 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50  c = ptrmapPut(pP
21c30 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76  age->pBt, pgnoOv
21c40 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
21c50 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
21c60 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
21c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21c80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
21c90 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
21ca0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
21cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21cc0 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
21cd0 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
21ce0 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
21cf0 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
21d00 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
21d10 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
21d20 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
21d30 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
21d40 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
21d50 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
21d60 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
21d70 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
21d80 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
21d90 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
21da0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
21db0 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
21dc0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
21dd0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
21de0 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
21df0 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74   bodies */.  int
21e00 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
21e10 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
21e20 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
21e30 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
21e40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21e50 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a  /.  int totalSiz
21e60 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  e;    /* Total s
21e70 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
21e80 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
21e90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21ea0 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
21eb0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72  */.  int cellptr
21ec0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
21ed0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
21ee0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
21ef0 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
21f00 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
21f10 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
21f20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
21f30 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68    /* Data for th
21f40 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73  e page */..  ass
21f50 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
21f60 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f  rflow==0 );.  to
21f70 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66  talSize = 0;.  f
21f80 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
21f90 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c   i++){.    total
21fa0 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  Size += aSize[i]
21fb0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21fc0 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c  totalSize+2*nCel
21fd0 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  l<=pPage->nFree 
21fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21ff0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
22000 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
22010 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
22020 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
22030 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
22040 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
22050 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
22060 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
22070 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
22080 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
22090 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
220a0 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
220b0 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
220c0 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
220d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
220e0 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
220f0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
22100 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
22110 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
22120 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
22130 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
22140 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
22150 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
22160 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
22170 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
22180 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
22190 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
221a0 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
221b0 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
221c0 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
221d0 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
221e0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
221f0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
22200 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a   = nCell;.}../*.
22210 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22220 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
22230 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
22240 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
22250 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
22260 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
22270 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
22280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
22290 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
222a0 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
222b0 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
222c0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
222d0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
222e0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
222f0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
22300 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
22310 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
22320 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
22330 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
22340 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
22350 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
22360 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
22370 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
22380 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
22390 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
223a0 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
223b0 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
223c0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
223d0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
223e0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
223f0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
22400 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
22410 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
22420 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
22430 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
22440 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
22450 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
22460 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
22470 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
22480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22490 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
224a0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
224b0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
224c0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
224d0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
224e0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
224f0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
22500 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
22510 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
22520 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
22530 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  age*, int);..#if
22540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22550 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
22560 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
22570 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
22580 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
22590 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
225a0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
225b0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
225c0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
225d0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
225e0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
225f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
22600 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
22610 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
22620 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
22630 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
22640 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
22650 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
22660 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
22670 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
22680 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
22690 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
226a0 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
226b0 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
226c0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
226d0 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
226e0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
226f0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
22700 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
22710 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
22720 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
22730 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
22740 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
22750 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
22760 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
22770 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
22780 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
22790 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
227a0 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
227b0 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
227c0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
227d0 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
227e0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
227f0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
22800 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
22810 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
22820 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
22830 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
22840 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
22850 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
22860 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22870 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
22880 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d  emPage *pPage, M
22890 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29  emPage *pParent)
228a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
228b0 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50  mPage *pNew;.  P
228c0 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75  gno pgnoNew;.  u
228d0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  8 *pCell;.  int 
228e0 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e  szCell;.  CellIn
228f0 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61  fo info;.  BtSha
22900 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
22910 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72  ->pBt;.  int par
22920 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74  entIdx = pParent
22930 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50  ->nCell;   /* pP
22940 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65  arent new divide
22950 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  r cell index */.
22960 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65    int parentSize
22970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22980 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
22990 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
229a0 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65  */.  u8 parentCe
229b0 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20  ll[64];         
229c0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
229d0 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69  for the new divi
229e0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f  der cell */..  /
229f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
22a00 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68   page. Insert th
22a10 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
22a20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20  from pPage.  ** 
22a30 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  into it. Then re
22a40 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  move the overflo
22a50 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  w cell from pPag
22a60 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  e..  */.  rc = a
22a70 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  llocatePage(pBt,
22a80 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
22a90 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
22aa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22ab0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22ac0 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61   }.  pCell = pPa
22ad0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
22ae0 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63  ll;.  szCell = c
22af0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
22b00 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f  , pCell);.  zero
22b10 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65  Page(pNew, pPage
22b20 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61  ->aData[0]);.  a
22b30 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
22b40 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
22b50 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
22b60 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
22b70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72    /* Set the par
22b80 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79  ent of the newly
22b90 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
22ba0 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
22bb0 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d   pNew->pParent =
22bc0 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69   pParent;.  sqli
22bd0 74 65 33 70 61 67 65 72 5f 72 65 66 28 70 50 61  te3pager_ref(pPa
22be0 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  rent->aData);.. 
22bf0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72   /* pPage is cur
22c00 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74  rently the right
22c10 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e  -child of pParen
22c20 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20  t. Change this. 
22c30 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
22c40 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74  right-child is t
22c50 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f  he new page allo
22c60 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a  cated above and.
22c70 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68    ** pPage is th
22c80 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20  e next-to-right 
22c90 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61  child. .  */.  a
22ca0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
22cb0 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 61 72 73 65  ell>0 );.  parse
22cc0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66  CellPtr(pPage, f
22cd0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
22ce0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20  Page->nCell-1), 
22cf0 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66  &info);.  rc = f
22d00 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
22d10 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30  t, parentCell, 0
22d20 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
22d30 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b  0, &parentSize);
22d40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
22d60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
22d70 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c  ert( parentSize<
22d80 36 34 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73  64 );.  rc = ins
22d90 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
22da0 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65   parentIdx, pare
22db0 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69  ntCell, parentSi
22dc0 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28  ze, 0, 4);.  if(
22dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22de0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
22df0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
22e00 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
22e10 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
22e20 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
22e30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
22e40 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
22e50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
22e60 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a  +8], pgnoNew);..
22e70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22e80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
22e90 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
22ea0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
22eb0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
22ec0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
22ed0 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
22ee0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
22ef0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
22f00 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a  er from the .  *
22f10 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
22f20 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
22f30 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
22f40 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
22f50 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  um ){.    rc = p
22f60 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
22f70 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
22f80 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
22f90 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  no);.    if( rc!
22fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22fb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22fc0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 74     }.    rc = pt
22fd0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
22fe0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
22ff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23000 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23010 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23020 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
23030 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
23040 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64  the new page and
23050 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
23060 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69  ent page,.  ** i
23070 6e 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64  n case the divid
23080 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  er cell inserted
23090 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65   caused it to be
230a0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20  come overfull.. 
230b0 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67   */.  releasePag
230c0 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  e(pNew);.  retur
230d0 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e  n balance(pParen
230e0 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  t, 0);.}.#endif 
230f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
23100 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
23110 2f 2a 0a 2a 2a 20 54 68 65 20 49 53 41 55 54 4f  /*.** The ISAUTO
23120 56 41 43 55 55 4d 20 6d 61 63 72 6f 20 69 73 20  VACUUM macro is 
23130 75 73 65 64 20 77 69 74 68 69 6e 20 62 61 6c 61  used within bala
23140 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f  nce_nonroot() to
23150 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 69 66   determine.** if
23160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
23170 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
23180 75 6d 20 6f 72 20 6e 6f 74 2e 20 42 65 63 61 75  um or not. Becau
23190 73 65 20 69 74 20 69 73 20 75 73 65 64 0a 2a 2a  se it is used.**
231a0 20 77 69 74 68 69 6e 20 61 6e 20 65 78 70 72 65   within an expre
231b0 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6e  ssion that is an
231c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 6f   argument to ano
231d0 74 68 65 72 20 6d 61 63 72 6f 20 0a 2a 2a 20 28  ther macro .** (
231e0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 29  sqliteMallocRaw)
231f0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
23200 69 62 6c 65 20 74 6f 20 75 73 65 20 63 6f 6e 64  ible to use cond
23210 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74  itional compilat
23220 69 6f 6e 2e 0a 2a 2a 20 53 6f 2c 20 74 68 69 73  ion..** So, this
23230 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
23240 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 23 69  d instead..*/.#i
23250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23260 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 23 64 65  T_AUTOVACUUM.#de
23270 66 69 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55  fine ISAUTOVACUU
23280 4d 20 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  M (pBt->autoVacu
23290 75 6d 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  um).#else.#defin
232a0 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 30  e ISAUTOVACUUM 0
232b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
232c0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
232d0 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20  stributes Cells 
232e0 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  on pPage and up 
232f0 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73  to NN*2 siblings
23300 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20  .** of pPage so 
23310 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
23320 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61  ave about the sa
23330 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65  me amount of fre
23340 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61  e space..** Usua
23350 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  lly NN siblings 
23360 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
23370 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20  f pPage is used 
23380 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
23390 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65  ,.** though more
233a0 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20   siblings might 
233b0 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69  come from one si
233c0 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74  de if pPage is t
233d0 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c  he first.** or l
233e0 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
233f0 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61   parent.  If pPa
23400 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ge has fewer tha
23410 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a  n 2*NN siblings.
23420 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  ** (something wh
23430 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
23440 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20  pen if pPage is 
23450 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  the root page or
23460 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20   a .** child of 
23470 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61  root) then all a
23480 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67  vailable sibling
23490 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  s participate in
234a0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
234b0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
234c0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
234d0 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69  pPage might be i
234e0 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72  ncreased or decr
234f0 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a  eased by one or.
23500 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  ** two in an eff
23510 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
23520 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
23530 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
23540 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   The root page.*
23550 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64  * is special and
23560 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
23570 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
23580 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20  If pPage is .** 
23590 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  the root page, t
235a0 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66  hen the depth of
235b0 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20   the tree might 
235c0 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20  be increased.** 
235d0 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
235e0 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72  one, as necessar
235f0 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72  y, to keep the r
23600 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65  oot page from be
23610 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20  ing.** overfull 
23620 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  or completely em
23630 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  pty..**.** Note 
23640 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
23650 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
23660 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65  , some of the Ce
23670 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20  lls on pPage.** 
23680 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
23690 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
236a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20  pPage->aData[]. 
236b0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
236c0 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
236d0 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61  is overfull.  Pa
236e0 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66  rt of the job of
236f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23700 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65   to.** make sure
23710 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70   all Cells for p
23720 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20  Page once again 
23730 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  fit in pPage->aD
23740 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ata[]..**.** In 
23750 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
23760 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c  lancing the sibl
23770 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74  ings of pPage, t
23780 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
23790 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f  ge.** might beco
237a0 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
237b0 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68  nderfull.  If th
237c0 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e  at happens, then
237d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
237e0 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
237f0 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61  sively on the pa
23800 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rent..**.** If t
23810 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
23820 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
23830 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
23840 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
23850 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
23860 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68  state.  So if th
23870 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
23880 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
23890 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
238a0 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
238b0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
238c0 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a  onroot(MemPage *
238d0 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
238e0 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
238f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
23900 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f  rent of pPage */
23910 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23930 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
23940 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
23950 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  t nCell = 0;    
23960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23970 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
23980 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69   apCell[] */.  i
23990 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30  nt nMaxCells = 0
239a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
239b0 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
239c0 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c   apCell, szCell,
239d0 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74   aFrom. */.  int
239e0 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20   nOld;          
239f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23a00 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
23a10 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apOld[] */.  int
23a20 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
23a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23a40 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
23a50 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apNew[] */.  int
23a60 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20 20   nDiv;          
23a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23a80 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
23a90 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apDiv[] */.  int
23aa0 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20   i, j, k;       
23ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
23ac0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
23ad0 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23af0 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20 69  Index of pPage i
23b00 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
23b10 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  [] */.  int nxDi
23b20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
23b30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
23b40 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
23b50 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
23b60 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
23b90 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  de */.  int leaf
23ba0 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
23bb0 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
23bc0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
23bd0 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
23be0 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
23bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23c00 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
23c10 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
23c20 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
23c30 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
23c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
23c50 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
23c60 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
23c70 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
23c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c90 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
23ca0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
23cb0 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23cd0 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
23ce0 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
23cf0 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
23d00 20 69 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20   iSpace = 0;    
23d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23d20 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
23d30 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20  f aSpace[] */.  
23d40 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e  MemPage *apOld[N
23d50 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  B];          /* 
23d60 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
23d70 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  two siblings */.
23d80 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e    Pgno pgnoOld[N
23d90 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  B];            /
23da0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
23db0 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
23dc0 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  apOld[] */.  Mem
23dd0 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
23de0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
23df0 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
23e00 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
23e10 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
23e20 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
23e30 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
23e40 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
23e50 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
23e60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b  .  Pgno pgnoNew[
23e70 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
23e80 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
23e90 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
23ea0 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38   apNew[] */.  u8
23eb0 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20   *apDiv[NB];    
23ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
23ed0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
23ee0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
23ef0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
23f00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
23f10 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
23f20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
23f30 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
23f40 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
23f50 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
23f60 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
23f70 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
23f80 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
23f90 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
23fa0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
23fb0 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
23fc0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65  d */.  int *szCe
23fd0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
23fe0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
23ff0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
24000 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
24010 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20  u8 *aCopy[NB];  
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24030 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e  Space for holdin
24040 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79  g data of apCopy
24050 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
24060 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
24070 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
24080 20 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20   hold copies of 
24090 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
240a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
240b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
240c0 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30  .  u8 *aFrom = 0
240d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a  ;.#endif..  /* .
240e0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61    ** Find the pa
240f0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  rent page..  */.
24100 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24110 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
24120 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
24130 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70 50  r_iswriteable(pP
24140 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
24150 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
24160 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
24170 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
24180 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
24190 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
241a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
241b0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
241c0 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 29 20 29  arent->aData)) )
241d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
241e0 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
241f0 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
24200 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
24210 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
24220 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
24230 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
24240 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
24250 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  LANCE.  /*.  ** 
24260 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20  A special case: 
24270 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20   If a new entry 
24280 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e  has just been in
24290 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20  serted into a.  
242a0 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69  ** table (that i
242b0 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20  s, a btree with 
242c0 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64  integer keys and
242d0 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65   all data at the
242e0 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e   leaves).  ** an
242f0 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
24300 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
24310 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
24320 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a  ree (it has the.
24330 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
24340 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73  ) then use the s
24350 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71  pecial balance_q
24360 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  uick() routine f
24370 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  or.  ** balancin
24380 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  g.  balance_quic
24390 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74  k() is much fast
243a0 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69  er and results i
243b0 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a  n a tighter.  **
243c0 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61   packing of data
243d0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
243e0 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
243f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20  pPage->leaf &&. 
24400 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
24410 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ey &&.      pPag
24420 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20  e->leafData &&. 
24430 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
24440 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
24450 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
24460 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
24470 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
24480 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
24490 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65  o!=1 &&.      ge
244a0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
244b0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
244c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
244d0 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a  Page->pgno.  ){.
244e0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
244f0 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
24500 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
24510 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
24520 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
24530 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
24540 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
24550 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
24560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
24570 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
24580 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  k(pPage, pParent
24590 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
245a0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
245b0 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
245c0 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
245d0 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
245e0 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
245f0 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
24600 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
24610 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
24620 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
24630 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
24640 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
24650 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
24660 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
24670 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28  Cell .  */.  if(
24680 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
24690 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  ft ){.    Pgno p
246a0 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  gno;.    pgno = 
246b0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pPage->pgno;.   
246c0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73   assert( pgno==s
246d0 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
246e0 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44  number(pPage->aD
246f0 61 74 61 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  ata) );.    for(
24700 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72 65  idx=0; idx<pPare
24710 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b  nt->nCell; idx++
24720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65 74  ){.      if( get
24730 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
24740 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70  Parent, idx))==p
24750 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 62  gno ){.        b
24760 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
24770 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24780 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
24790 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ll.             
247a0 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  || get4byte(&pPa
247b0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
247c0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
247d0 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65  ])==pgno );.  }e
247e0 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20 70  lse{.    idx = p
247f0 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
24800 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
24810 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69 61  Initialize varia
24820 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74 20  bles so that it 
24830 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f 20  will be safe to 
24840 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63 74  jump.  ** direct
24850 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c  ly to balance_cl
24860 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d  eanup at any mom
24870 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64  ent..  */.  nOld
24880 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73   = nNew = 0;.  s
24890 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
248a0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b  pParent->aData);
248b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
248c0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
248d0 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65 20  o pPage and the 
248e0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
248f0 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a   that divide.  *
24900 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20  * the siblings. 
24910 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
24920 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
24930 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65  iblings on eithe
24940 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70  r.  ** side of p
24950 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c  Page.  More sibl
24960 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
24970 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
24980 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70  wever, if.  ** p
24990 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20 66  Page there are f
249a0 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
249b0 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
249c0 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50 61  er side.  If pPa
249d0 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
249e0 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
249f0 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
24a00 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
24a10 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a  are taken..  */.
24a20 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20    nxDiv = idx - 
24a30 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20  NN;.  if( nxDiv 
24a40 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e  + NB > pParent->
24a50 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44  nCell ){.    nxD
24a60 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  iv = pParent->nC
24a70 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20  ell - NB + 1;.  
24a80 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20  }.  if( nxDiv<0 
24a90 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
24aa0 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30  ;.  }.  nDiv = 0
24ab0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e  ;.  for(i=0, k=n
24ac0 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c  xDiv; i<NB; i++,
24ad0 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b   k++){.    if( k
24ae0 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  <pParent->nCell 
24af0 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
24b00 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
24b10 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20  rent, k);.      
24b20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73  nDiv++;.      as
24b30 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e  sert( !pParent->
24b40 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67  leaf );.      pg
24b50 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
24b60 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
24b70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d     }else if( k==
24b80 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
24b90 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  {.      pgnoOld[
24ba0 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  i] = get4byte(&p
24bb0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
24bc0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
24bd0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
24be0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
24bf0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
24c00 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
24c10 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70   pgnoOld[i], &ap
24c20 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29  Old[i], pParent)
24c30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
24c40 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
24c50 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  nup;.    apOld[i
24c60 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b  ]->idxParent = k
24c70 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20  ;.    apCopy[i] 
24c80 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
24c90 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20   i==nOld );.    
24ca0 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78  nOld++;.    nMax
24cb0 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
24cc0 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
24cd0 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
24ce0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
24cf0 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
24d00 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f 72 64 65  ple of 2 in orde
24d10 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
24d20 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
24d30 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
24d40 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
24d50 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20  + 1)&~1;..  /*. 
24d60 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
24d70 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
24d80 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
24d90 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d  apCell = sqliteM
24da0 61 6c 6c 6f 63 52 61 77 28 20 0a 20 20 20 20 20  allocRaw( .     
24db0 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
24dc0 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
24df0 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
24e00 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20  sizeof(int)     
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
24e30 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55 4e 44 38  */.     + ROUND8
24e40 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
24e50 29 2a 4e 42 20 20 20 20 20 20 20 20 20 20 20 20  )*NB            
24e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 43 6f            /* aCo
24e70 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  py */.     + pBt
24e80 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35 2b 4e 42  ->pageSize*(5+NB
24e90 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24eb0 61 53 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b  aSpace */.     +
24ec0 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f   (ISAUTOVACUUM ?
24ed0 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 20   nMaxCells : 0) 
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29   /* aFrom */.  )
24f00 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d  ;.  if( apCell==
24f10 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
24f20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24f30 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
24f40 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
24f50 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65  ll = (int*)&apCe
24f60 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
24f70 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a   aCopy[0] = (u8*
24f80 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
24f90 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ls];.  assert( (
24fa0 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a  (aCopy[0] - (u8*
24fb0 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30  )apCell) & 7)==0
24fc0 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c   ); /* 8-byte al
24fd0 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64  ignment required
24fe0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
24ff0 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  <NB; i++){.    a
25000 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79  Copy[i] = &aCopy
25010 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  [i-1][pBt->pageS
25020 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
25030 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
25040 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
25050 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[i] - (u8*)apCe
25060 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
25070 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
25080 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
25090 20 7d 0a 20 20 61 53 70 61 63 65 20 3d 20 26 61   }.  aSpace = &a
250a0 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e  Copy[NB-1][pBt->
250b0 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28  pageSize+ROUND8(
250c0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
250d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
250e0 53 70 61 63 65 20 2d 20 28 75 38 2a 29 61 70 43  Space - (u8*)apC
250f0 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
25100 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
25110 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
25120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25130 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25140 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25150 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f  cuum ){.    aFro
25160 6d 20 3d 20 26 61 53 70 61 63 65 5b 35 2a 70 42  m = &aSpace[5*pB
25170 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
25180 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  }.#endif.  .  /*
25190 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  .  ** Make copie
251a0 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  s of the content
251b0 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74   of pPage and it
251c0 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20  s siblings into 
251d0 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65  aOld[]..  ** The
251e0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
251f0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
25200 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
25210 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a  pies rather.  **
25220 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
25230 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
25240 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
25250 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
25260 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
25270 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
25280 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  en..  */.  for(i
25290 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
252a0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
252b0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
252c0 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f 70 79 5b  MemPage*)&aCopy[
252d0 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  i][pBt->pageSize
252e0 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  ];.    p->aData 
252f0 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70 42 74  = &((u8*)p)[-pBt
25300 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20  ->pageSize];.   
25310 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61   memcpy(p->aData
25320 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
25330 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
25340 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67   + sizeof(MemPag
25350 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e));.    /* The 
25360 6d 65 6d 63 70 79 28 29 20 61 62 6f 76 65 20 63  memcpy() above c
25370 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
25380 20 6f 66 20 70 2d 3e 61 44 61 74 61 20 73 6f 20   of p->aData so 
25390 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20 20 2a  we have to.    *
253a0 2a 20 73 65 74 20 69 74 20 61 67 61 69 6e 2e 20  * set it again. 
253b0 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  */.    p->aData 
253c0 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d 70 42 74  = &((u8*)p)[-pBt
253d0 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d  ->pageSize];.  }
253e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
253f0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
25400 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
25410 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
25420 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
25430 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
25440 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
25450 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
25460 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
25470 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
25480 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  ace obtained for
25490 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64 20 72  m aSpace[] and r
254a0 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
254b0 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
254c0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
254d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
254e0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
254f0 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
25500 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
25510 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
25520 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
25530 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
25540 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
25550 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
25560 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
25570 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  e[].  In this wa
25580 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
25590 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
255a0 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
255b0 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
255c0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
255d0 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
255e0 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
255f0 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
25600 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
25610 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
25620 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
25630 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
25640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
25650 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
25660 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
25670 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
25680 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
25690 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
256a0 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
256b0 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
256c0 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
256d0 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
256e0 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65   nCell = 0;.  le
256f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70  afCorrection = p
25700 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  Page->leaf*4;.  
25710 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65  leafData = pPage
25720 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 70 50  ->leafData && pP
25730 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72  age->leaf;.  for
25740 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
25750 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
25760 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
25770 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ];.    int limit
25780 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
25790 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
257a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
257b0 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
257c0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
257d0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
257e0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
257f0 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
25800 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
25810 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
25820 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
25830 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65  pOld, apCell[nCe
25840 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ll]);.#ifndef SQ
25850 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
25860 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
25870 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
25880 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b  {.        int a;
25890 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e  .        aFrom[n
258a0 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20  Cell] = i;.     
258b0 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f     for(a=0; a<pO
258c0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61  ld->nOverflow; a
258d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
258e0 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61  f( pOld->aOvfl[a
258f0 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b  ].pCell==apCell[
25900 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20  nCell] ){.      
25910 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
25920 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
25930 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
25940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25950 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
25960 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  if.      nCell++
25970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25980 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20  i<nOld-1 ){.    
25990 20 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c 6c 53    int sz = cellS
259a0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
259b0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
259c0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
259d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68  .        /* With
259e0 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c   the LEAFDATA fl
259f0 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c  ag, pParent cell
25a00 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b  s hold only INTK
25a10 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  EYs that.       
25a20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74   ** are duplicat
25a30 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68  es of keys on th
25a40 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20  e child pages.  
25a50 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76  We need to remov
25a60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
25a70 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
25a80 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74  rom pParent, but
25a90 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65   the dividers ce
25aa0 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  lls are not.    
25ab0 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
25ac0 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65  apCell[] because
25ad0 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63   they are duplic
25ae0 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65  ates of child ce
25af0 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lls..        */.
25b00 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
25b10 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
25b20 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   sz);.      }els
25b30 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  e{.        u8 *p
25b40 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  Temp;.        as
25b50 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
25b60 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
25b70 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
25b80 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65   sz;.        pTe
25b90 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  mp = &aSpace[iSp
25ba0 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  ace];.        iS
25bb0 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
25bc0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
25bd0 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
25be0 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  e*5 );.        m
25bf0 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
25c00 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
25c10 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
25c20 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f  ] = pTemp+leafCo
25c30 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65  rrection;.#ifnde
25c40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25c50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
25c60 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25c70 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
25c80 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
25c90 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d   0xFF;.        }
25ca0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
25cb0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
25cc0 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
25cd0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
25ce0 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65  ll] -= leafCorre
25cf0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61  ction;.        a
25d00 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
25d10 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b  pTemp)==pgnoOld[
25d20 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  i] );.        if
25d30 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b  ( !pOld->leaf ){
25d40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
25d50 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
25d60 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
25d70 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
25d80 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
25d90 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
25da0 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
25db0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
25dc0 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64  ter of the divid
25dd0 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20  er cell */.     
25de0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
25df0 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
25e00 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64  ->aData[pOld->hd
25e10 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a  rOffset+8], 4);.
25e20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25e30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25e40 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
25e50 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  =4 );.        }.
25e60 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
25e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25e80 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
25e90 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
25ea0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
25eb0 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
25ec0 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
25ed0 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
25ee0 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
25ef0 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
25f00 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
25f10 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
25f20 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
25f30 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
25f40 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
25f50 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
25f60 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
25f70 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
25f80 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
25f90 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
25fa0 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
25fb0 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
25fc0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
25fd0 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
25fe0 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
25ff0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
26000 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
26010 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
26020 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
26030 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
26040 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
26050 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
26060 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
26070 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
26080 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
26090 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
260a0 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
260b0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
260c0 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
260d0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
260e0 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
260f0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
26100 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
26110 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
26120 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
26130 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
26140 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
26150 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
26160 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
26170 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
26180 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
26190 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
261a0 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
261b0 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
261c0 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
261d0 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
261e0 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
261f0 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
26200 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
26210 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
26220 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
26230 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
26240 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
26250 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
26260 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
26270 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
26280 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
26290 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
262a0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
262b0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
262c0 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
262d0 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
262e0 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
262f0 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
26300 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
26310 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
26320 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
26330 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
26340 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
26350 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
26360 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
26370 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
26380 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
26390 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
263a0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
263b0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
263c0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
263d0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
263e0 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
263f0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
26400 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
26410 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
26420 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
26430 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
26440 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
26450 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
26460 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
26470 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
26480 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
26490 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
264a0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
264b0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
264c0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
264d0 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
264e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
264f0 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
26500 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
26510 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
26520 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
26530 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
26540 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
26550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26560 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
26570 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
26580 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
26590 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
265a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
265b0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
265c0 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
265d0 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
265e0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
265f0 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
26600 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
26610 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
26620 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
26630 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
26640 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
26650 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
26660 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
26670 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
26680 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
26690 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
266a0 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
266b0 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
266c0 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
266d0 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
266e0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
266f0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
26700 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
26710 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
26720 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
26730 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
26740 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
26750 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
26760 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
26770 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
26780 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
26790 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
267a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
267b0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
267c0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
267d0 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
267e0 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
267f0 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
26800 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
26810 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
26820 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
26830 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
26840 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
26850 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
26860 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
26870 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
26880 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
26890 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
268a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
268b0 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
268c0 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
268d0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
268e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
268f0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
26900 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
26910 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
26920 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
26930 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
26940 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
26950 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
26960 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
26970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26980 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 4e 65  3pager_write(pNe
26990 77 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  w->aData);.     
269a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
269b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
269c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
269d0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
269e0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
269f0 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  atePage(pBt, &pN
26a00 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
26a10 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
26a20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
26a30 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26a40 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
26a50 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
26a60 20 20 20 7d 0a 20 20 20 20 6e 4e 65 77 2b 2b 3b     }.    nNew++;
26a70 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
26a80 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
26a90 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
26aa0 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
26ab0 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
26ac0 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
26ad0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
26ae0 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  nOld ){.    rc =
26af0 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
26b00 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
26b10 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26b20 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
26b30 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
26b40 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
26b50 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
26b60 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
26b70 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
26b80 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
26b90 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
26ba0 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
26bb0 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
26bc0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
26bd0 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
26be0 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
26bf0 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
26c00 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
26c10 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
26c20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
26c30 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
26c40 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
26c50 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
26c60 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
26c70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
26c80 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
26c90 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
26ca0 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
26cb0 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
26cc0 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
26cd0 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
26ce0 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
26cf0 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
26d00 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
26d10 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
26d20 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
26d30 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
26d40 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
26d50 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
26d60 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
26d70 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
26d80 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
26d90 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
26da0 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e  int minV = pgnoN
26db0 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d  ew[i];.    int m
26dc0 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
26dd0 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
26de0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
26df0 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65  oNew[j]<(unsigne
26e00 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
26e10 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
26e20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e      minV = pgnoN
26e30 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  ew[j];.      }. 
26e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
26e50 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  I>i ){.      int
26e60 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   t;.      MemPag
26e70 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d  e *pT;.      t =
26e80 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
26e90 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
26ea0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
26eb0 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e  i] = pgnoNew[min
26ec0 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
26ed0 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
26ee0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
26ef0 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20  minI] = t;.     
26f00 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
26f10 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
26f20 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
26f30 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e  old: %d %d %d  n
26f40 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
26f50 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
26f60 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70  %d(%d)\n",.    p
26f70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20  gnoOld[0], .    
26f80 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c  nOld>=2 ? pgnoOl
26f90 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  d[1] : 0,.    nO
26fa0 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=3 ? pgnoOld[
26fb0 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f  2] : 0,.    pgno
26fc0 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d  New[0], szNew[0]
26fd0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
26fe0 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20  pgnoNew[1] : 0, 
26ff0 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
27000 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
27010 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d  >=3 ? pgnoNew[2]
27020 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
27030 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
27040 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f    nNew>=4 ? pgno
27050 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[3] : 0, nNew
27060 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
27070 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
27080 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30  ? pgnoNew[4] : 0
27090 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
270a0 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f  w[4] : 0));..  /
270b0 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
270c0 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
270d0 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
270e0 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
270f0 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
27100 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
27110 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
27120 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
27130 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
27140 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
27150 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
27160 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
27170 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
27180 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
27190 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
271a0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
271b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
271c0 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65  ew->pgno==pgnoNe
271d0 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  w[i] );.    asse
271e0 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
271f0 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
27200 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
27210 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
27220 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
27230 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
27240 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
27250 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
27260 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
27270 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27280 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
27290 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
272a0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
272b0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
272c0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
272d0 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
272e0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
272f0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61  the siblings tha
27300 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65  t were rearrange
27310 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a  d. These can be:
27320 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69   left.    ** chi
27330 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20  ldren of cells, 
27340 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
27350 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  of the page, or 
27360 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
27370 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f     ** pointed to
27380 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a   by cells..    *
27390 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  /.    if( pBt->a
273a0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
273b0 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
273c0 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
273d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
273e0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
273f0 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
27400 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
27410 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
27420 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
27430 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
27440 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
27450 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
27460 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27480 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
27490 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
274a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
274b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
274c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20  #endif..    j = 
274d0 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
274e0 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
274f0 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
27500 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
27510 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
27520 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
27530 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
27540 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
27550 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
27560 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
27570 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
27580 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
27590 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
275a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
275b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
275c0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
275d0 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
275e0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
275f0 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
27600 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
27610 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
27620 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
27630 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
27640 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
27650 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
27660 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
27670 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
27680 0a 09 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65  ../* If the tree
27690 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
276a0 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
276b0 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
276c0 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
276d0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
276e0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
276f0 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
27700 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
27710 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
27720 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
27730 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
27740 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
27750 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
27760 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
27770 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
27780 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
27790 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
277a0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
277b0 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
277c0 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e   parseCellPtr(pN
277d0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
277e0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
277f0 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69  Cell = &aSpace[i
27800 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
27810 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
27820 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e  nt, pCell, 0, in
27830 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26  fo.nKey, 0, 0, &
27840 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 53 70  sz);.        iSp
27850 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
27860 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
27870 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
27880 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  *5 );.        pT
27890 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
278a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
278b0 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
278c0 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
278d0 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  e[iSpace];.     
278e0 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b     iSpace += sz;
278f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27900 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61   iSpace<=pBt->pa
27910 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20  geSize*5 );.    
27920 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 69    }.      rc = i
27930 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
27940 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
27950 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a   sz, pTemp, 4);.
27960 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27970 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
27980 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27990 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
279a0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
279b0 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20  pParent,nxDiv), 
279c0 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  pNew->pgno);.#if
279d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
279e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
279f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
27a00 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
27a10 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74  atabase, and not
27a20 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
27a30 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
27a40 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
27a50 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20  ter map with an 
27a60 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
27a70 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
27a80 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65    ** that the ce
27a90 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ll just inserted
27aa0 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61   points to (if a
27ab0 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
27ac0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
27ad0 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66  oVacuum && !leaf
27ae0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
27af0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
27b00 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  fl(pParent, nxDi
27b10 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  v);.        if( 
27b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27b30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
27b40 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27b60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
27b70 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
27b80 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
27b90 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
27ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
27bb0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
27bc0 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
27bd0 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
27be0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
27bf0 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
27c00 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
27c10 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  8], &apCopy[nOld
27c20 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34  -1]->aData[8], 4
27c30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44  );.  }.  if( nxD
27c40 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
27c50 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  ll+pParent->nOve
27c60 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20  rflow ){.    /* 
27c70 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
27c80 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ng is the right-
27c90 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
27ca0 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74  arent */.    put
27cb0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
27cc0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
27cd0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
27ce0 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
27cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
27d00 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
27d10 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68  g is the left ch
27d20 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ild of the first
27d30 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e   entry in pParen
27d40 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  t.    ** past th
27d50 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76  e right-most div
27d60 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ider entry */.  
27d70 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
27d80 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
27d90 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e  ent, nxDiv), pgn
27da0 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
27db0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65   }..  /*.  ** Re
27dc0 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20  parent children 
27dd0 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20  of all cells..  
27de0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
27df0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
27e00 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
27e10 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d  ldPages(apNew[i]
27e20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27e30 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27e40 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27e50 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61  .  }.  rc = repa
27e60 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
27e70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
27e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
27e90 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
27ea0 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nup;..  /*.  ** 
27eb0 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  Balance the pare
27ec0 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74  nt page.  Note t
27ed0 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
27ee0 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67  page (pPage) mig
27ef0 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ht.  ** have bee
27f00 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  n added to the f
27f10 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69  reelist so it mi
27f20 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  ght no longer be
27f30 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
27f40 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e  ** But the paren
27f50 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61  t page will alwa
27f60 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ys be initialize
27f70 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
27f80 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
27f90 74 20 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74  t );.  /* assert
27fa0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
27fb0 29 3b 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65 20  ); // No! pPage 
27fc0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
27fd0 61 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69 73  added to freelis
27fe0 74 20 2a 2f 0a 20 20 2f 2a 20 70 61 67 65 49 6e  t */.  /* pageIn
27ff0 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 20  tegrity(pPage); 
28000 20 20 20 2f 2f 20 4e 6f 21 20 70 50 61 67 65 20     // No! pPage 
28010 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
28020 61 64 64 65 64 20 74 6f 20 66 72 65 65 6c 69 73  added to freelis
28030 74 20 2a 2f 20 0a 20 20 72 63 20 3d 20 62 61 6c  t */ .  rc = bal
28040 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29  ance(pParent, 0)
28050 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ;.  .  /*.  ** C
28060 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
28070 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
28080 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
28090 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 43 65   sqliteFree(apCe
280a0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
280b0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
280c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
280d0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
280e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
280f0 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
28100 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
28110 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
28120 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54  ge(pParent);.  T
28130 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
28140 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64  finished with %d
28150 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
28160 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
28170 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67         pPage->pg
28180 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20  no, nOld, nNew, 
28190 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72  nCell));.  retur
281a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
281b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
281c0 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f  alled for the ro
281d0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72  ot page of a btr
281e0 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74  ee when the root
281f0 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
28200 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69  s no cells.  Thi
28210 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e  s is an opportun
28220 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ity to make the 
28230 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65  tree.** shallowe
28240 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a  r by one level..
28250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
28260 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
28270 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
28280 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
28290 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
282a0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c  /* The only chil
282b0 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20  d page of pPage 
282c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
282d0 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
282e0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
282f0 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20   for pChild */. 
28300 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28310 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
28320 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
28330 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
28340 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
28350 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
28360 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
28370 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65   BTree structure
28380 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c   */.  int mxCell
28390 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20 20  PerPage;        
283a0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
283b0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65  mber of cells pe
283c0 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  r page */.  u8 *
283d0 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *apCell;        
283e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
283f0 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73  cells from pages
28400 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
28410 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c  */.  int *szCell
28420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28430 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
28440 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
28450 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28460 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a  ->pParent==0 );.
28470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28480 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70  >nCell==0 );.  p
28490 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
284a0 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  .  mxCellPerPage
284b0 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b   = MX_CELL(pBt);
284c0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
284d0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6d 78 43  teMallocRaw( mxC
284e0 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
284f0 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 69  of(u8*)+sizeof(i
28500 6e 74 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  nt)) );.  if( ap
28510 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
28520 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
28530 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29   szCell = (int*)
28540 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
28550 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
28560 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28570 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
28580 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
28590 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
285a0 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
285b0 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
285c0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
285d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
285e0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
285f0 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
28600 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
28610 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
28620 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
28630 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
28640 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
28650 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
28660 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
28670 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
28680 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
28690 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
286a0 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
286b0 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
286c0 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
286d0 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
286e0 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
286f0 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
28700 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
28710 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
28720 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
28730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
28740 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
28750 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
28760 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
28770 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
28780 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
28790 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
287a0 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
287b0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
287c0 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
287d0 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
287e0 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
287f0 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
28800 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
28810 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
28820 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
28830 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
28840 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
28850 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
28860 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
28870 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
28880 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
28890 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
288a0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
288b0 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
288c0 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d>0 );.    asser
288d0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71  t( pgnoChild<=sq
288e0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
288f0 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d  ount(pPage->pBt-
28900 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  >pPager) );.    
28910 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 50 61  rc = getPage(pPa
28920 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69  ge->pBt, pgnoChi
28930 6c 64 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20 20  ld, &pChild);.  
28940 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28950 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
28960 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  nce;.    if( pPa
28970 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  ge->pgno==1 ){. 
28980 20 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61       rc = initPa
28990 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
289a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
289b0 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
289c0 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
289d0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
289e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
289f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69  ;.      if( pChi
28a00 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29  ld->nFree>=100 )
28a10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
28a20 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69   child informati
28a30 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  on will fit on t
28a40 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f  he root page, so
28a50 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   do the.        
28a60 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  ** copy */.     
28a70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
28a80 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
28a90 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
28aa0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
28ab0 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
28ac0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
28ad0 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d         apCell[i]
28ae0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69   = findCell(pChi
28af0 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ld,i);.         
28b00 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c   szCell[i] = cel
28b10 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c  lSizePtr(pChild,
28b20 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   apCell[i]);.   
28b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
28b40 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67  ssemblePage(pPag
28b50 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  e, pChild->nCell
28b60 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  , apCell, szCell
28b70 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  );.        /* Co
28b80 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  py the right-poi
28b90 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
28ba0 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  d to the parent.
28bb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34   */.        put4
28bc0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
28bd0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
28be0 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20  set+8], .       
28bf0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
28c00 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68  Child->aData[pCh
28c10 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ild->hdrOffset+8
28c20 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ]));.        fre
28c30 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
28c40 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
28c50 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
28c60 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67   transfer to pag
28c70 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
28c80 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65  pgno));.      }e
28c90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28ca0 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f  The child has mo
28cb0 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
28cc0 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  hat will fit on 
28cd0 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20  the root..      
28ce0 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73    ** The tree is
28cf0 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65   already balance
28d00 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  d.  Do nothing. 
28d10 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  */.        TRACE
28d20 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
28d30 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  d %d will not fi
28d40 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20  t on page 1\n", 
28d50 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
28d60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28d70 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
28d80 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43  pPage->aData, pC
28d90 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61  hild->aData, pPa
28da0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
28db0 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
28dc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
28dd0 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72       pPage->pPar
28de0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ent = 0;.      r
28df0 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61  c = initPage(pPa
28e00 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  ge, 0);.      as
28e10 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
28e20 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65  _OK );.      fre
28e30 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
28e40 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
28e50 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63  ANCE: transfer c
28e60 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f  hild %d into roo
28e70 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t %d\n",.       
28e80 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70         pChild->p
28e90 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gno, pPage->pgno
28ea0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ));.    }.    rc
28eb0 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64   = reparentChild
28ec0 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20  Pages(pPage);.  
28ed0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28ee0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
28ef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28f00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
28f10 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
28f20 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
28f30 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
28f40 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
28f50 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20  nCell; i++){ .  
28f60 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28f70 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20  pPutOvfl(pPage, 
28f80 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
28f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28fa0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
28fb0 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
28fc0 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nce;.        }. 
28fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
28fe0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d  dif.    if( rc!=
28ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
29000 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
29010 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65 61 73  ance;.    releas
29020 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
29030 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62   }.end_shallow_b
29040 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65  alance:.  sqlite
29050 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
29060 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
29070 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61  *.** The root pa
29080 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a  ge is overfull.*
29090 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68  *.** When this h
290a0 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61  appens, Create a
290b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
290c0 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20  and copy the.** 
290d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
290e0 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68  root into the ch
290f0 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20  ild.  Then make 
29100 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
29110 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
29120 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70  ith rightChild p
29130 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e  ointing to the n
29140 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46  ew.** child.   F
29150 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c  inally, call bal
29160 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20  ance_internal() 
29170 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  on the new child
29180 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20  .** to cause it 
29190 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61  to split..*/.sta
291a0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
291b0 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
291c0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  pPage){.  int rc
291d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
291e0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
291f0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
29200 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
29210 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69  Child;    /* Poi
29220 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68  nter to a new ch
29230 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  ild page */.  Pg
29240 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
29250 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
29260 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
29270 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
29280 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
29290 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
292a0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
292b0 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  ize;     /* Tota
292c0 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  l usable size of
292d0 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20   a page */.  u8 
292e0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
292f0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
29300 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a  he parent page *
29310 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20  /.  u8 *cdata;  
29320 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
29330 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  nt of the child 
29340 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  page */.  int hd
29350 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
29360 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20   Offset to page 
29370 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74  header in parent
29380 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20   */.  int brk;  
29390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
293a0 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f  set to content o
293b0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20  f first cell in 
293c0 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  parent */..  ass
293d0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72  ert( pPage->pPar
293e0 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent==0 );.  asse
293f0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
29400 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20  flow>0 );.  pBt 
29410 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
29420 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67  rc = allocatePag
29430 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20  e(pBt, &pChild, 
29440 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67  &pgnoChild, pPag
29450 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69  e->pgno, 0);.  i
29460 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29470 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
29480 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
29490 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 61 44  eable(pChild->aD
294a0 61 74 61 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  ata) );.  usable
294b0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
294c0 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d  leSize;.  data =
294d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
294e0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
294f0 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d  rOffset;.  brk =
29500 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
29510 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61  hdr+5]);.  cdata
29520 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61   = pChild->aData
29530 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61  ;.  memcpy(cdata
29540 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50  , &data[hdr], pP
29550 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
29560 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68  2*pPage->nCell-h
29570 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63  dr);.  memcpy(&c
29580 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61  data[brk], &data
29590 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  [brk], usableSiz
295a0 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74  e-brk);.  assert
295b0 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74  ( pChild->isInit
295c0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e  ==0 );.  rc = in
295d0 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70  itPage(pChild, p
295e0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
295f0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
29600 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  eper_out;.  memc
29610 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
29620 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20  , pPage->aOvfl, 
29630 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29640 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  *sizeof(pPage->a
29650 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
29660 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
29670 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29680 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d  w;.  if( pChild-
29690 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
296a0 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
296b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
296c0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
296d0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
296e0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61  ;.  zeroPage(pPa
296f0 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
29700 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
29710 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
29720 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
29730 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
29740 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54   pgnoChild);.  T
29750 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
29760 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
29770 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
29780 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
29790 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  no));.#ifndef SQ
297a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
297b0 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
297c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
297d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20    int i;.    rc 
297e0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
297f0 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50   pChild->pgno, P
29800 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
29810 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ge->pgno);.    i
29820 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
29830 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
29840 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
29850 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
29860 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
29870 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68  trmapPutOvfl(pCh
29880 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  ild, i);.      i
29890 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
298a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
298b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
298c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
298d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
298e0 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a  onroot(pChild);.
298f0 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f  .balancedeeper_o
29900 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
29910 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74  e(pChild);.  ret
29920 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29930 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70   Decide if the p
29940 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20  age pPage needs 
29950 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20  to be balanced. 
29960 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73   If balancing is
29970 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61  .** required, ca
29980 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ll the appropria
29990 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  te balancing rou
299a0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
299b0 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
299c0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
299d0 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72  insert){.  int r
299e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
299f0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
29a00 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ent==0 ){.    if
29a10 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
29a20 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ow>0 ){.      rc
29a30 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
29a40 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
29a50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29a60 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
29a70 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
29a80 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73    rc = balance_s
29a90 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b  hallower(pPage);
29aa0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29ab0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
29ac0 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20  Overflow>0 || . 
29ad0 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20         (!insert 
29ae0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
29af0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
29b00 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
29b10 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
29b20 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29  e_nonroot(pPage)
29b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29b50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
29b60 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72  hecks all cursor
29b70 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
29b80 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  table pgnoRoot..
29b90 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f  ** If any of tho
29ba0 73 65 20 63 75 72 73 6f 72 73 20 6f 74 68 65 72  se cursors other
29bb0 20 74 68 61 6e 20 70 45 78 63 6c 75 64 65 20 77   than pExclude w
29bc0 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
29bd0 0a 2a 2a 20 77 72 46 6c 61 67 3d 3d 30 20 74 68  .** wrFlag==0 th
29be0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
29bf0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
29c00 4f 43 4b 45 44 2e 20 20 49 66 20 61 6c 6c 0a 2a  OCKED.  If all.*
29c10 2a 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  * cursors that p
29c20 6f 69 6e 74 20 74 6f 20 70 67 6e 6f 52 6f 6f 74  oint to pgnoRoot
29c30 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74   were opened wit
29c40 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 20 74  h wrFlag==1.** t
29c50 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
29c60 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29c70 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64  OK..**.** In add
29c80 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e  ition to checkin
29c90 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73  g for read-locks
29ca0 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c   (where a read-l
29cb0 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20  ock .** means a 
29cc0 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69  cursor opened wi
29cd0 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68  th wrFlag==0) th
29ce0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
29cf0 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63 75 72  moves.** all cur
29d00 73 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  sors other than 
29d10 70 45 78 63 6c 75 64 65 20 73 6f 20 74 68 61 74  pExclude so that
29d20 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
29d30 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69  ng to the .** fi
29d40 72 73 74 20 43 65 6c 6c 20 6f 6e 20 72 6f 6f 74  rst Cell on root
29d50 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
29d60 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
29d70 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20  e an insert .** 
29d80 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20  or delete might 
29d90 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
29da0 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20  r of cells on a 
29db0 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a  page or delete.*
29dc0 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c  * a page entirel
29dd0 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  y and we do not 
29de0 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e  want to leave an
29df0 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f  y cursors .** po
29e00 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78  inting to non-ex
29e10 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20  istant pages or 
29e20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
29e30 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
29e40 63 6b 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  cks(BtShared *pB
29e50 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  t, Pgno pgnoRoot
29e60 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
29e70 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  lude){.  BtCurso
29e80 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42  r *p;.  for(p=pB
29e90 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
29ea0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
29eb0 75 33 32 20 66 6c 61 67 73 20 3d 20 28 70 2d 3e  u32 flags = (p->
29ec0 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 20  pBtree->pSqlite 
29ed0 3f 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71  ? p->pBtree->pSq
29ee0 6c 69 74 65 2d 3e 66 6c 61 67 73 20 3a 20 30 29  lite->flags : 0)
29ef0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  ;.    if( p->pgn
29f00 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20  oRoot!=pgnoRoot 
29f10 7c 7c 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29  || p==pExclude )
29f20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
29f30 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
29f40 26 26 20 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  && flags&SQLITE_
29f50 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
29f60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29f70 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
29f80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29f90 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 69 66 28  _LOCKED;.    if(
29fa0 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21   p->pPage->pgno!
29fb0 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  =p->pgnoRoot ){.
29fc0 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74        moveToRoot
29fd0 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (p);.    }.  }. 
29fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29ff0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
2a000 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
2a010 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
2a020 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
2a030 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
2a040 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
2a050 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
2a060 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
2a070 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
2a080 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
2a090 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
2a0a0 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
2a0b0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
2a0c0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2a0d0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a0e0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2a0f0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
2a100 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
2a110 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
2a120 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
2a130 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
2a140 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
2a150 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
2a160 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
2a170 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
2a180 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
2a190 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
2a1a0 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
2a1b0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2a1c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
2a1d0 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
2a1e0 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
2a1f0 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
2a200 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2a210 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2a220 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
2a230 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
2a240 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
2a250 74 20 6e 44 61 74 61 20 20 20 2f 2a 20 54 68 65  t nData   /* The
2a260 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
2a270 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
2a280 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f  int rc;.  int lo
2a290 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a  c;.  int szNew;.
2a2a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2a2b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2a2c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
2a2d0 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
2a2e0 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
2a2f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2a300 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
2a310 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2a320 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2a330 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2a340 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2a350 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2a360 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20  doing an insert 
2a370 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
2a380 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2a390 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2a3a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2a3b0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2a3c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2a3d0 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2a3e0 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2a3f0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2a400 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65  * Cursor not ope
2a410 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  n for writing */
2a420 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2a430 52 65 61 64 4c 6f 63 6b 73 28 70 42 74 2c 20 70  ReadLocks(pBt, p
2a440 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2a450 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
2a460 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2a470 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2a480 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2a490 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2a4a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
2a4b0 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
2a4c0 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
2a4d0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
2a4e0 74 61 62 6c 65 20 2a 2f 0a 20 20 72 65 73 74 6f  table */.  resto
2a4f0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2a500 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29  osition(pCur, 0)
2a510 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
2a520 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2a530 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2a540 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2a550 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
2a560 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2a570 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2a580 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
2a590 6e 4b 65 79 2c 20 26 6c 6f 63 29 29 0a 20 20 29  nKey, &loc)).  )
2a5a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2a5b0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2a5c0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
2a5d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
2a5e0 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
2a5f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a600 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
2a610 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a  ge->leafData );.
2a620 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54    TRACE(("INSERT
2a630 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d  : table=%d nkey=
2a640 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61  %lld ndata=%d pa
2a650 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ge=%d %s\n",.   
2a660 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
2a670 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61  oRoot, nKey, nDa
2a680 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ta, pPage->pgno,
2a690 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d  .          loc==
2a6a0 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20  0 ? "overwrite" 
2a6b0 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b  : "new entry"));
2a6c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a6d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63  ->isInit );.  rc
2a6e0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
2a6f0 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61  write(pPage->aDa
2a700 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ta);.  if( rc ) 
2a710 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77  return rc;.  new
2a720 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
2a730 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f  locRaw( MX_CELL_
2a740 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
2a750 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20  f( newCell==0 ) 
2a760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a770 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  MEM;.  rc = fill
2a780 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65  InCell(pPage, ne
2a790 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
2a7a0 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  y, pData, nData,
2a7b0 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
2a7c0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
2a7d0 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
2a7e0 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
2a7f0 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
2a800 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
2a810 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
2a820 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66  IZE(pBt) );.  if
2a830 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53  ( loc==0 && CURS
2a840 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2a850 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 69 6e  eState ){.    in
2a860 74 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73  t szOld;.    ass
2a870 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
2a880 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
2a890 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2a8a0 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
2a8b0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2a8c0 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28  r->idx);.    if(
2a8d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2a8e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
2a8f0 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
2a900 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
2a910 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
2a920 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
2a930 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2a940 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2a950 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2a960 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2a970 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
2a980 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2a990 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65  dx, szOld);.  }e
2a9a0 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
2a9b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2a9c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a9d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2a9e0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
2a9f0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2aa00 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
2aa10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2aa20 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
2aa30 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
2aa40 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2aa50 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a  idx, newCell, sz
2aa60 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
2aa70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2aa80 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2aa90 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  t;.  rc = balanc
2aaa0 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f  e(pPage, 1);.  /
2aab0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
2aac0 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42 74  geDump(pCur->pBt
2aad0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2aae0 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66  , 1); */.  /* ff
2aaf0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f  lush(stdout); */
2ab00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ab10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2ab20 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2ab30 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
2ab40 73 71 6c 69 74 65 46 72 65 65 28 6e 65 77 43 65  sqliteFree(newCe
2ab50 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
2ab60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2ab70 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
2ab80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
2ab90 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
2aba0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2abb0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2abc0 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2abd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2abe0 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
2abf0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2ac00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2ac10 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75  pCur->pPage;.  u
2ac20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2ac30 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ell;.  int rc;. 
2ac40 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20   Pgno pgnoChild 
2ac50 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
2ac60 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2ac70 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  ree->pBt;..  ass
2ac80 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2ac90 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  it );.  if( pBt-
2aca0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2acb0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2acc0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2acd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2ace0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65  efore doing a de
2acf0 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
2ad00 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2ad10 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2ad20 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2ad30 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2ad40 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2ad50 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
2ad60 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65  dx >= pPage->nCe
2ad70 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
2ad80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20   SQLITE_ERROR;  
2ad90 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  /* The cursor is
2ada0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
2adb0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
2adc0 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
2add0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
2ade0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
2adf0 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65    /* Did not ope
2ae00 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f  n this cursor fo
2ae10 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
2ae20 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
2ae30 4c 6f 63 6b 73 28 70 42 74 2c 20 70 43 75 72 2d  Locks(pBt, pCur-
2ae40 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2ae50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ae60 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2ae70 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2ae80 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2ae90 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2aea0 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
2aeb0 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
2aec0 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f  r position (a no
2aed0 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f  -op if the curso
2aee0 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a  r is not in .  *
2aef0 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
2af00 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20  SEEK state) and 
2af10 73 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  save the positio
2af20 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
2af30 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70  cursors .  ** op
2af40 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  en on the same t
2af50 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20  able. Then call 
2af60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
2af70 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65  te() on the page
2af80 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65  .  ** that the e
2af90 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c  ntry will be del
2afa0 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a  eted from..  */.
2afb0 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d    if( .    (rc =
2afc0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2afd0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2afe0 75 72 2c 20 31 29 29 21 3d 30 20 7c 7c 0a 20 20  ur, 1))!=0 ||.  
2aff0 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
2b000 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2b010 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2b020 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2b030 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
2b040 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61  write(pPage->aDa
2b050 74 61 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ta))!=0.  ){.   
2b060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2b070 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
2b080 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 27   cell within it'
2b090 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65  s page and leave
2b0a0 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   pCell pointing 
2b0b0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
2b0c0 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28  . The clearCell(
2b0d0 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79  ) call frees any
2b0e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2b0f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b100 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54  the.  ** cell. T
2b110 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69  he cell itself i
2b120 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a  s still intact..
2b130 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66    */.  pCell = f
2b140 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2b150 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28  Cur->idx);.  if(
2b160 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2b170 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d  .    pgnoChild =
2b180 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2b190 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65  ;.  }.  rc = cle
2b1a0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2b1b0 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ell);.  if( rc )
2b1c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
2b1d0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2b1e0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2b1f0 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
2b200 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
2b210 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
2b220 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
2b230 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
2b240 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
2b250 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
2b260 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
2b270 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
2b280 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
2b290 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
2b2a0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
2b2b0 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
2b2c0 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
2b2d0 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
2b2e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2b2f0 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
2b300 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
2b310 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
2b320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
2b330 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
2b340 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2b350 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
2b360 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65   szNext;  /* The
2b370 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
2b380 67 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65  g is wrong: szNe
2b390 78 74 20 69 73 20 61 6c 77 61 79 73 20 0a 20 20  xt is always .  
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b3b0 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65  * initialized be
2b3c0 66 6f 72 65 20 75 73 65 2e 20 20 41 64 64 69 6e  fore use.  Addin
2b3d0 67 20 61 6e 20 65 78 74 72 61 20 69 6e 69 74 69  g an extra initi
2b3e0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20  alization.      
2b3f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
2b400 20 73 69 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d   silence the com
2b410 70 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e  piler slows down
2b420 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20   the code. */.  
2b430 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
2b440 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2b450 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a   *tempCell = 0;.
2b460 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2b470 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a  ge->leafData );.
2b480 20 20 20 20 67 65 74 54 65 6d 70 43 75 72 73 6f      getTempCurso
2b490 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72  r(pCur, &leafCur
2b4a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2b4b0 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65  te3BtreeNext(&le
2b4c0 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  afCur, &notUsed)
2b4d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b4e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b4f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b500 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  NOMEM ){.       
2b510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2b520 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
2b530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2b540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b550 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2b560 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2b570 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e  (leafCur.pPage->
2b580 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
2b590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b5a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 52 41  _OK ){.      TRA
2b5b0 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
2b5c0 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74  le=%d delete int
2b5d0 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65  ernal from %d re
2b5e0 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20  place from leaf 
2b5f0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2b600 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2b610 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61  pPage->pgno, lea
2b620 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f  fCur.pPage->pgno
2b630 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65  ));.      dropCe
2b640 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2b650 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72  idx, cellSizePtr
2b660 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b  (pPage, pCell));
2b670 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66  .      pNext = f
2b680 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e  indCell(leafCur.
2b690 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69  pPage, leafCur.i
2b6a0 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78  dx);.      szNex
2b6b0 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  t = cellSizePtr(
2b6c0 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70  leafCur.pPage, p
2b6d0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Next);.      ass
2b6e0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  ert( MX_CELL_SIZ
2b6f0 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34  E(pBt)>=szNext+4
2b700 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65   );.      tempCe
2b710 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
2b720 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  cRaw( MX_CELL_SI
2b730 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  ZE(pBt) );.     
2b740 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30   if( tempCell==0
2b750 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b760 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b770 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b790 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2b7a0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2b7b0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e  e, pCur->idx, pN
2b7c0 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
2b7d0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
2b7e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2b7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b800 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2b810 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2b820 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c  age, pCur->idx),
2b830 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
2b840 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2b850 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pPage, 0);.    }
2b860 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b880 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72  dropCell(leafCur
2b890 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2b8a0 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  idx, szNext);.  
2b8b0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2b8c0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2b8d0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
2b8e0 6c 69 74 65 46 72 65 65 28 74 65 6d 70 43 65 6c  liteFree(tempCel
2b8f0 6c 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 54  l);.    releaseT
2b900 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43  empCursor(&leafC
2b910 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
2b920 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2b930 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2b940 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
2b950 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ",.       pCur->
2b960 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2b970 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f  >pgno));.    dro
2b980 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2b990 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  r->idx, cellSize
2b9a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2b9b0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c  ));.    rc = bal
2b9c0 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  ance(pPage, 0);.
2b9d0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2b9e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
2b9f0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2ba00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ba10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2ba20 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61  e a new BTree ta
2ba30 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ble.  Write into
2ba40 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61   *piTable the pa
2ba50 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
2ba60 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2ba70 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  f the new table.
2ba80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20  .**.** The type 
2ba90 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72  of type is deter
2baa0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61  mined by the fla
2bab0 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f  gs parameter.  O
2bac0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  nly the.** follo
2bad0 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66  wing values of f
2bae0 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74  lags are current
2baf0 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65  ly in use.  Othe
2bb00 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20  r values for.** 
2bb10 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20  flags might not 
2bb20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  work:.**.**     
2bb30 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52  BTREE_INTKEY|BTR
2bb40 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20  EE_LEAFDATA     
2bb50 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62  Used for SQL tab
2bb60 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b  les with rowid k
2bb70 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  eys.**     BTREE
2bb80 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20  _ZERODATA       
2bb90 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20             Used 
2bba0 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a  for SQL indices.
2bbb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2bbc0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
2bbd0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
2bbe0 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
2bbf0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2bc00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
2bc10 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
2bc20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a   Pgno pgnoRoot;.
2bc30 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
2bc40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2bc50 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2bc60 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2bc70 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2bc80 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20  on first */.    
2bc90 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
2bca0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2bcb0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2bcc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
2bcd0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
2bce0 6e 6c 79 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20  nly );..  /* It 
2bcf0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 72  is illegal to cr
2bd00 65 61 74 65 20 61 20 74 61 62 6c 65 20 69 66 20  eate a table if 
2bd10 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
2bd20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
2bd30 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
2bd40 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
2bd50 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
2bd60 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
2bd70 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
2bd80 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2bd90 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2bda0 72 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  r the new root-p
2bdb0 61 67 65 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20  age..  ** If an 
2bdc0 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20  open cursor was 
2bdd0 75 73 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  using the page a
2bde0 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 6f   problem would o
2bdf0 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ccur..  */.  if(
2be00 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
2be10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2be20 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
2be30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2be40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2be50 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67  rc = allocatePag
2be60 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2be70 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2be80 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2be90 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69  rn rc;.#else.  i
2bea0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2beb0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
2bec0 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
2bed0 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
2bee0 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
2bef0 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2bf00 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2bf10 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
2bf20 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
2bf30 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  to. */..    /* R
2bf40 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
2bf50 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68   meta[3] from th
2bf60 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65  e database to de
2bf70 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68  termine where th
2bf80 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
2bf90 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
2bfa0 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d  ble should go. m
2bfb0 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61  eta[3] is the la
2bfc0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2bfd0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73      ** created s
2bfe0 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65  o far, so the ne
2bff0 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28  w root-page is (
2c000 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20  meta[3]+1)..    
2c010 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2c020 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2c030 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29  p, 4, &pgnoRoot)
2c040 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2c050 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2c060 20 72 63 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f   rc;.    pgnoRoo
2c070 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  t++;..    /* The
2c080 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d   new root-page m
2c090 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ay not be alloca
2c0a0 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72  ted on a pointer
2c0b0 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68  -map page, or th
2c0c0 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47  e.    ** PENDING
2c0d0 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20  _BYTE page..    
2c0e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52  */.    if( pgnoR
2c0f0 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  oot==PTRMAP_PAGE
2c100 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  NO(pBt, pgnoRoot
2c110 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e  ) ||.        pgn
2c120 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  oRoot==PENDING_B
2c130 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2c140 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  .      pgnoRoot+
2c150 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
2c160 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33  ert( pgnoRoot>=3
2c170 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f   );..    /* Allo
2c180 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65  cate a page. The
2c190 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65   page that curre
2c1a0 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20  ntly resides at 
2c1b0 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20  pgnoRoot will.  
2c1c0 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f    ** be moved to
2c1d0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2c1e0 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20  age (unless the 
2c1f0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2c200 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f  appens.    ** to
2c210 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52   reside at pgnoR
2c220 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oot)..    */.   
2c230 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61   rc = allocatePa
2c240 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
2c250 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
2c260 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
2c270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2c290 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2c2a0 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
2c2b0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
2c2c0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
2c2d0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
2c2e0 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ..      releaseP
2c2f0 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a  age(pPageMove);.
2c300 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
2c310 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
2c320 2c 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  , &pRoot);.     
2c330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2c350 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2c360 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2c370 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
2c380 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
2c390 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
2c3a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c3b0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2c3c0 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
2c3d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2c3e0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2c3f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2c400 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2c410 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2c420 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2c430 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
2c440 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
2c450 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
2c460 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
2c470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c480 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 52 6f  3pager_write(pRo
2c490 6f 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ot->aData);.    
2c4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c4c0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c4d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2c4e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2c4f0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
2c500 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74  ePage(pBt, pRoot
2c510 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
2c520 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20  e, pgnoMove);.  
2c530 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c540 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66  pRoot);.      if
2c550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c560 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2c570 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2c580 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2c590 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2c5a0 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69  &pRoot);.      i
2c5b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2c5d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2c5e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c5f0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 52 6f  3pager_write(pRo
2c600 6f 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ot->aData);.    
2c610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c630 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c640 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2c650 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2c660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2c670 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
2c680 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
2c690 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
2c6a0 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
2c6b0 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
2c6c0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
2c6d0 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
2c6e0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2c6f0 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
2c700 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
2c710 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2c720 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c730 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2c740 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2c750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c760 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
2c770 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
2c780 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2c790 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c7a0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
2c7b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2c7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2c7d0 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
2c7e0 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2c7f0 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
2c800 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2c810 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2c820 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c830 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
2c840 6c 65 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29  le(pRoot->aData)
2c850 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
2c860 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54  Root, flags | PT
2c870 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74  F_LEAF);.  sqlit
2c880 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 52  e3pager_unref(pR
2c890 6f 6f 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 2a  oot->aData);.  *
2c8a0 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
2c8b0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
2c8c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c8d0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
2c8e0 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
2c8f0 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
2c900 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
2c910 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
2c920 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2c930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2c940 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
2c950 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2c960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c970 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
2c980 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
2c990 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
2c9a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2c9b0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
2c9c0 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ar */.  MemPage 
2c9d0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
2c9e0 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e   Parent page.  N
2c9f0 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ULL for the root
2ca00 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
2ca10 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44  geFlag      /* D
2ca20 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
2ca30 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d  f true */.){.  M
2ca40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2ca50 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
2ca60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2ca70 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
2ca80 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65   if( pgno>sqlite
2ca90 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
2caa0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
2cab0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cac0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2cad0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74  .  }..  rc = get
2cae0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2caf0 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70   pgno, &pPage, p
2cb00 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
2cb10 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2cb20 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2cb30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
2cb40 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 2d  ger_write(pPage-
2cb50 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  >aData);.  if( r
2cb60 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2cb70 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2cb80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2cb90 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
2cba0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2cbb0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
2cbc0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2cbd0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2cbe0 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2cbf0 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2cc00 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67  yte(pCell), pPag
2cc10 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2cc20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2cc30 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2cc40 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2cc50 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
2cc60 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2cc70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2cc80 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2cc90 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
2cca0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2ccb0 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  af ){.    rc = c
2ccc0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2ccd0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
2cce0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29  pPage->aData[8])
2ccf0 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
2cd00 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
2cd10 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2cd20 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2cd30 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67   }.  if( freePag
2cd40 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  eFlag ){.    rc 
2cd50 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2cd60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2cd70 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2cd80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
2cd90 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d  | PTF_LEAF);.  }
2cda0 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  ..cleardatabasep
2cdb0 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  age_out:.  relea
2cdc0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2cdd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2cde0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
2cdf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2ce00 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
2ce10 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2ce20 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74    iTable is.** t
2ce30 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2ce40 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  f the root of th
2ce50 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20  e table.  After 
2ce60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2ce70 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f  urns,.** the roo
2ce80 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c  t page is empty,
2ce90 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74   but still exist
2cea0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2ceb0 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
2cec0 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
2ced0 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
2cee0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64  any open.** read
2cef0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
2cf00 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69  table.  Open wri
2cf10 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d  te cursors are m
2cf20 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72  oved to the.** r
2cf30 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
2cf40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cf50 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
2cf60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
2cf70 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  able){.  int rc;
2cf80 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2cf90 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  r;.  BtShared *p
2cfa0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
2cfb0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
2cfc0 70 53 71 6c 69 74 65 3b 0a 20 20 69 66 28 20 70  pSqlite;.  if( p
2cfd0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2cfe0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2cff0 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2d000 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2d010 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2d020 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ROR;.  }..  /* I
2d030 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
2d040 6e 20 69 73 20 6e 6f 74 20 69 6e 20 72 65 61 64  n is not in read
2d050 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64  -uncommitted mod
2d060 65 20 61 6e 64 20 63 75 72 72 65 6e 74 6c 79 20  e and currently 
2d070 68 61 73 0a 20 20 2a 2a 20 61 20 72 65 61 64 2d  has.  ** a read-
2d080 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  cursor open on t
2d090 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
2d0a0 6c 65 61 72 65 64 2c 20 72 65 74 75 72 6e 20 53  leared, return S
2d0b0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
2d0c0 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 64 62 20 7c  */.  if( 0==db |
2d0d0 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26  | 0==(db->flags&
2d0e0 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2d0f0 6d 69 74 74 65 64 29 20 29 7b 0a 20 20 20 20 66  mitted) ){.    f
2d100 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
2d110 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
2d120 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
2d130 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70       if( pCur->p
2d140 42 74 72 65 65 3d 3d 70 20 26 26 20 70 43 75 72  Btree==p && pCur
2d150 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e  ->pgnoRoot==(Pgn
2d160 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  o)iTable ){.    
2d170 20 20 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d      if( 0==pCur-
2d180 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  >wrFlag ){.     
2d190 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d1a0 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
2d1b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 6f 76     }.        mov
2d1c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2d1d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d1e0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2d1f0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  position of all 
2d200 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2d210 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2d220 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
2d230 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2d240 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  ors(pBt, iTable,
2d250 20 30 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75   0)) ){.    retu
2d260 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65  rn rc;.  }..  re
2d270 74 75 72 6e 20 63 6c 65 61 72 44 61 74 61 62 61  turn clearDataba
2d280 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  sePage(pBt, (Pgn
2d290 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b  o)iTable, 0, 0);
2d2a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2d2b0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2d2c0 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61  in a table and a
2d2d0 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  dd the root of t
2d2e0 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74  he table to.** t
2d2f0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78  he freelist.  Ex
2d300 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f  cept, the root o
2d310 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20  f the principle 
2d320 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f  table (the one o
2d330 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20  n.** page 1) is 
2d340 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74  never added to t
2d350 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
2d360 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2d370 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
2d380 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
2d390 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
2d3a0 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e  en.** cursors on
2d3b0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2d3c0 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20  * If AUTOVACUUM 
2d3d0 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74  is enabled and t
2d3e0 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c  he page at iTabl
2d3f0 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  e is not the las
2d400 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69  t.** root page i
2d410 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2d420 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  ile, then the la
2d430 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a  st root page .**
2d440 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2d450 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69   file is moved i
2d460 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72  nto the slot for
2d470 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
2d480 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20  y.** iTable and 
2d490 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66  that last slot f
2d4a0 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
2d4b0 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   by the last roo
2d4c0 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64  t page.** is add
2d4d0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
2d4e0 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54  st instead of iT
2d4f0 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73  able.  In this s
2d500 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20  ay, all.** root 
2d510 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61  pages are kept a
2d520 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2d530 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d540 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69  file, which.** i
2d550 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
2d560 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f  AUTOVACUUM to wo
2d570 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f  rk right.  *piMo
2d580 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  ved is set to th
2d590 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  e .** page numbe
2d5a0 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62  r that used to b
2d5b0 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  e the last root 
2d5c0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
2d5d0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d   before.** the m
2d5e0 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65  ove.  If no page
2d5f0 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69   gets moved, *pi
2d600 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
2d610 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72  0..** The last r
2d620 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f  oot page is reco
2d630 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20  rded in meta[3] 
2d640 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
2d650 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75  .** meta[3] is u
2d660 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70  pdated by this p
2d670 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74  rocedure..*/.int
2d680 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
2d690 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  pTable(Btree *p,
2d6a0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
2d6b0 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
2d6c0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2d6d0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74  *pPage = 0;.  Bt
2d6e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2d6f0 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  >pBt;..  if( p->
2d700 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2d710 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2d720 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2d730 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2d740 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2d750 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20  R;.  }..  /* It 
2d760 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72  is illegal to dr
2d770 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e  op a table if an
2d780 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70  y cursors are op
2d790 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  en on the.  ** d
2d7a0 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
2d7b0 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f   because in auto
2d7c0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65  -vacuum mode the
2d7d0 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a   backend may.  *
2d7e0 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61  * need to move a
2d7f0 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65  nother root-page
2d800 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c   to fill a gap l
2d810 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
2d820 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  ed.  ** root pag
2d830 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75  e. If an open cu
2d840 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74  rsor was using t
2d850 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c  his page a probl
2d860 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f  em would .  ** o
2d870 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ccur..  */.  if(
2d880 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
2d890 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d8a0 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
2d8b0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2d8c0 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
2d8d0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
2d8e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d8f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2d900 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
2d910 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28  , iTable);.  if(
2d920 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61   rc ){.    relea
2d930 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2d940 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d950 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20  }..  *piMoved = 
2d960 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65  0;..  if( iTable
2d970 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  >1 ){.#ifdef SQL
2d980 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d990 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65  UUM.    rc = fre
2d9a0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2d9b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2d9c0 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  age);.#else.    
2d9d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2d9e0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  uum ){.      Pgn
2d9f0 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  o maxRootPgno;. 
2da00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2da10 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
2da20 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f   4, &maxRootPgno
2da30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2da40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2da50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2da60 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2da70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2da80 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2da90 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50  iTable==maxRootP
2daa0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  gno ){.        /
2dab0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62  * If the table b
2dac0 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20  eing dropped is 
2dad0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74  the table with t
2dae0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
2daf0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2db00 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
2db10 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20  tabase, put the 
2db20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65  root page on the
2db30 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20   free list. .   
2db40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2db50 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2db60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2db70 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2db80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2db90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2dba0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2dbb0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2dbc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dbd0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2dbe0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f  being dropped do
2dbf0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  es not have the 
2dc00 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2dc10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2dc20 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
2dc30 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65  ase. So move the
2dc40 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
2dc50 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  into the .      
2dc60 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79    ** gap left by
2dc70 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f   the deleted roo
2dc80 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  t-page..        
2dc90 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  */.        MemPa
2dca0 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20  ge *pMove;.     
2dcb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2dcc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2dcd0 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
2dce0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
2dcf0 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2dd00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2dd10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2dd20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2dd30 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2dd40 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2dd50 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f  , pMove, PTRMAP_
2dd60 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61  ROOTPAGE, 0, iTa
2dd70 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ble);.        re
2dd80 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
2dd90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2dda0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ddb0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2ddc0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2ddd0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
2dde0 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2ddf0 67 6e 6f 2c 20 26 70 4d 6f 76 65 29 3b 0a 20 20  gno, &pMove);.  
2de00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2de10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2de20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2de30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de40 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2de50 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2de60 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
2de70 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2de80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2de90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2dea0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2deb0 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64          *piMoved
2dec0 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a   = maxRootPgno;.
2ded0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2dee0 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d  * Set the new 'm
2def0 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61  ax-root-page' va
2df00 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  lue in the datab
2df10 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73  ase header. This
2df20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
2df30 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20   old value less 
2df40 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f  one, less one mo
2df50 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65  re if that happe
2df60 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  ns to.      ** b
2df70 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  e a root-page nu
2df80 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61  mber, less one a
2df90 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20  gain if that is 
2dfa0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e  the.      ** PEN
2dfb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a  DING_BYTE_PAGE..
2dfc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
2dfd0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2dfe0 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
2dff0 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
2e000 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2e010 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
2e020 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
2e030 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
2e040 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
2e050 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  NO(pBt, maxRootP
2e060 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gno) ){.        
2e070 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
2e080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2e090 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ert( maxRootPgno
2e0a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2e0b0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  AGE(pBt) );..   
2e0c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e0d0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
2e0e0 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  , 4, maxRootPgno
2e0f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e100 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2e110 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2e120 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2e130 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
2e140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2e150 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   If sqlite3Btree
2e160 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61  DropTable was ca
2e170 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20  lled on page 1. 
2e180 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  */.    zeroPage(
2e190 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45  pPage, PTF_INTKE
2e1a0 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20  Y|PTF_LEAF );.  
2e1b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2e1c0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
2e1d0 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a  rn rc;  .}.../*.
2e1e0 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61  ** Read the meta
2e1f0 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74  -information out
2e200 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66   of a database f
2e210 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ile.  Meta[0].**
2e220 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2e230 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72  f free pages cur
2e240 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61  rently in the da
2e250 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d  tabase.  Meta[1]
2e260 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61  .** through meta
2e270 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62  [15] are availab
2e280 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69  le for use by hi
2e290 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65  gher layers.  Me
2e2a0 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64  ta[0].** is read
2e2b0 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72  -only, the other
2e2c0 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
2e2d0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68  ..** .** The sch
2e2e0 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72  ema layer number
2e2f0 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69  s meta values di
2e300 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74  fferently.  At t
2e310 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79  he schema.** lay
2e320 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43  er (and the SetC
2e330 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f  ookie and ReadCo
2e340 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68  okie opcodes) th
2e350 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66  e number of.** f
2e360 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74  ree pages is not
2e370 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f   visible.  So Co
2e380 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73  okie[0] is the s
2e390 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a  ame as Meta[1]..
2e3a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2e3b0 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65  reeGetMeta(Btree
2e3c0 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
2e3d0 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 69 6e 74  2 *pMeta){.  int
2e3e0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
2e3f0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
2e400 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2e410 70 42 74 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69  pBt;..  /* Readi
2e420 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76  ng a meta-data v
2e430 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20  alue requires a 
2e440 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
2e450 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20  e 1 (and hence. 
2e460 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   ** the sqlite_m
2e470 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20  aster table. We 
2e480 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72  grab this lock r
2e490 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2e4a0 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74  ther or.  ** not
2e4b0 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64   the SQLITE_Read
2e4c0 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
2e4d0 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62   is set (the tab
2e4e0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
2e4f0 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61  e.  ** 1 is trea
2e500 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c  ted as a special
2e510 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54 61   case by queryTa
2e520 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f  bleLock() and lo
2e530 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f  ckTable())..  */
2e540 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62  .  rc = queryTab
2e550 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41  leLock(p, 1, REA
2e560 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  D_LOCK);.  if( r
2e570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e580 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e590 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
2e5a0 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
2e5b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2e5c0 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e  3pager_get(pBt->
2e5d0 70 50 61 67 65 72 2c 20 31 2c 20 28 76 6f 69 64  pPager, 1, (void
2e5e0 2a 2a 29 26 70 50 31 29 3b 0a 20 20 69 66 28 20  **)&pP1);.  if( 
2e5f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2e600 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62    *pMeta = get4b
2e610 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
2e620 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  x*4]);.  sqlite3
2e630 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 31 29  pager_unref(pP1)
2e640 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76  ;..  /* If autov
2e650 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62  acuumed is disab
2e660 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2e670 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79  d but we are try
2e680 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63  ing to .  ** acc
2e690 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75  ess an autovacuu
2e6a0 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  med database, th
2e6b0 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61  en make the data
2e6c0 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a  base readonly. .
2e6d0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2e6e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e6f0 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20  UM.  if( idx==4 
2e700 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42  && *pMeta>0 ) pB
2e710 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
2e720 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72  .#endif..  /* Gr
2e730 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  ab the read-lock
2e740 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2e750 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
2e760 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2e770 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e780 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65  ../*.** Write me
2e790 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62  ta-information b
2e7a0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
2e7b0 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20  abase.  Meta[0] 
2e7c0 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20  is.** read-only 
2e7d0 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77  and may not be w
2e7e0 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ritten..*/.int s
2e7f0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2e800 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  eMeta(Btree *p, 
2e810 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65  int idx, u32 iMe
2e820 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ta){.  BtShared 
2e830 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2e840 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2e850 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pP1;.  int rc;. 
2e860 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20   assert( idx>=1 
2e870 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2e880 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2e890 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2e8a0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2e8b0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2e8c0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2e8d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2e8e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
2e8f0 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20  ge1!=0 );.  pP1 
2e900 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  = pBt->pPage1->a
2e910 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
2e920 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
2e930 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pP1);.  if( rc )
2e940 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 75   return rc;.  pu
2e950 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
2e960 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
2e970 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e980 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
2e990 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79  turn the flag by
2e9a0 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  te at the beginn
2e9b0 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20  ing of the page 
2e9c0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
2e9d0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
2e9e0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
2e9f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2ea00 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
2ea10 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2ea20 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52  : What about CUR
2ea30 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2ea40 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20  state? Probably 
2ea50 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  need to call.  *
2ea60 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  * restoreOrClear
2ea70 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2ea80 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65   here..  */.  Me
2ea90 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2eaa0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72 65  Cur->pPage;.  re
2eab0 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61  turn pPage ? pPa
2eac0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2ead0 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b  >hdrOffset] : 0;
2eae0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2eaf0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
2eb00 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d 62 6c  int a disassembl
2eb10 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  y of the given p
2eb20 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72 64 20  age on standard 
2eb30 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  output.  This ro
2eb40 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75 73 65 64  utine.** is used
2eb50 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61   for debugging a
2eb60 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e  nd testing only.
2eb70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2eb80 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74 53  treePageDump(BtS
2eb90 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
2eba0 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72 73  pgno, int recurs
2ebb0 69 76 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ive, MemPage *pP
2ebc0 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  arent){.  int rc
2ebd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2ebe0 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  ge;.  int i, j, 
2ebf0 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a  c;.  int nFree;.
2ec00 20 20 75 31 36 20 69 64 78 3b 0a 20 20 69 6e 74    u16 idx;.  int
2ec10 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   hdr;.  int nCel
2ec20 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b  l;.  int isInit;
2ec30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2ec40 20 2a 64 61 74 61 3b 0a 20 20 63 68 61 72 20 72   *data;.  char r
2ec50 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75 6e 73 69  ange[20];.  unsi
2ec60 67 6e 65 64 20 63 68 61 72 20 70 61 79 6c 6f 61  gned char payloa
2ec70 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20 3d 20 67  d[20];..  rc = g
2ec80 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
2ec90 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b  o)pgno, &pPage);
2eca0 0a 20 20 69 73 49 6e 69 74 20 3d 20 70 50 61 67  .  isInit = pPag
2ecb0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66 28  e->isInit;.  if(
2ecc0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
2ecd0 30 20 29 7b 0a 20 20 20 20 69 6e 69 74 50 61 67  0 ){.    initPag
2ece0 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
2ecf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20  );.  }.  if( rc 
2ed00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2ed10 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50  ;.  }.  hdr = pP
2ed20 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2ed30 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2ed40 61 44 61 74 61 3b 0a 20 20 63 20 3d 20 64 61 74  aData;.  c = dat
2ed50 61 5b 68 64 72 5d 3b 0a 20 20 70 50 61 67 65 2d  a[hdr];.  pPage-
2ed60 3e 69 6e 74 4b 65 79 20 3d 20 28 63 20 26 20 28  >intKey = (c & (
2ed70 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2ed80 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20  EAFDATA))!=0;.  
2ed90 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
2eda0 3d 20 28 63 20 26 20 50 54 46 5f 5a 45 52 4f 44  = (c & PTF_ZEROD
2edb0 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  ATA)!=0;.  pPage
2edc0 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 28 63 20  ->leafData = (c 
2edd0 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41 29 21  & PTF_LEAFDATA)!
2ede0 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61  =0;.  pPage->lea
2edf0 66 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41  f = (c & PTF_LEA
2ee00 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  F)!=0;.  pPage->
2ee10 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67  hasData = !(pPag
2ee20 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28  e->zeroData || (
2ee30 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20  !pPage->leaf && 
2ee40 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29  pPage->leafData)
2ee50 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  );.  nCell = get
2ee60 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2ee70 33 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  3]);.  sqlite3De
2ee80 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
2ee90 25 64 3a 20 20 66 6c 61 67 73 3d 30 78 25 30 32  %d:  flags=0x%02
2eea0 78 20 20 66 72 61 67 3d 25 64 20 20 20 70 61 72  x  frag=%d   par
2eeb0 65 6e 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c  ent=%d\n", pgno,
2eec0 0a 20 20 20 20 64 61 74 61 5b 68 64 72 5d 2c 20  .    data[hdr], 
2eed0 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20 20  data[hdr+7], .  
2eee0 20 20 28 70 50 61 67 65 2d 3e 69 73 49 6e 69 74    (pPage->isInit
2eef0 20 26 26 20 70 50 61 67 65 2d 3e 70 50 61 72 65   && pPage->pPare
2ef00 6e 74 29 20 3f 20 70 50 61 67 65 2d 3e 70 50 61  nt) ? pPage->pPa
2ef10 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b  rent->pgno : 0);
2ef20 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 20 3d  .  assert( hdr =
2ef30 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  = (pgno==1 ? 100
2ef40 20 3a 20 30 29 20 29 3b 0a 20 20 69 64 78 20 3d   : 0) );.  idx =
2ef50 20 68 64 72 20 2b 20 31 32 20 2d 20 70 50 61 67   hdr + 12 - pPag
2ef60 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f 72  e->leaf*4;.  for
2ef70 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
2ef80 2b 2b 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ++){.    CellInf
2ef90 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e 6f  o info;.    Pgno
2efa0 20 63 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73 69   child;.    unsi
2efb0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2efc0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20  ;.    int sz;.  
2efd0 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
2efe0 20 61 64 64 72 20 3d 20 67 65 74 32 62 79 74 65   addr = get2byte
2eff0 28 26 64 61 74 61 5b 69 64 78 20 2b 20 32 2a 69  (&data[idx + 2*i
2f000 5d 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  ]);.    pCell = 
2f010 26 64 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20 20  &data[addr];.   
2f020 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
2f030 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2f040 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66  o);.    sz = inf
2f050 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70 72  o.nSize;.    spr
2f060 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e  intf(range,"%d..
2f070 25 64 22 2c 20 61 64 64 72 2c 20 61 64 64 72 2b  %d", addr, addr+
2f080 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70  sz-1);.    if( p
2f090 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f0a0 20 20 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a 20      child = 0;. 
2f0b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f0c0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2f0d0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  (pCell);.    }. 
2f0e0 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61     sz = info.nDa
2f0f0 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  ta;.    if( !pPa
2f100 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20  ge->intKey ) sz 
2f110 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  += info.nKey;.  
2f120 20 20 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66 28    if( sz>sizeof(
2f130 70 61 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a 20  payload)-1 ) sz 
2f140 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64  = sizeof(payload
2f150 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  )-1;.    memcpy(
2f160 70 61 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c 5b  payload, &pCell[
2f170 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20 73  info.nHeader], s
2f180 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  z);.    for(j=0;
2f190 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<sz; j++){.   
2f1a0 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 5b 6a     if( payload[j
2f1b0 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f 61  ]<0x20 || payloa
2f1c0 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70 61 79 6c  d[j]>0x7f ) payl
2f1d0 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20  oad[j] = '.';.  
2f1e0 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64 5b    }.    payload[
2f1f0 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  sz] = 0;.    sql
2f200 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f210 0a 20 20 20 20 20 20 22 63 65 6c 6c 20 25 32 64  .      "cell %2d
2f220 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d 25  : i=%-10s chld=%
2f230 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64  -4d nk=%-4lld nd
2f240 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25 73  =%-4d payload=%s
2f250 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c 20 72 61  \n",.      i, ra
2f260 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66 6f  nge, child, info
2f270 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61 74  .nKey, info.nDat
2f280 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 29  a, payload.    )
2f290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
2f2a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2f2b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2f2c0 74 66 28 22 72 69 67 68 74 5f 63 68 69 6c 64 3a  tf("right_child:
2f2d0 20 25 64 5c 6e 22 2c 20 67 65 74 34 62 79 74 65   %d\n", get4byte
2f2e0 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 29 3b  (&data[hdr+8]));
2f2f0 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20 30  .  }.  nFree = 0
2f300 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  i = 0;.  idx
2f310 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2f320 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69  a[hdr+1]);.  whi
2f330 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78  le( idx>0 && idx
2f340 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  <pPage->pBt->usa
2f350 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  bleSize ){.    i
2f360 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
2f370 28 26 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b 0a  (&data[idx+2]);.
2f380 20 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67      sprintf(rang
2f390 65 2c 22 25 64 2e 2e 25 64 22 2c 20 69 64 78 2c  e,"%d..%d", idx,
2f3a0 20 69 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20 20   idx+sz-1);.    
2f3b0 6e 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  nFree += sz;.   
2f3c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f3d0 6e 74 66 28 22 66 72 65 65 62 6c 6f 63 6b 20 25  ntf("freeblock %
2f3e0 32 64 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a 65  2d: i=%-10s size
2f3f0 3d 25 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c 6e  =%-4d total=%d\n
2f400 22 2c 0a 20 20 20 20 20 20 20 69 2c 20 72 61 6e  ",.       i, ran
2f410 67 65 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b 0a  ge, sz, nFree);.
2f420 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62 79      idx = get2by
2f430 74 65 28 26 64 61 74 61 5b 69 64 78 5d 29 3b 0a  te(&data[idx]);.
2f440 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69      i++;.  }.  i
2f450 66 28 20 69 64 78 21 3d 30 20 29 7b 0a 20 20 20  f( idx!=0 ){.   
2f460 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f470 6e 74 66 28 22 45 52 52 4f 52 3a 20 6e 65 78 74  ntf("ERROR: next
2f480 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65 78   freeblock index
2f490 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25   out of range: %
2f4a0 64 5c 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d 0a  d\n", idx);.  }.
2f4b0 20 20 69 66 28 20 72 65 63 75 72 73 69 76 65 20    if( recursive 
2f4c0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
2f4d0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
2f4e0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
2f4f0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
2f500 61 72 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ar *pCell = find
2f510 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
2f520 20 20 20 20 20 20 62 74 72 65 65 50 61 67 65 44        btreePageD
2f530 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79 74  ump(pBt, get4byt
2f540 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50 61  e(pCell), 1, pPa
2f550 67 65 29 3b 0a 20 20 20 20 20 20 69 64 78 20 3d  ge);.      idx =
2f560 20 67 65 74 32 62 79 74 65 28 70 43 65 6c 6c 29   get2byte(pCell)
2f570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
2f580 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67  ePageDump(pBt, g
2f590 65 74 34 62 79 74 65 28 26 64 61 74 61 5b 68 64  et4byte(&data[hd
2f5a0 72 2b 38 5d 29 2c 20 31 2c 20 70 50 61 67 65 29  r+8]), 1, pPage)
2f5b0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69  ;.  }.  pPage->i
2f5c0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b 0a  sInit = isInit;.
2f5d0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
2f5e0 6e 72 65 66 28 64 61 74 61 29 3b 0a 20 20 66 66  nref(data);.  ff
2f5f0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
2f600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f610 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2f620 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74 72  treePageDump(Btr
2f630 65 65 20 2a 70 2c 20 69 6e 74 20 70 67 6e 6f 2c  ee *p, int pgno,
2f640 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 29 7b   int recursive){
2f650 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50  .  return btreeP
2f660 61 67 65 44 75 6d 70 28 70 2d 3e 70 42 74 2c 20  ageDump(p->pBt, 
2f670 70 67 6e 6f 2c 20 72 65 63 75 72 73 69 76 65 2c  pgno, recursive,
2f680 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   0);.}.#endif..#
2f690 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2f6a0 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
2f6b0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
2f6c0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65 73  ./*.** Fill aRes
2f6d0 75 6c 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f 72  ult[] with infor
2f6e0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
2f6f0 20 65 6e 74 72 79 20 61 6e 64 20 70 61 67 65 20   entry and page 
2f700 74 68 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 73  that the.** curs
2f710 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
2f720 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65 73  o..** .**   aRes
2f730 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65 20 70 61  ult[0] =  The pa
2f740 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ge number.**   a
2f750 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68 65  Result[1] =  The
2f760 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a 2a   entry number.**
2f770 20 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20     aResult[2] = 
2f780 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f790 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73   entries on this
2f7a0 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75   page.**   aResu
2f7b0 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73 69  lt[3] =  Cell si
2f7c0 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  ze (local payloa
2f7d0 64 20 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20 20  d + header).**  
2f7e0 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20 4e   aResult[4] =  N
2f7f0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
2f800 74 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  tes on this page
2f810 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 35 5d  .**   aResult[5]
2f820 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   =  Number of fr
2f830 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  ee blocks on the
2f840 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75   page.**   aResu
2f850 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20 70  lt[6] =  Total p
2f860 61 79 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f 63  ayload size (loc
2f870 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a 2a  al + overflow).*
2f880 2a 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d  *   aResult[7] =
2f890 20 20 48 65 61 64 65 72 20 73 69 7a 65 20 69 6e    Header size in
2f8a0 20 62 79 74 65 73 0a 2a 2a 20 20 20 61 52 65 73   bytes.**   aRes
2f8b0 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c 20  ult[8] =  Local 
2f8c0 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a 20  payload size.** 
2f8d0 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 20    aResult[9] =  
2f8e0 50 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  Parent page numb
2f8f0 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  er.**.** This ro
2f900 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2f910 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
2f920 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2f930 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2f940 65 43 75 72 73 6f 72 49 6e 66 6f 28 42 74 43 75  eCursorInfo(BtCu
2f950 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2f960 2a 61 52 65 73 75 6c 74 2c 20 69 6e 74 20 75 70  *aResult, int up
2f970 43 6e 74 29 7b 0a 20 20 69 6e 74 20 63 6e 74 2c  Cnt){.  int cnt,
2f980 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2f990 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
2f9a0 50 61 67 65 3b 0a 20 20 42 74 43 75 72 73 6f 72  Page;.  BtCursor
2f9b0 20 74 6d 70 43 75 72 3b 0a 0a 20 20 69 6e 74 20   tmpCur;..  int 
2f9c0 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
2f9d0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2f9e0 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66  n(pCur, 1);.  if
2f9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fa00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2fa10 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 49 6e 74  ;.  }..  pageInt
2fa20 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20  egrity(pPage);. 
2fa30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2fa40 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 65 74 54  isInit );.  getT
2fa50 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2fa60 26 74 6d 70 43 75 72 29 3b 0a 20 20 77 68 69 6c  &tmpCur);.  whil
2fa70 65 28 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20 20  e( upCnt-- ){.  
2fa80 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 26    moveToParent(&
2fa90 74 6d 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70  tmpCur);.  }.  p
2faa0 50 61 67 65 20 3d 20 74 6d 70 43 75 72 2e 70 50  Page = tmpCur.pP
2fab0 61 67 65 3b 0a 20 20 70 61 67 65 49 6e 74 65 67  age;.  pageInteg
2fac0 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20 61  rity(pPage);.  a
2fad0 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69  Result[0] = sqli
2fae0 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
2faf0 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ber(pPage->aData
2fb00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 65  );.  assert( aRe
2fb10 73 75 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e  sult[0]==pPage->
2fb20 70 67 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75 6c  pgno );.  aResul
2fb30 74 5b 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69 64  t[1] = tmpCur.id
2fb40 78 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d 20  x;.  aResult[2] 
2fb50 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
2fb60 20 20 69 66 28 20 74 6d 70 43 75 72 2e 69 64 78    if( tmpCur.idx
2fb70 3e 3d 30 20 26 26 20 74 6d 70 43 75 72 2e 69 64  >=0 && tmpCur.id
2fb80 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2fb90 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66  {.    getCellInf
2fba0 6f 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 20 20  o(&tmpCur);.    
2fbb0 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d 70  aResult[3] = tmp
2fbc0 43 75 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  Cur.info.nSize;.
2fbd0 20 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d      aResult[6] =
2fbe0 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44 61   tmpCur.info.nDa
2fbf0 74 61 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  ta;.    aResult[
2fc00 37 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f  7] = tmpCur.info
2fc10 2e 6e 48 65 61 64 65 72 3b 0a 20 20 20 20 61 52  .nHeader;.    aR
2fc20 65 73 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43 75  esult[8] = tmpCu
2fc30 72 2e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  r.info.nLocal;. 
2fc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73   }else{.    aRes
2fc50 75 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[3] = 0;.    
2fc60 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b 0a  aResult[6] = 0;.
2fc70 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d      aResult[7] =
2fc80 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b   0;.    aResult[
2fc90 38 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 52  8] = 0;.  }.  aR
2fca0 65 73 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67 65  esult[4] = pPage
2fcb0 2d 3e 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20 3d  ->nFree;.  cnt =
2fcc0 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 32   0;.  idx = get2
2fcd0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2fce0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2fcf0 73 65 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65  set+1]);.  while
2fd00 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70  ( idx>0 && idx<p
2fd10 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2fd20 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e 74  eSize ){.    cnt
2fd30 2b 2b 3b 0a 20 20 20 20 69 64 78 20 3d 20 67 65  ++;.    idx = ge
2fd40 74 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t2byte(&pPage->a
2fd50 44 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d 0a  Data[idx]);.  }.
2fd60 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 63    aResult[5] = c
2fd70 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  nt;.  if( pPage-
2fd80 3e 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 69  >pParent==0 || i
2fd90 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29  sRootPage(pPage)
2fda0 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b   ){.    aResult[
2fdb0 39 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  9] = 0;.  }else{
2fdc0 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20  .    aResult[9] 
2fdd0 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
2fde0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
2fdf0 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
2fe00 26 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74 75  &tmpCur);.  retu
2fe10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2fe20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
2fe30 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61  turn the pager a
2fe40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
2fe50 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f   BTree.  This ro
2fe60 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2fe70 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
2fe80 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
2fe90 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74  .*/.Pager *sqlit
2fea0 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72  e3BtreePager(Btr
2feb0 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
2fec0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b   p->pBt->pPager;
2fed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  .}../*.** This s
2fee0 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73  tructure is pass
2fef0 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75 67  ed around throug
2ff00 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74 79  h all the sanity
2ff10 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e   checking routin
2ff20 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  es.** in order t
2ff30 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  o keep track of 
2ff40 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61 74  some global stat
2ff50 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  e information..*
2ff60 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2ff70 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e 74   IntegrityCk Int
2ff80 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63 74  egrityCk;.struct
2ff90 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a 20   IntegrityCk {. 
2ffa0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2ffb0 20 20 20 2f 2a 20 54 68 65 20 74 72 65 65 20 62     /* The tree b
2ffc0 65 69 6e 67 20 63 68 65 63 6b 65 64 20 6f 75 74  eing checked out
2ffd0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
2ffe0 67 65 72 3b 20 2f 2a 20 54 68 65 20 61 73 73 6f  ger; /* The asso
2fff0 63 69 61 74 65 64 20 70 61 67 65 72 2e 20 20 41  ciated pager.  A
30000 6c 73 6f 20 61 63 63 65 73 73 69 62 6c 65 20 62  lso accessible b
30010 79 20 70 42 74 2d 3e 70 50 61 67 65 72 20 2a 2f  y pBt->pPager */
30020 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
30030 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
30040 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
30050 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  base */.  int *a
30060 6e 52 65 66 3b 20 20 20 20 2f 2a 20 4e 75 6d 62  nRef;    /* Numb
30070 65 72 20 6f 66 20 74 69 6d 65 73 20 65 61 63 68  er of times each
30080 20 70 61 67 65 20 69 73 20 72 65 66 65 72 65 6e   page is referen
30090 63 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ced */.  char *z
300a0 45 72 72 4d 73 67 3b 20 2f 2a 20 41 6e 20 65 72  ErrMsg; /* An er
300b0 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 4e 55  ror message.  NU
300c0 4c 4c 20 6f 66 20 6e 6f 20 65 72 72 6f 72 73 20  LL of no errors 
300d0 73 65 65 6e 2e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  seen. */.};..#if
300e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
300f0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
30100 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
30110 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65  message to the e
30120 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
30130 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
30140 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d  oid checkAppendM
30150 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  sg(.  IntegrityC
30160 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61  k *pCheck,.  cha
30170 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73  r *zMsg1,.  cons
30180 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
30190 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c  .  ....){.  va_l
301a0 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
301b0 7a 4d 73 67 32 3b 0a 20 20 76 61 5f 73 74 61 72  zMsg2;.  va_star
301c0 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
301d0 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65    zMsg2 = sqlite
301e0 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
301f0 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
30200 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67  (ap);.  if( zMsg
30210 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22  1==0 ) zMsg1 = "
30220 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  ";.  if( pCheck-
30230 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
30240 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68  char *zOld = pCh
30250 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20  eck->zErrMsg;.  
30260 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73    pCheck->zErrMs
30270 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  g = 0;.    sqlit
30280 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68  e3SetString(&pCh
30290 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f  eck->zErrMsg, zO
302a0 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c  ld, "\n", zMsg1,
302b0 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
302c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
302d0 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65  e(zOld);.  }else
302e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
302f0 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e  String(&pCheck->
30300 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  zErrMsg, zMsg1, 
30310 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29  zMsg2, (char*)0)
30320 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
30330 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e  ee(zMsg2);.}.#en
30340 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
30350 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
30360 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
30370 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
30380 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
30390 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
303a0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
303b0 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
303c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
303d0 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
303e0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
303f0 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
30400 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
30410 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
30420 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
30430 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
30440 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
30450 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
30460 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
30470 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
30480 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
30490 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
304a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
304b0 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
304c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
304d0 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
304e0 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69  k *pCheck, int i
304f0 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e  Page, char *zCon
30500 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61  text){.  if( iPa
30510 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ge==0 ) return 1
30520 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43  ;.  if( iPage>pC
30530 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69  heck->nPage || i
30540 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68  Page<0 ){.    ch
30550 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
30560 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
30570 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d  invalid page num
30580 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b  ber %d", iPage);
30590 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
305a0 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d   }.  if( pCheck-
305b0 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31  >anRef[iPage]==1
305c0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
305d0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
305e0 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65  Context, "2nd re
305f0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
30600 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30610 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
30620 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b   return  (pCheck
30630 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b  ->anRef[iPage]++
30640 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  )>1;.}..#ifndef 
30650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30660 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65  VACUUM./*.** Che
30670 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ck that the entr
30680 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
30690 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43  -map for page iC
306a0 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a  hild maps to .**
306b0 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70   page iParent, p
306c0 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54  ointer type ptrT
306d0 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70  ype. If not, app
306e0 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  end an error mes
306f0 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63  sage.** to pChec
30700 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
30710 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20  d checkPtrmap(. 
30720 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
30730 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67  heck,   /* Integ
30740 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65  rity check conte
30750 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  xt */.  Pgno iCh
30760 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ild,           /
30770 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d  * Child page num
30780 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ber */.  u8 eTyp
30790 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
307a0 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
307b0 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a  ter map type */.
307c0 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20    Pgno iParent, 
307d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
307e0 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
307f0 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
30800 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
30810 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
30820 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72  /* Context descr
30830 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72  iption (used for
30840 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29   error msg) */.)
30850 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38  {.  int rc;.  u8
30860 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20   ePtrmapType;.  
30870 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65  Pgno iPtrmapPare
30880 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d  nt;..  rc = ptrm
30890 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42  apGet(pCheck->pB
308a0 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72  t, iChild, &ePtr
308b0 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61  mapType, &iPtrma
308c0 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
308d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
308e0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
308f0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30900 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f  text, "Failed to
30910 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79   read ptrmap key
30920 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20  =%d", iChild);. 
30930 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
30940 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70    if( ePtrmapTyp
30950 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72  e!=eType || iPtr
30960 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65  mapParent!=iPare
30970 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  nt ){.    checkA
30980 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30990 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
309a0 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65    "Bad ptr map e
309b0 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65  ntry key=%d expe
309c0 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74  cted=(%d,%d) got
309d0 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20  =(%d,%d)", .    
309e0 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c    iChild, eType,
309f0 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61   iParent, ePtrma
30a00 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61  pType, iPtrmapPa
30a10 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  rent);.  }.}.#en
30a20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
30a30 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
30a40 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f  f the freelist o
30a50 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
30a60 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56   page list..** V
30a70 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
30a80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
30a90 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e  n the list is N.
30aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30ab0 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74  checkList(.  Int
30ac0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
30ad0 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20  ,  /* Integrity 
30ae0 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74  checking context
30af0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65   */.  int isFree
30b00 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  List,       /* T
30b10 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69  rue for a freeli
30b20 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f  st.  False for o
30b30 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
30b40 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  t */.  int iPage
30b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30b60 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
30b70 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68  first page in th
30b80 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
30b90 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
30ba0 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75    /* Expected nu
30bb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
30bc0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63   the list */.  c
30bd0 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
30be0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
30bf0 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
30c00 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
30c10 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64  ;.  int expected
30c20 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72   = N;.  int iFir
30c30 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68  st = iPage;.  wh
30c40 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( N-- > 0 ){.
30c50 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
30c60 72 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  r *pOvfl;.    if
30c70 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20  ( iPage<1 ){.   
30c80 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
30c90 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
30ca0 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64  xt,.         "%d
30cb0 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73   of %d pages mis
30cc0 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c  sing from overfl
30cd0 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ow list starting
30ce0 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20   at %d",.       
30cf0 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64     N+1, expected
30d00 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
30d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
30d20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70    if( checkRef(p
30d30 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43  Check, iPage, zC
30d40 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b  ontext) ) break;
30d50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
30d60 70 61 67 65 72 5f 67 65 74 28 70 43 68 65 63 6b  pager_get(pCheck
30d70 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29  ->pPager, (Pgno)
30d80 69 50 61 67 65 2c 20 28 76 6f 69 64 2a 2a 29 26  iPage, (void**)&
30d90 70 4f 76 66 6c 29 20 29 7b 0a 20 20 20 20 20 20  pOvfl) ){.      
30da0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30db0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30dc0 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20   "failed to get 
30dd0 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
30de0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30df0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 46     }.    if( isF
30e00 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  reeList ){.     
30e10 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74   int n = get4byt
30e20 65 28 26 70 4f 76 66 6c 5b 34 5d 29 3b 0a 23 69  e(&pOvfl[4]);.#i
30e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30e40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30e50 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
30e60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
30e70 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
30e80 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50  trmap(pCheck, iP
30e90 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
30ea0 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
30eb0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
30ec0 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70  if.      if( n>p
30ed0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62  Check->pBt->usab
30ee0 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20  leSize/4-8 ){.  
30ef0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
30f00 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30f10 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
30f20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66    "freelist leaf
30f30 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f   count too big o
30f40 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  n page %d", iPag
30f50 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b  e);.        N--;
30f60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30f70 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30f80 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
30f90 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61      Pgno iFreePa
30fa0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
30fb0 4f 76 66 6c 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69  Ovfl[8+i*4]);.#i
30fc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30fd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30fe0 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63         if( pChec
30ff0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
31000 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
31010 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31020 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
31030 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
31040 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
31050 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
31060 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  if.          che
31070 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46  ckRef(pCheck, iF
31080 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  reePage, zContex
31090 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
310a0 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20        N -= n;.  
310b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
310c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
310d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65  AUTOVACUUM.    e
310e0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
310f0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
31100 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
31110 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73  uum and iPage is
31120 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20   not the last.  
31130 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
31140 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  his overflow lis
31150 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
31160 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
31170 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  try for.      **
31180 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
31190 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67  age matches iPag
311a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
311b0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
311c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
311d0 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   N>0 ){.        
311e0 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  i = get4byte(pOv
311f0 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65  fl);.        che
31200 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31210 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46   i, PTRMAP_OVERF
31220 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW2, iPage, zCo
31230 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
31240 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31250 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
31260 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
31270 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
31280 28 70 4f 76 66 6c 29 3b 0a 20 20 7d 0a 7d 0a 23  (pOvfl);.  }.}.#
31290 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
312a0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
312b0 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
312c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
312d0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
312e0 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61  ** Do various sa
312f0 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61  nity checks on a
31300 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
31310 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a  a tree.  Return.
31320 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74  ** the tree dept
31330 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72  h.  Root pages r
31340 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74  eturn 0.  Parent
31350 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a  s of root pages.
31360 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64  ** return 1, and
31370 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a   so forth..** .*
31380 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61  * These checks a
31390 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  re done:.**.**  
313a0 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72      1.  Make sur
313b0 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64  e that cells and
313c0 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e   freeblocks do n
313d0 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20  ot overlap.**   
313e0 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69         but combi
313f0 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ne to completely
31400 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e   cover the page.
31410 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b  .**  NO  2.  Mak
31420 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73  e sure cell keys
31430 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a   are in order..*
31440 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20  *  NO  3.  Make 
31450 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c  sure no key is l
31460 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
31470 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64  l to zLowerBound
31480 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61  ..**  NO  4.  Ma
31490 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
314a0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
314b0 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65  r equal to zUppe
314c0 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20  rBound..**      
314d0 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e  5.  Check the in
314e0 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66  tegrity of overf
314f0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20  low pages..**   
31500 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65     6.  Recursive
31510 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65  ly call checkTre
31520 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69  ePage on all chi
31530 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37  ldren..**      7
31540 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
31550 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20  he depth of all 
31560 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20  children is the 
31570 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e  same..**      8.
31580 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
31590 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73   page is at leas
315a0 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c  t 33% full or el
315b0 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  se it is.**     
315c0 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66       the root of
315d0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74   the tree..*/.st
315e0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72  atic int checkTr
315f0 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72  eePage(.  Integr
31600 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
31610 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74  /* Context for t
31620 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20  he sanity check 
31630 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
31640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
31650 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
31660 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a   page to check *
31670 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
31680 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
31690 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68  ent page */.  ch
316a0 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
316b0 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt  /* Parent co
316c0 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ntext */.){.  Me
316d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
316e0 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68  int i, rc, depth
316f0 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b  , d2, pgno, cnt;
31700 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c  .  int hdr, cell
31710 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65  Start;.  int nCe
31720 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a  ll;.  u8 *data;.
31730 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
31740 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
31750 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65  e;.  char zConte
31760 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20  xt[100];.  char 
31770 2a 68 69 74 3b 0a 0a 20 20 73 70 72 69 6e 74 66  *hit;..  sprintf
31780 28 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65  (zContext, "Page
31790 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a   %d: ", iPage);.
317a0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
317b0 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73   the page exists
317c0 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43  .  */.  pBt = pC
317d0 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61  heck->pBt;.  usa
317e0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
317f0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28  sableSize;.  if(
31800 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   iPage==0 ) retu
31810 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63  rn 0;.  if( chec
31820 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61  kRef(pCheck, iPa
31830 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ge, zParentConte
31840 78 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xt) ) return 0;.
31850 20 20 69 66 28 20 28 72 63 20 3d 20 67 65 74 50    if( (rc = getP
31860 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
31870 50 61 67 65 2c 20 26 70 50 61 67 65 29 29 21 3d  Page, &pPage))!=
31880 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
31890 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
318a0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
318b0 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
318c0 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20  the page. error 
318d0 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20  code=%d", rc);. 
318e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
318f0 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69 6e 69  .  if( (rc = ini
31900 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
31910 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  rent))!=0 ){.   
31920 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31930 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31940 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20 72 65  , "initPage() re
31950 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
31960 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
31970 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
31980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
31990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
319a0 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
319b0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
319c0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
319d0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
319e0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
319f0 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Cell;.    int sz
31a00 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ;.    CellInfo i
31a10 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  nfo;..    /* Che
31a20 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66  ck payload overf
31a30 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f  low pages.    */
31a40 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f  .    sprintf(zCo
31a50 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72 65 65 20  ntext, "On tree 
31a60 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a  page %d cell %d:
31a70 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20   ", iPage, i);. 
31a80 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
31a90 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20  ell(pPage,i);.  
31aa0 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
31ab0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
31ac0 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e  fo);.    sz = in
31ad0 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66  fo.nData;.    if
31ae0 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
31af0 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b   ) sz += info.nK
31b00 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69  ey;.    if( sz>i
31b10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
31b20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
31b30 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  (sz - info.nLoca
31b40 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  l + usableSize -
31b50 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20   5)/(usableSize 
31b60 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f  - 4);.      Pgno
31b70 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
31b80 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
31b90 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69  .iOverflow]);.#i
31ba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31bb0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31bc0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
31bd0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
31be0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31bf0 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  heck, pgnoOvfl, 
31c00 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
31c10 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31c20 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
31c30 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69  if.      checkLi
31c40 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67  st(pCheck, 0, pg
31c50 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a  noOvfl, nPage, z
31c60 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  Context);.    }.
31c70 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61  .    /* Check sa
31c80 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69  nity of left chi
31c90 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ld page..    */.
31ca0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31cb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67  leaf ){.      pg
31cc0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
31cd0 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
31ce0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31cf0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
31d00 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31d10 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
31d20 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
31d30 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
31d40 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31d50 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
31d60 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68  if.      d2 = ch
31d70 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
31d80 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43  ck,pgno,pPage,zC
31d90 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69  ontext);.      i
31da0 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65  f( i>0 && d2!=de
31db0 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63  pth ){.        c
31dc0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31dd0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31de0 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74  "Child page dept
31df0 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20  h differs");.   
31e00 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68     }.      depth
31e10 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = d2;.    }.  }
31e20 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
31e30 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
31e40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
31e50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
31e60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
31e70 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74     sprintf(zCont
31e80 65 78 74 2c 20 22 4f 6e 20 70 61 67 65 20 25 64  ext, "On page %d
31e90 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
31ea0 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
31eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31ec0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
31ed0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31ee0 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
31ef0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31f00 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
31f10 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
31f20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31f30 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
31f40 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67  heck, pgno, pPag
31f50 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31f60 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
31f70 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
31f80 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
31f90 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
31fa0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
31fb0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
31fc0 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
31fd0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61  qliteMalloc( usa
31fe0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
31ff0 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73   hit ){.    mems
32000 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
32010 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
32020 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
32030 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
32040 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
32050 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
32060 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
32070 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
32080 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
32090 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
320a0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
320b0 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
320c0 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65     int size = ce
320d0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
320e0 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
320f0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
32100 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
32110 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
32120 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
32130 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32140 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
32150 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
32160 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
32170 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
32180 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
32190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
321a0 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
321b0 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
321c0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
321d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
321e0 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
321f0 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
32200 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
32210 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
32220 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
32230 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
32240 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
32250 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
32260 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
32270 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
32280 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
32290 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
322a0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
322b0 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
322c0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
322d0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
322e0 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
322f0 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
32300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32310 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
32320 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
32330 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
32340 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
32350 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
32360 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
32370 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
32380 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
32390 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
323a0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
323b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
323c0 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
323d0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
323e0 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
323f0 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
32400 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
32410 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
32420 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
32440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
32450 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
32460 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32470 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32480 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
32490 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
324a0 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
324b0 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
324c0 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
324d0 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
324e0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
324f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
32500 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61  e(hit);..  relea
32510 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32520 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b   return depth+1;
32530 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
32540 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
32550 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
32560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32570 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
32580 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
32590 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c  ine does a compl
325a0 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65  ete check of the
325b0 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c   given BTree fil
325c0 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a  e.  aRoot[] is.*
325d0 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61  * an array of pa
325e0 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65  ges numbers were
325f0 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65   each page numbe
32600 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  r is the root pa
32610 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65  ge of.** a table
32620 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20  .  nRoot is the 
32630 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
32640 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a  s in aRoot..**.*
32650 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
32660 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73  checks out, this
32670 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
32680 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74   NULL.  If somet
32690 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73  hing is.** amiss
326a0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
326b0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
326c0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
326d0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
326e0 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  .** and a pointe
326f0 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20  r to that error 
32700 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72  message is retur
32710 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ned.  The callin
32720 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
32730 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
32740 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72   freeing the err
32750 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
32760 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63  it is done..*/.c
32770 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
32780 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  eIntegrityCheck(
32790 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 61  Btree *p, int *a
327a0 52 6f 6f 74 2c 20 69 6e 74 20 6e 52 6f 6f 74 29  Root, int nRoot)
327b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
327c0 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69   nRef;.  Integri
327d0 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42  tyCk sCheck;.  B
327e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
327f0 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52 65 66 20 3d  ->pBt;..  nRef =
32800 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
32810 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
32820 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
32830 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
32840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32850 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
32860 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74  StrDup("Unable t
32870 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
32880 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
32890 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73  abase");.  }.  s
328a0 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b  Check.pBt = pBt;
328b0 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72  .  sCheck.pPager
328c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
328d0 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
328e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
328f0 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70  gecount(sCheck.p
32900 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 73 43  Pager);.  if( sC
32910 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
32920 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
32930 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
32940 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
32950 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
32960 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
32970 77 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65  w( (sCheck.nPage
32980 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
32990 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20  k.anRef[0]) );. 
329a0 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52   if( !sCheck.anR
329b0 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  ef ){.    unlock
329c0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
329d0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t);.    return s
329e0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 55  qlite3MPrintf("U
329f0 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  nable to malloc 
32a00 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20  %d bytes", .    
32a10 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67      (sCheck.nPag
32a20 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
32a30 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20  ck.anRef[0]));. 
32a40 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
32a50 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69  =sCheck.nPage; i
32a60 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65  ++){ sCheck.anRe
32a70 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20  f[i] = 0; }.  i 
32a80 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
32a90 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20  AGE(pBt);.  if( 
32aa0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
32ab0 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e  ){.    sCheck.an
32ac0 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Ref[i] = 1;.  }.
32ad0 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67    sCheck.zErrMsg
32ae0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   = 0;..  /* Chec
32af0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
32b00 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  of the freelist.
32b10 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74    */.  checkList
32b20 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74  (&sCheck, 1, get
32b30 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
32b40 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a  e1->aData[32]),.
32b50 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
32b60 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
32b70 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22  1->aData[36]), "
32b80 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22  Main freelist: "
32b90 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61  );..  /* Check a
32ba0 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20  ll the tables.. 
32bb0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
32bc0 3c 6e 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20  <nRoot; i++){.  
32bd0 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d    if( aRoot[i]==
32be0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  0 ) continue;.#i
32bf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32c00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32c10 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
32c20 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d  cuum && aRoot[i]
32c30 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  >1 ){.      chec
32c40 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c  kPtrmap(&sCheck,
32c50 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41   aRoot[i], PTRMA
32c60 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30  P_ROOTPAGE, 0, 0
32c70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
32c80 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
32c90 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  e(&sCheck, aRoot
32ca0 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66  [i], 0, "List of
32cb0 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b   tree roots: ");
32cc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
32cd0 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20  sure every page 
32ce0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  in the file is r
32cf0 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20  eferenced.  */. 
32d00 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68   for(i=1; i<=sCh
32d10 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  eck.nPage; i++){
32d20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
32d30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32d40 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
32d50 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Ref[i]==0 ){.   
32d60 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32d70 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
32d80 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
32d90 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
32da0 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66  .#else.    /* If
32db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
32dc0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
32dd0 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f  um, make sure no
32de0 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a   tables contain.
32df0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
32e00 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s to pointer-map
32e10 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   pages..    */. 
32e20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
32e30 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20  Ref[i]==0 && .  
32e40 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
32e50 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c  ENO(pBt, i)!=i |
32e60 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  | !pBt->autoVacu
32e70 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
32e80 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
32e90 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
32ea0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
32eb0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   i);.    }.    i
32ec0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
32ed0 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]!=0 && .      
32ee0 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
32ef0 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42  pBt, i)==i && pB
32f00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
32f10 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32f20 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
32f30 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20  0, "Pointer map 
32f40 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72  page %d is refer
32f50 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20  enced", i);.    
32f60 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
32f70 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  /* Make sure thi
32f80 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e  s analysis did n
32f90 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72  ot leave any unr
32fa0 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a  ef() pages.  */.
32fb0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
32fc0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66  nused(pBt);.  if
32fd0 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65  ( nRef != sqlite
32fe0 33 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 28  3pager_refcount(
32ff0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
33000 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
33010 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a  sg(&sCheck, 0, .
33020 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69        "Outstandi
33030 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f  ng page count go
33040 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  es from %d to %d
33050 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61   during this ana
33060 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52  lysis",.      nR
33070 65 66 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72  ef, sqlite3pager
33080 5f 72 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  _refcount(pBt->p
33090 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
330a0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75  }..  /* Clean  u
330b0 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72  p and report err
330c0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ors..  */.  sqli
330d0 74 65 46 72 65 65 28 73 43 68 65 63 6b 2e 61 6e  teFree(sCheck.an
330e0 52 65 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  Ref);.  return s
330f0 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d  Check.zErrMsg;.}
33100 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33110 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
33120 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
33130 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
33140 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
33150 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
33160 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
33170 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
33180 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
33190 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
331a0 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
331b0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
331c0 74 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65  turn sqlite3page
331d0 72 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42  r_filename(p->pB
331e0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  t->pPager);.}../
331f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33200 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
33210 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
33220 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
33230 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
33240 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
33250 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65  3BtreeGetDirname
33260 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
33270 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
33280 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
33290 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  urn sqlite3pager
332a0 5f 64 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  _dirname(p->pBt-
332b0 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  >pPager);.}../*.
332c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
332d0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
332e0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74  urnal file for t
332f0 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54 68  his database. Th
33300 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75  e return.** valu
33310 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e of this routin
33320 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65  e is the same re
33330 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
33340 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
33350 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
33360 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e   created or not.
33370 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
33380 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
33390 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65  ournalname(Btree
333a0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
333b0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
333c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
333d0 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e  lite3pager_journ
333e0 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  alname(p->pBt->p
333f0 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64  Pager);.}..#ifnd
33400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
33410 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  ACUUM./*.** Copy
33420 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
33430 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d  ntent of pBtFrom
33440 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20   into pBtTo.  A 
33450 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d  transaction.** m
33460 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f  ust be active fo
33470 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a  r both files..**
33480 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
33490 66 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79  file pBtFrom may
334a0 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74   be reduced by t
334b0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
334c0 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
334d0 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72  es wrong, the tr
334e0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74  ansaction on pBt
334f0 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62  From is rolled b
33500 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ack..*/.int sqli
33510 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65  te3BtreeCopyFile
33520 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72  (Btree *pTo, Btr
33530 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e  ee *pFrom){.  in
33540 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33550 3b 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67  ;.  Pgno i, nPag
33560 65 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69  e, nToPage, iSki
33570 70 3b 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p;..  BtShared *
33580 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74  pBtTo = pTo->pBt
33590 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
335a0 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70  tFrom = pFrom->p
335b0 42 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e  Bt;..  if( pTo->
335c0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
335d0 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69  RITE || pFrom->i
335e0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
335f0 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
33600 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
33610 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d    }.  if( pBtTo-
33620 3e 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >pCursor ) retur
33630 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
33640 20 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74   nToPage = sqlit
33650 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
33660 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  t(pBtTo->pPager)
33670 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
33680 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
33690 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  nt(pBtFrom->pPag
336a0 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50  er);.  iSkip = P
336b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
336c0 28 70 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69  (pBtTo);.  for(i
336d0 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
336e0 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69  K && i<=nPage; i
336f0 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ++){.    void *p
33700 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d  Page;.    if( i=
33710 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75  =iSkip ) continu
33720 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
33730 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74  te3pager_get(pBt
33740 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c  From->pPager, i,
33750 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66   &pPage);.    if
33760 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
33770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
33780 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 70 42  ger_overwrite(pB
33790 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
337a0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
337b0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
337c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
337d0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ef(pPage);.  }. 
337e0 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20   for(i=nPage+1; 
337f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33800 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b   i<=nToPage; i++
33810 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 50 61  ){.    void *pPa
33820 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  ge;.    if( i==i
33830 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Skip ) continue;
33840 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33850 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 54 6f  3pager_get(pBtTo
33860 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  ->pPager, i, &pP
33870 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
33880 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63   ) break;.    rc
33890 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
338a0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
338b0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
338c0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
338d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
338e0 6e 74 5f 77 72 69 74 65 28 70 42 74 54 6f 2d 3e  nt_write(pBtTo->
338f0 70 50 61 67 65 72 2c 20 69 29 3b 0a 20 20 7d 0a  pPager, i);.  }.
33900 20 20 69 66 28 20 21 72 63 20 26 26 20 6e 50 61    if( !rc && nPa
33910 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20  ge<nToPage ){.  
33920 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
33930 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 42 74  ger_truncate(pBt
33940 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50 61 67  To->pPager, nPag
33950 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
33960 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
33970 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f  treeRollback(pTo
33980 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33990 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rc;  .}.#endif /
339a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  * SQLITE_OMIT_VA
339b0 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  CUUM */../*.** R
339c0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
339d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
339e0 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
339f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
33a00 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  InTrans(Btree *p
33a10 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  ){.  return (p &
33a20 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  & (p->inTrans==T
33a30 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a  RANS_WRITE));.}.
33a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
33a50 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74  n-zero if a stat
33a60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
33a70 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
33a80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
33a90 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  IsInStmt(Btree *
33aa0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  p){.  return (p-
33ab0 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e  >pBt && p->pBt->
33ac0 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
33ad0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
33ae0 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20  o if a read (or 
33af0 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
33b00 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
33b10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33b20 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42  eIsInReadTrans(B
33b30 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
33b40 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
33b50 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
33b60 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
33b70 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
33b80 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
33b90 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
33ba0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
33bb0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
33bc0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
33bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
33be0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
33bf0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
33c00 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
33c10 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
33c20 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
33c30 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
33c40 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
33c50 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
33c60 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
33c70 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
33c80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
33c90 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
33ca0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
33cb0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
33cc0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
33cd0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
33ce0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
33cf0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
33d00 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
33d10 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
33d20 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
33d30 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
33d40 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
33d50 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
33d60 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
33d70 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
33d80 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
33d90 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
33da0 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
33db0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
33dc0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
33dd0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
33de0 74 65 33 42 74 72 65 65 53 79 6e 63 28 42 74 72  te3BtreeSync(Btr
33df0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
33e00 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
33e10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33e20 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
33e30 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
33e40 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
33e50 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
33e60 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20      Pgno nTrunc 
33e70 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
33e80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33e90 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
33ea0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
33eb0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
33ec0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20  cuumCommit(pBt, 
33ed0 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20  &nTrunc); .     
33ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33ef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
33f00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
33f10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
33f20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
33f30 67 65 72 5f 73 79 6e 63 28 70 42 74 2d 3e 70 50  ger_sync(pBt->pP
33f40 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  ager, zMaster, n
33f50 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  Trunc);.  }.  re
33f60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33f70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33f80 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
33f90 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d  r to a blob of m
33fa0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
33fb0 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c   with.** a singl
33fc0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20  e shared-btree. 
33fd0 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73  The memory is us
33fe0 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64  ed by client cod
33ff0 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a  e for it's own.*
34000 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20  * purposes (for 
34010 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72  example, to stor
34020 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73  e a high-level s
34030 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64  chema associated
34040 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68   with .** the sh
34050 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65  ared-btree). The
34060 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e   btree layer man
34070 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63  ages reference c
34080 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a  ounting issues..
34090 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
340a0 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c  time this is cal
340b0 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d  led on a shared-
340c0 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79  btree, nBytes by
340d0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  tes of memory.**
340e0 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
340f0 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75  zeroed, and retu
34100 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
34110 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62  er. For each sub
34120 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c  sequent .** call
34130 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61   the nBytes para
34140 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
34150 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
34160 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a  o the same blob.
34170 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74  ** of memory ret
34180 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75  urned. .**.** Ju
34190 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 68  st before the sh
341a0 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c  ared-btree is cl
341b0 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  osed, the functi
341c0 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
341d0 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d   .** xFree argum
341e0 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d  ent when the mem
341f0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  ory allocation w
34200 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b  as made is invok
34210 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c  ed on the .** bl
34220 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  ob of allocated 
34230 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e  memory. This fun
34240 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
34250 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65 65   call sqliteFree
34260 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d  ().** on the mem
34270 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c  ory, the btree l
34280 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a  ayer does that..
34290 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
342a0 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72 65  BtreeSchema(Btre
342b0 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73  e *p, int nBytes
342c0 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76  , void(*xFree)(v
342d0 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61  oid *)){.  BtSha
342e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
342f0 74 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  t;.  if( !pBt->p
34300 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42  Schema ){.    pB
34310 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  t->pSchema = sql
34320 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73  iteMalloc(nBytes
34330 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65  );.    pBt->xFre
34340 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b  eSchema = xFree;
34350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42  .  }.  return pB
34360 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f  t->pSchema;.}../
34370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
34380 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72   if another user
34390 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68 61   of the same sha
343a0 72 65 64 20 62 74 72 65 65 20 61 73 20 74 68 65  red btree as the
343b0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e   argument.** han
343c0 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  dle holds an exc
343d0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
343e0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
343f0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73   table..*/.int s
34400 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
34410 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70  aLocked(Btree *p
34420 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 71 75 65  ){.  return (que
34430 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  ryTableLock(p, M
34440 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
34450 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f  _LOCK)!=SQLITE_O
34460 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  K);.}...#ifndef 
34470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
34480 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f  ED_CACHE./*.** O
34490 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
344a0 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20  the table whose 
344b0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61  root page is iTa
344c0 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20  b.  The.** lock 
344d0 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  is a write lock 
344e0 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69  if isWritelock i
344f0 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64  s true or a read
34500 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69   lock.** if it i
34510 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  s false..*/.int 
34520 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b  sqlite3BtreeLock
34530 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
34540 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57  int iTab, u8 isW
34550 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  riteLock){.  int
34560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34570 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d  .  u8 lockType =
34580 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52   (isWriteLock?WR
34590 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f  ITE_LOCK:READ_LO
345a0 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71 75 65 72  CK);.  rc = quer
345b0 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
345c0 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  ab, lockType);. 
345d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
345e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  OK ){.    rc = l
345f0 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62  ockTable(p, iTab
34600 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 7d  , lockType);.  }
34610 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34620 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
34630 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 62 75  e following debu
34640 67 67 69 6e 67 20 69 6e 74 65 72 66 61 63 65 20  gging interface 
34650 68 61 73 20 74 6f 20 62 65 20 69 6e 20 74 68 69  has to be in thi
34660 73 20 66 69 6c 65 20 28 72 61 74 68 65 72 0a 2a  s file (rather.*
34670 2a 20 74 68 61 6e 20 69 6e 2c 20 66 6f 72 20 65  * than in, for e
34680 78 61 6d 70 6c 65 2c 20 74 65 73 74 31 2e 63 29  xample, test1.c)
34690 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
346a0 67 65 74 20 61 63 63 65 73 73 20 74 6f 0a 2a 2a  get access to.**
346b0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
346c0 6f 66 20 42 74 53 68 61 72 65 64 2e 0a 2a 2f 0a  of BtShared..*/.
346d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
346e0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
346f0 69 6e 65 64 28 54 43 4c 53 48 29 0a 23 69 6e 63  ined(TCLSH).#inc
34700 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 69 6e 74  lude <tcl.h>.int
34710 20 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f   sqlite3_shared_
34720 63 61 63 68 65 5f 72 65 70 6f 72 74 28 0a 20 20  cache_report(.  
34730 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
34740 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
34750 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
34760 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
34770 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
34780 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34790 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
347a0 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  .  const ThreadD
347b0 61 74 61 20 2a 70 54 64 20 3d 20 73 71 6c 69 74  ata *pTd = sqlit
347c0 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
347d0 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54  Only();.  if( pT
347e0 64 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  d->useSharedData
347f0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
34800 20 2a 70 42 74 3b 0a 20 20 20 20 54 63 6c 5f 4f   *pBt;.    Tcl_O
34810 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e  bj *pRet = Tcl_N
34820 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 66 6f 72  ewObj();.    for
34830 28 70 42 74 3d 70 54 64 2d 3e 70 42 74 72 65 65  (pBt=pTd->pBtree
34840 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
34850 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 6f  pNext){.      co
34860 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
34870 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66  = sqlite3pager_f
34880 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
34890 67 65 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ger);.      Tcl_
348a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
348b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
348c0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
348d0 4f 62 6a 28 7a 46 69 6c 65 2c 20 2d 31 29 29 3b  Obj(zFile, -1));
348e0 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
348f0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
34900 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
34910 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 42 74 2d  l_NewIntObj(pBt-
34920 3e 6e 52 65 66 29 29 3b 0a 20 20 20 20 7d 0a 20  >nRef));.    }. 
34930 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
34940 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
34950 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
34960 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
34970 0a 23 65 6e 64 69 66 0a                          .#endif.