System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7a67c21896d2e26e3d3b0759ab8c1f783a667723:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 31 39 20 32 30 30 36 2f 30 31  c,v 1.19 2006/01
0190: 2f 33 31 20 31 39 3a 31 36 3a 31 33 20 72 6d 73  /31 19:16:13 rms
01a0: 69 6d 70 73 6f 6e 20 45 78 70 20 24 0a 2a 2a 0a  impson Exp $.**.
01b0: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70  ** This file imp
01c0: 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e  lements a extern
01d0: 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20  al (disk-based) 
01e0: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 42  database using B
01f0: 54 72 65 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 20  Trees..** For a 
0200: 64 65 74 61 69 6c 65 64 20 64 69 73 63 75 73 73  detailed discuss
0210: 69 6f 6e 20 6f 66 20 42 54 72 65 65 73 2c 20 72  ion of BTrees, r
0220: 65 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20  efer to.**.**   
0230: 20 20 44 6f 6e 61 6c 64 20 45 2e 20 4b 6e 75 74    Donald E. Knut
0240: 68 2c 20 54 48 45 20 41 52 54 20 4f 46 20 43 4f  h, THE ART OF CO
0250: 4d 50 55 54 45 52 20 50 52 4f 47 52 41 4d 4d 49  MPUTER PROGRAMMI
0260: 4e 47 2c 20 56 6f 6c 75 6d 65 20 33 3a 0a 2a 2a  NG, Volume 3:.**
0270: 20 20 20 20 20 22 53 6f 72 74 69 6e 67 20 41 6e       "Sorting An
0280: 64 20 53 65 61 72 63 68 69 6e 67 22 2c 20 70 61  d Searching", pa
0290: 67 65 73 20 34 37 33 2d 34 38 30 2e 20 41 64 64  ges 473-480. Add
02a0: 69 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a 2a 20 20  ison-Wesley.**  
02b0: 20 20 20 50 75 62 6c 69 73 68 69 6e 67 20 43 6f     Publishing Co
02c0: 6d 70 61 6e 79 2c 20 52 65 61 64 69 6e 67 2c 20  mpany, Reading, 
02d0: 4d 61 73 73 61 63 68 75 73 65 74 74 73 2e 0a 2a  Massachusetts..*
02e0: 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
02f0: 64 65 61 20 69 73 20 74 68 61 74 20 65 61 63 68  dea is that each
0300: 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
0310: 65 20 63 6f 6e 74 61 69 6e 73 20 4e 20 64 61 74  e contains N dat
0320: 61 62 61 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  abase.** entries
0330: 20 61 6e 64 20 4e 2b 31 20 70 6f 69 6e 74 65 72   and N+1 pointer
0340: 73 20 74 6f 20 73 75 62 70 61 67 65 73 2e 0a 2a  s to subpages..*
0350: 2a 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.**   ---------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 7c 20 20  -------.**   |  
03a0: 50 74 72 28 30 29 20 7c 20 4b 65 79 28 30 29 20  Ptr(0) | Key(0) 
03b0: 7c 20 50 74 72 28 31 29 20 7c 20 4b 65 79 28 31  | Ptr(1) | Key(1
03c0: 29 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79 28 4e 29  ) | ... | Key(N)
03d0: 20 7c 20 50 74 72 28 4e 2b 31 29 20 7c 0a 2a 2a   | Ptr(N+1) |.**
03e0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  ---.**.** All of
0430: 20 74 68 65 20 6b 65 79 73 20 6f 6e 20 74 68 65   the keys on the
0440: 20 70 61 67 65 20 74 68 61 74 20 50 74 72 28 30   page that Ptr(0
0450: 29 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 76 65  ) points to have
0460: 20 76 61 6c 75 65 73 20 6c 65 73 73 0a 2a 2a 20   values less.** 
0470: 74 68 61 6e 20 4b 65 79 28 30 29 2e 20 20 41 6c  than Key(0).  Al
0480: 6c 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e  l of the keys on
0490: 20 70 61 67 65 20 50 74 72 28 31 29 20 61 6e 64   page Ptr(1) and
04a0: 20 69 74 73 20 73 75 62 70 61 67 65 73 20 68 61   its subpages ha
04b0: 76 65 0a 2a 2a 20 76 61 6c 75 65 73 20 67 72 65  ve.** values gre
04c0: 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28 30 29  ater than Key(0)
04d0: 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 4b   and less than K
04e0: 65 79 28 31 29 2e 20 20 41 6c 6c 20 6f 66 20 74  ey(1).  All of t
04f0: 68 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e 20 50 74  he keys.** on Pt
0500: 72 28 4e 2b 31 29 20 61 6e 64 20 69 74 73 20 73  r(N+1) and its s
0510: 75 62 70 61 67 65 73 20 68 61 76 65 20 76 61 6c  ubpages have val
0520: 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ues greater than
0530: 20 4b 65 79 28 4e 29 2e 20 20 41 6e 64 0a 2a 2a   Key(N).  And.**
0540: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
0550: 20 46 69 6e 64 69 6e 67 20 61 20 70 61 72 74 69   Finding a parti
0560: 63 75 6c 61 72 20 6b 65 79 20 72 65 71 75 69 72  cular key requir
0570: 65 73 20 72 65 61 64 69 6e 67 20 4f 28 6c 6f 67  es reading O(log
0580: 28 4d 29 29 20 70 61 67 65 73 20 66 72 6f 6d 20  (M)) pages from 
0590: 74 68 65 20 0a 2a 2a 20 64 69 73 6b 20 77 68 65  the .** disk whe
05a0: 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62  re M is the numb
05b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
05c0: 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
05d0: 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65   In this impleme
05e0: 6e 74 61 74 69 6f 6e 2c 20 61 20 73 69 6e 67 6c  ntation, a singl
05f0: 65 20 66 69 6c 65 20 63 61 6e 20 68 6f 6c 64 20  e file can hold 
0600: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  one or more sepa
0610: 72 61 74 65 20 0a 2a 2a 20 42 54 72 65 65 73 2e  rate .** BTrees.
0620: 20 20 45 61 63 68 20 42 54 72 65 65 20 69 73 20    Each BTree is 
0630: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
0640: 65 20 69 6e 64 65 78 20 6f 66 20 69 74 73 20 72  e index of its r
0650: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 0a 2a  oot page.  The.*
0660: 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 66  * key and data f
0670: 6f 72 20 61 6e 79 20 65 6e 74 72 79 20 61 72 65  or any entry are
0680: 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72   combined to for
0690: 6d 20 74 68 65 20 22 70 61 79 6c 6f 61 64 22 2e  m the "payload".
06a0: 20 20 41 0a 2a 2a 20 66 69 78 65 64 20 61 6d 6f    A.** fixed amo
06b0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 63  unt of payload c
06c0: 61 6e 20 62 65 20 63 61 72 72 69 65 64 20 64 69  an be carried di
06d0: 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 64 61  rectly on the da
06e0: 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 2e 20  tabase.** page. 
06f0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
0700: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
0710: 68 65 20 70 72 65 73 65 74 20 61 6d 6f 75 6e 74  he preset amount
0720: 20 74 68 65 6e 20 73 75 72 70 6c 75 73 0a 2a 2a   then surplus.**
0730: 20 62 79 74 65 73 20 61 72 65 20 73 74 6f 72 65   bytes are store
0740: 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  d on overflow pa
0750: 67 65 73 2e 20 20 54 68 65 20 70 61 79 6c 6f 61  ges.  The payloa
0760: 64 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 0a 2a  d for an entry.*
0770: 2a 20 61 6e 64 20 74 68 65 20 70 72 65 63 65 64  * and the preced
0780: 69 6e 67 20 70 6f 69 6e 74 65 72 20 61 72 65 20  ing pointer are 
0790: 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72 6d  combined to form
07a0: 20 61 20 22 43 65 6c 6c 22 2e 20 20 45 61 63 68   a "Cell".  Each
07b0: 20 0a 2a 2a 20 70 61 67 65 20 68 61 73 20 61 20   .** page has a 
07c0: 73 6d 61 6c 6c 20 68 65 61 64 65 72 20 77 68 69  small header whi
07d0: 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ch contains the 
07e0: 50 74 72 28 4e 2b 31 29 20 70 6f 69 6e 74 65 72  Ptr(N+1) pointer
07f0: 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 69 6e   and other.** in
0800: 66 6f 72 6d 61 74 69 6f 6e 20 73 75 63 68 20 61  formation such a
0810: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6b 65  s the size of ke
0820: 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a  y and data..**.*
0830: 2a 20 46 4f 52 4d 41 54 20 44 45 54 41 49 4c 53  * FORMAT DETAILS
0840: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
0850: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
0860: 70 61 67 65 73 2e 20 20 54 68 65 20 66 69 72 73  pages.  The firs
0870: 74 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65 64  t page is called
0880: 20 70 61 67 65 20 31 2c 0a 2a 2a 20 74 68 65 20   page 1,.** the 
0890: 73 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20 32  second is page 2
08a0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
08b0: 20 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   A page number o
08c0: 66 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65 73  f zero indicates
08d0: 0a 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61 67  .** "no such pag
08e0: 65 22 2e 20 20 54 68 65 20 70 61 67 65 20 73 69  e".  The page si
08f0: 7a 65 20 63 61 6e 20 62 65 20 61 6e 79 74 68 69  ze can be anythi
0900: 6e 67 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  ng between 512 a
0910: 6e 64 20 36 35 35 33 36 2e 0a 2a 2a 20 45 61 63  nd 65536..** Eac
0920: 68 20 70 61 67 65 20 63 61 6e 20 62 65 20 65 69  h page can be ei
0930: 74 68 65 72 20 61 20 62 74 72 65 65 20 70 61 67  ther a btree pag
0940: 65 2c 20 61 20 66 72 65 65 6c 69 73 74 20 70 61  e, a freelist pa
0950: 67 65 20 6f 72 20 61 6e 20 6f 76 65 72 66 6c 6f  ge or an overflo
0960: 77 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  w.** page..**.**
0970: 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20   The first page 
0980: 69 73 20 61 6c 77 61 79 73 20 61 20 62 74 72 65  is always a btre
0990: 65 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  e page.  The fir
09a0: 73 74 20 31 30 30 20 62 79 74 65 73 20 6f 66 20  st 100 bytes of 
09b0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61 67  the first.** pag
09c0: 65 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63  e contain a spec
09d0: 69 61 6c 20 68 65 61 64 65 72 20 28 74 68 65 20  ial header (the 
09e0: 22 66 69 6c 65 20 68 65 61 64 65 72 22 29 20 74  "file header") t
09f0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
0a00: 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 66  e file..** The f
0a10: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 66 69 6c  ormat of the fil
0a20: 65 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  e header is as f
0a30: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
0a40: 4f 46 46 53 45 54 20 20 20 53 49 5a 45 20 20 20  OFFSET   SIZE   
0a50: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
0a60: 20 20 20 20 20 30 20 20 20 20 20 20 31 36 20 20       0      16  
0a70: 20 20 20 48 65 61 64 65 72 20 73 74 72 69 6e 67     Header string
0a80: 3a 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74  : "SQLite format
0a90: 20 33 5c 30 30 30 22 0a 2a 2a 20 20 20 20 20 31   3\000".**     1
0aa0: 36 20 20 20 20 20 20 20 32 20 20 20 20 20 50 61  6       2     Pa
0ab0: 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ge size in bytes
0ac0: 2e 20 20 0a 2a 2a 20 20 20 20 20 31 38 20 20 20  .  .**     18   
0ad0: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0ae0: 6f 72 6d 61 74 20 77 72 69 74 65 20 76 65 72 73  ormat write vers
0af0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 31 39 20 20 20  ion.**     19   
0b00: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0b10: 6f 72 6d 61 74 20 72 65 61 64 20 76 65 72 73 69  ormat read versi
0b20: 6f 6e 0a 2a 2a 20 20 20 20 20 32 30 20 20 20 20  on.**     20    
0b30: 20 20 20 31 20 20 20 20 20 42 79 74 65 73 20 6f     1     Bytes o
0b40: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  f unused space a
0b50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
0b60: 68 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 32 31  h page.**     21
0b70: 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 61 78         1     Max
0b80: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
0b90: 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  d fraction.**   
0ba0: 20 20 32 32 20 20 20 20 20 20 20 31 20 20 20 20    22       1    
0bb0: 20 4d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   Min embedded pa
0bc0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0bd0: 2a 20 20 20 20 20 32 33 20 20 20 20 20 20 20 31  *     23       1
0be0: 20 20 20 20 20 4d 69 6e 20 6c 65 61 66 20 70 61       Min leaf pa
0bf0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0c00: 2a 20 20 20 20 20 32 34 20 20 20 20 20 20 20 34  *     24       4
0c10: 20 20 20 20 20 46 69 6c 65 20 63 68 61 6e 67 65       File change
0c20: 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 20 20 20 20   counter.**     
0c30: 32 38 20 20 20 20 20 20 20 34 20 20 20 20 20 52  28       4     R
0c40: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
0c50: 72 65 20 75 73 65 0a 2a 2a 20 20 20 20 20 33 32  re use.**     32
0c60: 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69 72         4     Fir
0c70: 73 74 20 66 72 65 65 6c 69 73 74 20 70 61 67 65  st freelist page
0c80: 0a 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20 20  .**     36      
0c90: 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66   4     Number of
0ca0: 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 20   freelist pages 
0cb0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
0cc0: 20 20 20 34 30 20 20 20 20 20 20 36 30 20 20 20     40      60   
0cd0: 20 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74 61    15 4-byte meta
0ce0: 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20 74   values passed t
0cf0: 6f 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 0a  o higher layers.
0d00: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
0d10: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
0d20: 61 72 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 28  are big-endian (
0d30: 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
0d40: 20 62 79 74 65 20 66 69 72 73 74 29 2e 0a 2a 2a   byte first)..**
0d50: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 63 68 61  .** The file cha
0d60: 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 69  nge counter is i
0d70: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20  ncremented when 
0d80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
0d90: 63 68 61 6e 67 65 64 20 6d 6f 72 65 0a 2a 2a 20  changed more.** 
0da0: 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
0db0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e 64   the same second
0dc0: 2e 20 20 54 68 69 73 20 63 6f 75 6e 74 65 72 2c  .  This counter,
0dd0: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
0de0: 68 65 0a 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  he.** modificati
0df0: 6f 6e 20 74 69 6d 65 20 6f 66 20 74 68 65 20 66  on time of the f
0e00: 69 6c 65 2c 20 61 6c 6c 6f 77 73 20 6f 74 68 65  ile, allows othe
0e10: 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 6b  r processes to k
0e20: 6e 6f 77 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  now.** when the 
0e30: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
0e40: 20 61 6e 64 20 74 68 75 73 20 77 68 65 6e 20 74   and thus when t
0e50: 68 65 79 20 6e 65 65 64 20 74 6f 20 66 6c 75 73  hey need to flus
0e60: 68 20 74 68 65 69 72 0a 2a 2a 20 63 61 63 68 65  h their.** cache
0e70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 20  ..**.** The max 
0e80: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
0e90: 20 66 72 61 63 74 69 6f 6e 20 69 73 20 74 68 65   fraction is the
0ea0: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74   amount of the t
0eb0: 6f 74 61 6c 20 75 73 61 62 6c 65 0a 2a 2a 20 73  otal usable.** s
0ec0: 70 61 63 65 20 69 6e 20 61 20 70 61 67 65 20 74  pace in a page t
0ed0: 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 73 75  hat can be consu
0ee0: 6d 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20  med by a single 
0ef0: 63 65 6c 6c 20 66 6f 72 20 73 74 61 6e 64 61 72  cell for standar
0f00: 64 0a 2a 2a 20 42 2d 74 72 65 65 20 28 6e 6f 6e  d.** B-tree (non
0f10: 2d 4c 45 41 46 44 41 54 41 29 20 74 61 62 6c 65  -LEAFDATA) table
0f20: 73 2e 20 20 41 20 76 61 6c 75 65 20 6f 66 20 32  s.  A value of 2
0f30: 35 35 20 6d 65 61 6e 73 20 31 30 30 25 2e 20 20  55 means 100%.  
0f40: 54 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 69  The default.** i
0f50: 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6d  s to limit the m
0f60: 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  aximum cell size
0f70: 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
0f80: 74 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66  t 4 cells will f
0f90: 69 74 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67  it.** on one pag
0fa0: 65 2e 20 20 54 68 75 73 20 74 68 65 20 64 65 66  e.  Thus the def
0fb0: 61 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64 65  ault max embedde
0fc0: 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  d payload fracti
0fd0: 6f 6e 20 69 73 20 36 34 2e 0a 2a 2a 0a 2a 2a 20  on is 64..**.** 
0fe0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66  If the payload f
0ff0: 6f 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61 72  or a cell is lar
1000: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ger than the max
1010: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20 65   payload, then e
1020: 78 74 72 61 0a 2a 2a 20 70 61 79 6c 6f 61 64 20  xtra.** payload 
1030: 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 6f 76  is spilled to ov
1040: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 4f  erflow pages.  O
1050: 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
1060: 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
1070: 64 2c 0a 2a 2a 20 61 73 20 6d 61 6e 79 20 62 79  d,.** as many by
1080: 74 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  tes as possible 
1090: 61 72 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  are moved into t
10a0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
10b0: 73 20 77 69 74 68 6f 75 74 20 6c 65 74 74 69 6e  s without lettin
10c0: 67 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 73 69  g.** the cell si
10d0: 7a 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 74 68  ze drop below th
10e0: 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70  e min embedded p
10f0: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 2e  ayload fraction.
1100: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 20 6c  .**.** The min l
1110: 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
1120: 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 74 68 65  tion is like the
1130: 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   min embedded pa
1140: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
1150: 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  * except that it
1160: 20 61 70 70 6c 69 65 73 20 74 6f 20 6c 65 61 66   applies to leaf
1170: 20 6e 6f 64 65 73 20 69 6e 20 61 20 4c 45 41 46   nodes in a LEAF
1180: 44 41 54 41 20 74 72 65 65 2e 20 20 54 68 65 20  DATA tree.  The 
1190: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 70 61 79 6c 6f  maximum.** paylo
11a0: 61 64 20 66 72 61 63 74 69 6f 6e 20 66 6f 72 20  ad fraction for 
11b0: 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
11c0: 69 73 20 61 6c 77 61 79 73 20 31 30 30 25 20 28  is always 100% (
11d0: 6f 72 20 32 35 35 29 20 61 6e 64 20 69 74 0a 2a  or 255) and it.*
11e0: 2a 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  * not specified 
11f0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1200: 2a 0a 2a 2a 20 45 61 63 68 20 62 74 72 65 65 20  *.** Each btree 
1210: 70 61 67 65 73 20 69 73 20 64 69 76 69 64 65 64  pages is divided
1220: 20 69 6e 74 6f 20 74 68 72 65 65 20 73 65 63 74   into three sect
1230: 69 6f 6e 73 3a 20 20 54 68 65 20 68 65 61 64 65  ions:  The heade
1240: 72 2c 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 20 70  r, the.** cell p
1250: 6f 69 6e 74 65 72 20 61 72 72 61 79 2c 20 61 6e  ointer array, an
1260: 64 20 74 68 65 20 63 65 6c 6c 20 61 72 65 61 20  d the cell area 
1270: 61 72 65 61 2e 20 20 50 61 67 65 20 31 20 61 6c  area.  Page 1 al
1280: 73 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79 74  so has a 100-byt
1290: 65 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72  e.** file header
12a0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 62 65 66   that occurs bef
12b0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 68 65 61  ore the page hea
12c0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  der..**.**      
12d0: 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |---------------
12e0: 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 66 69 6c  -|.**      | fil
12f0: 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20 20  e header    |   
1300: 31 30 30 20 62 79 74 65 73 2e 20 20 50 61 67 65  100 bytes.  Page
1310: 20 31 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 20   1 only..**     
1320: 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   |--------------
1330: 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 70 61  --|.**      | pa
1340: 67 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20  ge header    |  
1350: 20 38 20 62 79 74 65 73 20 66 6f 72 20 6c 65 61   8 bytes for lea
1360: 76 65 73 2e 20 20 31 32 20 62 79 74 65 73 20 66  ves.  12 bytes f
1370: 6f 72 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  or interior node
1380: 73 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d  s.**      |-----
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20  -----------|.** 
13a0: 20 20 20 20 20 7c 20 63 65 6c 6c 20 70 6f 69 6e       | cell poin
13b0: 74 65 72 20 20 20 7c 20 20 20 7c 20 20 32 20 62  ter   |   |  2 b
13c0: 79 74 65 73 20 70 65 72 20 63 65 6c 6c 2e 20 20  ytes per cell.  
13d0: 53 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2a  Sorted order..**
13e0: 20 20 20 20 20 20 7c 20 61 72 72 61 79 20 20 20        | array   
13f0: 20 20 20 20 20 20 20 7c 20 20 20 7c 20 20 47 72         |   |  Gr
1400: 6f 77 73 20 64 6f 77 6e 77 61 72 64 0a 2a 2a 20  ows downward.** 
1410: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1420: 20 20 20 20 20 20 7c 20 20 20 76 0a 2a 2a 20 20        |   v.**  
1430: 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      |-----------
1440: 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c  -----|.**      |
1450: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 20 20 20   unallocated    
1460: 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 73 70 61 63  |.**      | spac
1470: 65 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20  e          |.** 
1480: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
1490: 2d 2d 2d 2d 2d 2d 7c 20 20 20 5e 20 20 47 72 6f  ------|   ^  Gro
14a0: 77 73 20 75 70 77 61 72 64 73 0a 2a 2a 20 20 20  ws upwards.**   
14b0: 20 20 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65 6e     | cell conten
14c0: 74 20 20 20 7c 20 20 20 7c 20 20 41 72 62 69 74  t   |   |  Arbit
14d0: 72 61 72 79 20 6f 72 64 65 72 20 69 6e 74 65 72  rary order inter
14e0: 73 70 65 72 73 65 64 20 77 69 74 68 20 66 72 65  spersed with fre
14f0: 65 62 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 20  eblocks..**     
1500: 20 7c 20 61 72 65 61 20 20 20 20 20 20 20 20 20   | area         
1510: 20 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72 65    |   |  and fre
1520: 65 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e 74  e space fragment
1530: 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  s..**      |----
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
1550: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 68 65 61  .** The page hea
1560: 64 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  ders looks like 
1570: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 46  this:.**.**   OF
1580: 46 53 45 54 20 20 20 53 49 5a 45 20 20 20 20 20  FSET   SIZE     
1590: 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20  DESCRIPTION.**  
15a0: 20 20 20 20 30 20 20 20 20 20 20 20 31 20 20 20      0       1   
15b0: 20 20 20 46 6c 61 67 73 2e 20 31 3a 20 69 6e 74     Flags. 1: int
15c0: 6b 65 79 2c 20 32 3a 20 7a 65 72 6f 64 61 74 61  key, 2: zerodata
15d0: 2c 20 34 3a 20 6c 65 61 66 64 61 74 61 2c 20 38  , 4: leafdata, 8
15e0: 3a 20 6c 65 61 66 0a 2a 2a 20 20 20 20 20 20 31  : leaf.**      1
15f0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 62 79         2      by
1600: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  te offset to the
1610: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
1620: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
1630: 20 32 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f   2      number o
1640: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73 20  f cells on this 
1650: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 35 20 20  page.**      5  
1660: 20 20 20 20 20 32 20 20 20 20 20 20 66 69 72 73       2      firs
1670: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
1680: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  ll content area.
1690: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
16a0: 31 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66  1      number of
16b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 66 72 65 65   fragmented free
16c0: 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 38   bytes.**      8
16d0: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 52 69         4      Ri
16e0: 67 68 74 20 63 68 69 6c 64 20 28 74 68 65 20 50  ght child (the P
16f0: 74 72 28 4e 2b 31 29 20 76 61 6c 75 65 29 2e 20  tr(N+1) value). 
1700: 20 4f 6d 69 74 74 65 64 20 6f 6e 20 6c 65 61 76   Omitted on leav
1710: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  es..**.** The fl
1720: 61 67 73 20 64 65 66 69 6e 65 20 74 68 65 20 66  ags define the f
1730: 6f 72 6d 61 74 20 6f 66 20 74 68 69 73 20 62 74  ormat of this bt
1740: 72 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 6c  ree page.  The l
1750: 65 61 66 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  eaf flag means t
1760: 68 61 74 0a 2a 2a 20 74 68 69 73 20 70 61 67 65  hat.** this page
1770: 20 68 61 73 20 6e 6f 20 63 68 69 6c 64 72 65 6e   has no children
1780: 2e 20 20 54 68 65 20 7a 65 72 6f 64 61 74 61 20  .  The zerodata 
1790: 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
17a0: 74 68 69 73 20 70 61 67 65 20 63 61 72 72 69 65  this page carrie
17b0: 73 0a 2a 2a 20 6f 6e 6c 79 20 6b 65 79 73 20 61  s.** only keys a
17c0: 6e 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65  nd no data.  The
17d0: 20 69 6e 74 6b 65 79 20 66 6c 61 67 20 6d 65 61   intkey flag mea
17e0: 6e 73 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  ns that the key 
17f0: 69 73 20 61 20 69 6e 74 65 67 65 72 0a 2a 2a 20  is a integer.** 
1800: 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
1810: 69 6e 20 74 68 65 20 6b 65 79 20 73 69 7a 65 20  in the key size 
1820: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 63 65 6c  entry of the cel
1830: 6c 20 68 65 61 64 65 72 20 72 61 74 68 65 72 20  l header rather 
1840: 74 68 61 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 70  than in.** the p
1850: 61 79 6c 6f 61 64 20 61 72 65 61 2e 0a 2a 2a 0a  ayload area..**.
1860: 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e  ** The cell poin
1870: 74 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73  ter array begins
1880: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79   on the first by
1890: 74 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67  te after the pag
18a0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 65  e header..** The
18b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
18c0: 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  ray contains zer
18d0: 6f 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 65  o or more 2-byte
18e0: 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
18f0: 72 65 0a 2a 2a 20 6f 66 66 73 65 74 73 20 66 72  re.** offsets fr
1900: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
1910: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
1920: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1930: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
1940: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
1950: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73  he cell pointers
1960: 20 6f 63 63 75 72 20 69 6e 20 73 6f 72 74 65 64   occur in sorted
1970: 20 6f 72 64 65 72 2e 20 20 54 68 65 20 73 79 73   order.  The sys
1980: 74 65 6d 20 73 74 72 69 76 65 73 0a 2a 2a 20 74  tem strives.** t
1990: 6f 20 6b 65 65 70 20 66 72 65 65 20 73 70 61 63  o keep free spac
19a0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
19b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 73 6f   cell pointer so
19c0: 20 74 68 61 74 20 6e 65 77 20 63 65 6c 6c 73 20   that new cells 
19d0: 63 61 6e 0a 2a 2a 20 62 65 20 65 61 73 69 6c 79  can.** be easily
19e0: 20 61 64 64 65 64 20 77 69 74 68 6f 75 74 20 68   added without h
19f0: 61 76 69 6e 67 20 74 6f 20 64 65 66 72 61 67 6d  aving to defragm
1a00: 65 6e 74 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ent the page..**
1a10: 0a 2a 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74  .** Cell content
1a20: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
1a30: 65 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68  e very end of th
1a40: 65 20 70 61 67 65 20 61 6e 64 20 67 72 6f 77 73  e page and grows
1a50: 20 74 6f 77 61 72 64 20 74 68 65 0a 2a 2a 20 62   toward the.** b
1a60: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1a70: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 55 6e 75 73  page..**.** Unus
1a80: 65 64 20 73 70 61 63 65 20 77 69 74 68 69 6e 20  ed space within 
1a90: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1aa0: 20 61 72 65 61 20 69 73 20 63 6f 6c 6c 65 63 74   area is collect
1ab0: 65 64 20 69 6e 74 6f 20 61 20 6c 69 6e 6b 65 64  ed into a linked
1ac0: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 66 72 65 65   list of.** free
1ad0: 62 6c 6f 63 6b 73 2e 20 20 45 61 63 68 20 66 72  blocks.  Each fr
1ae0: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 6c 65  eeblock is at le
1af0: 61 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73  ast 4 bytes in s
1b00: 69 7a 65 2e 20 20 54 68 65 20 62 79 74 65 20 6f  ize.  The byte o
1b10: 66 66 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  ffset.** to the 
1b20: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
1b30: 69 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  is given in the 
1b40: 68 65 61 64 65 72 2e 20 20 46 72 65 65 62 6c 6f  header.  Freeblo
1b50: 63 6b 73 20 6f 63 63 75 72 20 69 6e 0a 2a 2a 20  cks occur in.** 
1b60: 69 6e 63 72 65 61 73 69 6e 67 20 6f 72 64 65 72  increasing order
1b70: 2e 20 20 42 65 63 61 75 73 65 20 61 20 66 72 65  .  Because a fre
1b80: 65 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61  eblock must be a
1b90: 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
1ba0: 69 6e 20 73 69 7a 65 2c 0a 2a 2a 20 61 6e 79 20  in size,.** any 
1bb0: 67 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65  group of 3 or fe
1bc0: 77 65 72 20 75 6e 75 73 65 64 20 62 79 74 65 73  wer unused bytes
1bd0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   in the cell con
1be0: 74 65 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74  tent area cannot
1bf0: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
1c00: 20 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e   freeblock chain
1c10: 2e 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20  .  A group of 3 
1c20: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79  or fewer free by
1c30: 74 65 73 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tes is called.**
1c40: 20 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68   a fragment.  Th
1c50: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1c60: 66 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66  f bytes in all f
1c70: 72 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f  ragments is reco
1c80: 72 64 65 64 2e 0a 2a 2a 20 69 6e 20 74 68 65 20  rded..** in the 
1c90: 70 61 67 65 20 68 65 61 64 65 72 20 61 74 20 6f  page header at o
1ca0: 66 66 73 65 74 20 37 2e 0a 2a 2a 0a 2a 2a 20 20  ffset 7..**.**  
1cb0: 20 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49    SIZE    DESCRI
1cc0: 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 32 20  PTION.**      2 
1cd0: 20 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20      Byte offset 
1ce0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
1cf0: 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 20 32 20  block.**      2 
1d00: 20 20 20 20 42 79 74 65 73 20 69 6e 20 74 68 69      Bytes in thi
1d10: 73 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a  s freeblock.**.*
1d20: 2a 20 43 65 6c 6c 73 20 61 72 65 20 6f 66 20 76  * Cells are of v
1d30: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 2e 20  ariable length. 
1d40: 20 43 65 6c 6c 73 20 61 72 65 20 73 74 6f 72 65   Cells are store
1d50: 64 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f  d in the cell co
1d60: 6e 74 65 6e 74 20 61 72 65 61 20 61 74 0a 2a 2a  ntent area at.**
1d70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d80: 70 61 67 65 2e 20 20 50 6f 69 6e 74 65 72 73 20  page.  Pointers 
1d90: 74 6f 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  to the cells are
1da0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   in the cell poi
1db0: 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 74 68  nter array.** th
1dc0: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
1dd0: 6f 6c 6c 6f 77 73 20 74 68 65 20 70 61 67 65 20  ollows the page 
1de0: 68 65 61 64 65 72 2e 20 20 43 65 6c 6c 73 20 69  header.  Cells i
1df0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1e00: 79 0a 2a 2a 20 63 6f 6e 74 69 67 75 6f 75 73 20  y.** contiguous 
1e10: 6f 72 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74  or in order, but
1e20: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
1e30: 72 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 6e  re contiguous an
1e40: 64 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a  d in order..**.*
1e50: 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d  * Cell content m
1e60: 61 6b 65 73 20 75 73 65 20 6f 66 20 76 61 72 69  akes use of vari
1e70: 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
1e80: 67 65 72 73 2e 20 20 41 20 76 61 72 69 61 62 6c  gers.  A variabl
1e90: 65 0a 2a 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65  e.** length inte
1ea0: 67 65 72 20 69 73 20 31 20 74 6f 20 39 20 62 79  ger is 1 to 9 by
1eb0: 74 65 73 20 77 68 65 72 65 20 74 68 65 20 6c 6f  tes where the lo
1ec0: 77 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61  wer 7 bits of ea
1ed0: 63 68 20 0a 2a 2a 20 62 79 74 65 20 61 72 65 20  ch .** byte are 
1ee0: 75 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67  used.  The integ
1ef0: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1f00: 6c 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61  ll bytes that ha
1f10: 76 65 20 62 69 74 20 38 20 73 65 74 20 61 6e 64  ve bit 8 set and
1f20: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
1f30: 74 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c  te with bit 8 cl
1f40: 65 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73  ear.  The most s
1f50: 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20  ignificant byte 
1f60: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
1f70: 2a 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e  * appears first.
1f80: 20 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e    A variable-len
1f90: 67 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20  gth integer may 
1fa0: 6e 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  not be more than
1fb0: 20 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a   9 bytes long..*
1fc0: 2a 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 63  * As a special c
1fd0: 61 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 73  ase, all 8 bytes
1fe0: 20 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 65   of the 9th byte
1ff0: 20 61 72 65 20 75 73 65 64 20 61 73 20 64 61 74   are used as dat
2000: 61 2e 20 20 54 68 69 73 0a 2a 2a 20 61 6c 6c 6f  a.  This.** allo
2010: 77 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ws a 64-bit inte
2020: 67 65 72 20 74 6f 20 62 65 20 65 6e 63 6f 64 65  ger to be encode
2030: 64 20 69 6e 20 39 20 62 79 74 65 73 2e 0a 2a 2a  d in 9 bytes..**
2040: 0a 2a 2a 20 20 20 20 30 78 30 30 20 20 20 20 20  .**    0x00     
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2070: 30 30 30 30 0a 2a 2a 20 20 20 20 30 78 37 66 20  0000.**    0x7f 
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78       becomes  0x
20a0: 30 30 30 30 30 30 37 66 0a 2a 2a 20 20 20 20 30  0000007f.**    0
20b0: 78 38 31 20 30 78 30 30 20 20 20 20 20 20 20 20  x81 0x00        
20c0: 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73           becomes
20d0: 20 20 30 78 30 30 30 30 30 30 38 30 0a 2a 2a 20    0x00000080.** 
20e0: 20 20 20 30 78 38 32 20 30 78 30 30 20 20 20 20     0x82 0x00    
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63               bec
2100: 6f 6d 65 73 20 20 30 78 30 30 30 30 30 31 30 30  omes  0x00000100
2110: 0a 2a 2a 20 20 20 20 30 78 38 30 20 30 78 37 66  .**    0x80 0x7f
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2140: 30 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 61 20  007f.**    0x8a 
2150: 30 78 39 31 20 30 78 64 31 20 30 78 61 63 20 30  0x91 0xd1 0xac 0
2160: 78 37 38 20 20 62 65 63 6f 6d 65 73 20 20 30 78  x78  becomes  0x
2170: 31 32 33 34 35 36 37 38 0a 2a 2a 20 20 20 20 30  12345678.**    0
2180: 78 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78  x81 0x81 0x81 0x
2190: 38 31 20 30 78 30 31 20 20 62 65 63 6f 6d 65 73  81 0x01  becomes
21a0: 20 20 30 78 31 30 32 30 34 30 38 31 0a 2a 2a 0a    0x10204081.**.
21b0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 6c 65 6e 67  ** Variable leng
21c0: 74 68 20 69 6e 74 65 67 65 72 73 20 61 72 65 20  th integers are 
21d0: 75 73 65 64 20 66 6f 72 20 72 6f 77 69 64 73 20  used for rowids 
21e0: 61 6e 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  and to hold the 
21f0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74  number of.** byt
2200: 65 73 20 6f 66 20 6b 65 79 20 61 6e 64 20 64 61  es of key and da
2210: 74 61 20 69 6e 20 61 20 62 74 72 65 65 20 63 65  ta in a btree ce
2220: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ll..**.** The co
2230: 6e 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20  ntent of a cell 
2240: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
2250: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
2260: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
2270: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
2280: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
2290: 65 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 74 74  eft child. Omitt
22a0: 65 64 20 69 66 20 6c 65 61 66 20 66 6c 61 67 20  ed if leaf flag 
22b0: 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20 20 76  is set..**     v
22c0: 61 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  ar    Number of 
22d0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 4f  bytes of data. O
22e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 7a 65  mitted if the ze
22f0: 72 6f 64 61 74 61 20 66 6c 61 67 20 69 73 20 73  rodata flag is s
2300: 65 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20  et..**     var  
2310: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
2320: 73 20 6f 66 20 6b 65 79 2e 20 4f 72 20 74 68 65  s of key. Or the
2330: 20 6b 65 79 20 69 74 73 65 6c 66 20 69 66 20 69   key itself if i
2340: 6e 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65  ntkey flag is se
2350: 74 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20  t..**      *    
2360: 20 50 61 79 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   Payload.**     
2370: 20 34 20 20 20 20 20 46 69 72 73 74 20 70 61 67   4     First pag
2380: 65 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  e of the overflo
2390: 77 20 63 68 61 69 6e 2e 20 20 4f 6d 69 74 74 65  w chain.  Omitte
23a0: 64 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  d if no overflow
23b0: 0a 2a 2a 0a 2a 2a 20 4f 76 65 72 66 6c 6f 77 20  .**.** Overflow 
23c0: 70 61 67 65 73 20 66 6f 72 6d 20 61 20 6c 69 6e  pages form a lin
23d0: 6b 65 64 20 6c 69 73 74 2e 20 20 45 61 63 68 20  ked list.  Each 
23e0: 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
23f0: 6c 61 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65  last is complete
2400: 6c 79 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74  ly.** filled wit
2410: 68 20 64 61 74 61 20 28 70 61 67 65 73 69 7a 65  h data (pagesize
2420: 20 2d 20 34 20 62 79 74 65 73 29 2e 20 20 54 68   - 4 bytes).  Th
2430: 65 20 6c 61 73 74 20 70 61 67 65 20 63 61 6e 20  e last page can 
2440: 68 61 76 65 20 61 73 20 6c 69 74 74 6c 65 0a 2a  have as little.*
2450: 2a 20 61 73 20 31 20 62 79 74 65 20 6f 66 20 64  * as 1 byte of d
2460: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49  ata..**.**    SI
2470: 5a 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f  ZE    DESCRIPTIO
2480: 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  N.**      4     
2490: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e  Page number of n
24a0: 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24b0: 65 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20  e.**      *     
24c0: 44 61 74 61 0a 2a 2a 0a 2a 2a 20 46 72 65 65 6c  Data.**.** Freel
24d0: 69 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69  ist pages come i
24e0: 6e 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20  n two subtypes: 
24f0: 74 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20  trunk pages and 
2500: 6c 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65  leaf pages.  The
2510: 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20  .** file header 
2520: 70 6f 69 6e 74 73 20 74 6f 20 66 69 72 73 74 20  points to first 
2530: 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
2540: 20 6f 66 20 74 72 75 6e 6b 20 70 61 67 65 2e 20   of trunk page. 
2550: 20 45 61 63 68 20 74 72 75 6e 6b 0a 2a 2a 20 70   Each trunk.** p
2560: 61 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 6d 75  age points to mu
2570: 6c 74 69 70 6c 65 20 6c 65 61 66 20 70 61 67 65  ltiple leaf page
2580: 73 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  s.  The content 
2590: 6f 66 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  of a leaf page i
25a0: 73 0a 2a 2a 20 75 6e 73 70 65 63 69 66 69 65 64  s.** unspecified
25b0: 2e 20 20 41 20 74 72 75 6e 6b 20 70 61 67 65 20  .  A trunk page 
25c0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
25d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
25e0: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
25f0: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
2600: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20   number of next 
2610: 74 72 75 6e 6b 20 70 61 67 65 0a 2a 2a 20 20 20  trunk page.**   
2620: 20 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20     4     Number 
2630: 6f 66 20 6c 65 61 66 20 70 6f 69 6e 74 65 72 73  of leaf pointers
2640: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a   on this page.**
2650: 20 20 20 20 20 20 2a 20 20 20 20 20 7a 65 72 6f        *     zero
2660: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 6e   or more pages n
2670: 75 6d 62 65 72 73 20 6f 66 20 6c 65 61 76 65 73  umbers of leaves
2680: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
2690: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
26a0: 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69  ude "pager.h".#i
26b0: 6e 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68 22  nclude "btree.h"
26c0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
26d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
26e0: 74 2e 68 3e 0a 0a 2f 2a 20 52 6f 75 6e 64 20 75  t.h>../* Round u
26f0: 70 20 61 20 6e 75 6d 62 65 72 20 74 6f 20 74 68  p a number to th
2700: 65 20 6e 65 78 74 20 6c 61 72 67 65 72 20 6d 75  e next larger mu
2710: 6c 74 69 70 6c 65 20 6f 66 20 38 2e 20 20 54 68  ltiple of 8.  Th
2720: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
2730: 20 66 6f 72 63 65 20 38 2d 62 79 74 65 20 61 6c   force 8-byte al
2740: 69 67 6e 6d 65 6e 74 20 6f 6e 20 36 34 2d 62 69  ignment on 64-bi
2750: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  t architectures.
2760: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e  .*/.#define ROUN
2770: 44 38 28 78 29 20 20 20 28 28 78 2b 37 29 26 7e  D8(x)   ((x+7)&~
2780: 37 29 0a 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  7).../* The foll
2790: 6f 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 74  owing value is t
27a0: 68 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20  he maximum cell 
27b0: 73 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 20  size assuming a 
27c0: 6d 61 78 69 6d 75 6d 20 70 61 67 65 0a 2a 2a 20  maximum page.** 
27d0: 73 69 7a 65 20 67 69 76 65 20 61 62 6f 76 65 2e  size give above.
27e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
27f0: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 20 28  ELL_SIZE(pBt)  (
2800: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29  pBt->pageSize-8)
2810: 0a 0a 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  ../* The maximum
2820: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2830: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
2840: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2850: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 61 73 73 75  e.  This.** assu
2860: 6d 65 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65  mes a minimum ce
2870: 6c 6c 20 73 69 7a 65 20 6f 66 20 33 20 62 79 74  ll size of 3 byt
2880: 65 73 2e 20 20 53 75 63 68 20 73 6d 61 6c 6c 20  es.  Such small 
2890: 63 65 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  cells will be.**
28a0: 20 65 78 63 65 65 64 69 6e 67 6c 79 20 72 61 72   exceedingly rar
28b0: 65 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20  e, but they are 
28c0: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 64 65  possible..*/.#de
28d0: 66 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 42 74  fine MX_CELL(pBt
28e0: 29 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  ) ((pBt->pageSiz
28f0: 65 2d 38 29 2f 33 29 0a 0a 2f 2a 20 46 6f 72 77  e-8)/3)../* Forw
2900: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
2910: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2920: 63 74 20 4d 65 6d 50 61 67 65 20 4d 65 6d 50 61  ct MemPage MemPa
2930: 67 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ge;.typedef stru
2940: 63 74 20 42 74 4c 6f 63 6b 20 42 74 4c 6f 63 6b  ct BtLock BtLock
2950: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
2960: 20 61 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20   a magic string 
2970: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
2980: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2990: 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69 74 65   every.** SQLite
29a0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64   database in ord
29b0: 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  er to identify t
29c0: 68 65 20 66 69 6c 65 20 61 73 20 61 20 72 65 61  he file as a rea
29d0: 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  l database..**.*
29e0: 2a 20 59 6f 75 20 63 61 6e 20 63 68 61 6e 67 65  * You can change
29f0: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 63   this value at c
2a00: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 73  ompile-time by s
2a10: 70 65 63 69 66 79 69 6e 67 20 61 0a 2a 2a 20 2d  pecifying a.** -
2a20: 44 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41  DSQLITE_FILE_HEA
2a30: 44 45 52 3d 22 2e 2e 2e 22 20 6f 6e 20 74 68 65  DER="..." on the
2a40: 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e   compiler comman
2a50: 64 2d 6c 69 6e 65 2e 20 20 54 68 65 0a 2a 2a 20  d-line.  The.** 
2a60: 68 65 61 64 65 72 20 6d 75 73 74 20 62 65 20 65  header must be e
2a70: 78 61 63 74 6c 79 20 31 36 20 62 79 74 65 73 20  xactly 16 bytes 
2a80: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 7a 65  including the ze
2a90: 72 6f 2d 74 65 72 6d 69 6e 61 74 6f 72 20 73 6f  ro-terminator so
2aa0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
2ab0: 74 73 65 6c 66 20 73 68 6f 75 6c 64 20 62 65 20  tself should be 
2ac0: 31 35 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  15 characters lo
2ad0: 6e 67 2e 20 20 49 66 20 79 6f 75 20 63 68 61 6e  ng.  If you chan
2ae0: 67 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  ge.** the header
2af0: 2c 20 74 68 65 6e 20 79 6f 75 72 20 63 75 73 74  , then your cust
2b00: 6f 6d 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20  om library will 
2b10: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72  not be able to r
2b20: 65 61 64 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  ead .** database
2b30: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
2b40: 68 65 20 73 74 61 6e 64 61 72 64 20 74 6f 6f 6c  he standard tool
2b50: 73 20 61 6e 64 20 74 68 65 20 73 74 61 6e 64 61  s and the standa
2b60: 72 64 20 74 6f 6f 6c 73 0a 2a 2a 20 77 69 6c 6c  rd tools.** will
2b70: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
2b80: 72 65 61 64 20 64 61 74 61 62 61 73 65 73 20 63  read databases c
2b90: 72 65 61 74 65 64 20 62 79 20 79 6f 75 72 20 63  reated by your c
2ba0: 75 73 74 6f 6d 20 6c 69 62 72 61 72 79 2e 0a 2a  ustom library..*
2bb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2bc0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 20 2f 2a 20  _FILE_HEADER /* 
2bd0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
2be0: 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 53 51   */.#  define SQ
2bf0: 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  LITE_FILE_HEADER
2c00: 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20   "SQLite format 
2c10: 33 22 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  3".#endif.static
2c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67   const char zMag
2c30: 69 63 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c  icHeader[] = SQL
2c40: 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b  ITE_FILE_HEADER;
2c50: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 74 79 70  ../*.** Page typ
2c60: 65 20 66 6c 61 67 73 2e 20 20 41 6e 20 4f 52 65  e flags.  An ORe
2c70: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
2c80: 20 74 68 65 73 65 20 66 6c 61 67 73 20 61 70 70   these flags app
2c90: 65 61 72 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  ear as the.** fi
2ca0: 72 73 74 20 62 79 74 65 20 6f 66 20 65 76 65 72  rst byte of ever
2cb0: 79 20 42 54 72 65 65 20 70 61 67 65 2e 0a 2a 2f  y BTree page..*/
2cc0: 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 49 4e 54  .#define PTF_INT
2cd0: 4b 45 59 20 20 20 20 30 78 30 31 0a 23 64 65 66  KEY    0x01.#def
2ce0: 69 6e 65 20 50 54 46 5f 5a 45 52 4f 44 41 54 41  ine PTF_ZERODATA
2cf0: 20 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 50    0x02.#define P
2d00: 54 46 5f 4c 45 41 46 44 41 54 41 20 20 30 78 30  TF_LEAFDATA  0x0
2d10: 34 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45  4.#define PTF_LE
2d20: 41 46 20 20 20 20 20 20 30 78 30 38 0a 0a 2f 2a  AF      0x08../*
2d30: 0a 2a 2a 20 41 73 20 65 61 63 68 20 70 61 67 65  .** As each page
2d40: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
2d50: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
2d60: 72 79 2c 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ry, an instance 
2d70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2d80: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
2d90: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 69 6e   appended and in
2da0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
2db0: 6f 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  o.  This structu
2dc0: 72 65 20 73 74 6f 72 65 73 0a 2a 2a 20 69 6e 66  re stores.** inf
2dd0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
2de0: 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20  he page that is 
2df0: 64 65 63 6f 64 65 64 20 66 72 6f 6d 20 74 68 65  decoded from the
2e00: 20 72 61 77 20 66 69 6c 65 20 70 61 67 65 2e 0a   raw file page..
2e10: 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
2e20: 74 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 62  t field points b
2e30: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2e40: 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 61 6c  t page.  This al
2e50: 6c 6f 77 73 20 75 73 20 74 6f 0a 2a 2a 20 77 61  lows us to.** wa
2e60: 6c 6b 20 75 70 20 74 68 65 20 42 54 72 65 65 20  lk up the BTree 
2e70: 66 72 6f 6d 20 61 6e 79 20 6c 65 61 66 20 74 6f  from any leaf to
2e80: 20 74 68 65 20 72 6f 6f 74 2e 20 20 43 61 72 65   the root.  Care
2e90: 20 6d 75 73 74 20 62 65 20 74 61 6b 65 6e 20 74   must be taken t
2ea0: 6f 0a 2a 2a 20 75 6e 72 65 66 28 29 20 74 68 65  o.** unref() the
2eb0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 70 6f 69   parent page poi
2ec0: 6e 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 70  nter when this p
2ed0: 61 67 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  age is no longer
2ee0: 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20   referenced..** 
2ef0: 54 68 65 20 70 61 67 65 44 65 73 74 72 75 63 74  The pageDestruct
2f00: 6f 72 28 29 20 72 6f 75 74 69 6e 65 20 68 61 6e  or() routine han
2f10: 64 6c 65 73 20 74 68 61 74 20 63 68 6f 72 65 2e  dles that chore.
2f20: 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 50 61  .*/.struct MemPa
2f30: 67 65 20 7b 0a 20 20 75 38 20 69 73 49 6e 69 74  ge {.  u8 isInit
2f40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2f50: 72 75 65 20 69 66 20 70 72 65 76 69 6f 75 73 6c  rue if previousl
2f60: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 4d  y initialized. M
2f70: 55 53 54 20 42 45 20 46 49 52 53 54 21 20 2a 2f  UST BE FIRST! */
2f80: 0a 20 20 75 38 20 69 64 78 53 68 69 66 74 3b 20  .  u8 idxShift; 
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fa0: 69 66 20 43 65 6c 6c 20 69 6e 64 69 63 65 73 20  if Cell indices 
2fb0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2fc0: 20 20 75 38 20 6e 4f 76 65 72 66 6c 6f 77 3b 20    u8 nOverflow; 
2fd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2fe0: 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   of overflow cel
2ff0: 6c 20 62 6f 64 69 65 73 20 69 6e 20 61 43 65 6c  l bodies in aCel
3000: 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 6e 74 4b  l[] */.  u8 intK
3010: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey;           /*
3020: 20 54 72 75 65 20 69 66 20 69 6e 74 6b 65 79 20   True if intkey 
3030: 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 20  flag is set */. 
3040: 20 75 38 20 6c 65 61 66 3b 20 20 20 20 20 20 20   u8 leaf;       
3050: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3060: 20 6c 65 61 66 20 66 6c 61 67 20 69 73 20 73 65   leaf flag is se
3070: 74 20 2a 2f 0a 20 20 75 38 20 7a 65 72 6f 44 61  t */.  u8 zeroDa
3080: 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
3090: 72 75 65 20 69 66 20 74 61 62 6c 65 20 73 74 6f  rue if table sto
30a0: 72 65 73 20 6b 65 79 73 20 6f 6e 6c 79 20 2a 2f  res keys only */
30b0: 0a 20 20 75 38 20 6c 65 61 66 44 61 74 61 3b 20  .  u8 leafData; 
30c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30d0: 69 66 20 74 61 62 6c 65 73 20 73 74 6f 72 65 73  if tables stores
30e0: 20 64 61 74 61 20 6f 6e 20 6c 65 61 76 65 73 20   data on leaves 
30f0: 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 68 61 73  only */.  u8 has
3100: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  Data;          /
3110: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 70  * True if this p
3120: 61 67 65 20 73 74 6f 72 65 73 20 64 61 74 61 20  age stores data 
3130: 2a 2f 0a 20 20 75 38 20 68 64 72 4f 66 66 73 65  */.  u8 hdrOffse
3140: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 30 30  t;        /* 100
3150: 20 66 6f 72 20 70 61 67 65 20 31 2e 20 20 30 20   for page 1.  0 
3160: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
3170: 38 20 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  8 childPtrSize; 
3180: 20 20 20 20 2f 2a 20 30 20 69 66 20 6c 65 61 66      /* 0 if leaf
3190: 3d 3d 31 2e 20 20 34 20 69 66 20 6c 65 61 66 3d  ==1.  4 if leaf=
31a0: 3d 30 20 2a 2f 0a 20 20 75 31 36 20 6d 61 78 4c  =0 */.  u16 maxL
31b0: 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  ocal;        /* 
31c0: 43 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 61  Copy of Btree.ma
31d0: 78 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e  xLocal or Btree.
31e0: 6d 61 78 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36  maxLeaf */.  u16
31f0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20   minLocal;      
3200: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42 74 72    /* Copy of Btr
3210: 65 65 2e 6d 69 6e 4c 6f 63 61 6c 20 6f 72 20 42  ee.minLocal or B
3220: 74 72 65 65 2e 6d 69 6e 4c 65 61 66 20 2a 2f 0a  tree.minLeaf */.
3230: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
3240: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  ;      /* Index 
3250: 69 6e 20 61 44 61 74 61 20 6f 66 20 66 69 72 73  in aData of firs
3260: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
3270: 2f 0a 20 20 75 31 36 20 69 64 78 50 61 72 65 6e  /.  u16 idxParen
3280: 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  t;       /* Inde
3290: 78 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 74  x in parent of t
32a0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 31  his node */.  u1
32b0: 36 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  6 nFree;        
32c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32d0: 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68  free bytes on th
32e0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20  e page */.  u16 
32f0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
3300: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
3310: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  lls on this page
3320: 2c 20 6c 6f 63 61 6c 20 61 6e 64 20 6f 76 66 6c  , local and ovfl
3330: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 5f 4f 76   */.  struct _Ov
3340: 66 6c 43 65 6c 6c 20 7b 20 20 20 2f 2a 20 43 65  flCell {   /* Ce
3350: 6c 6c 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  lls that will no
3360: 74 20 66 69 74 20 6f 6e 20 61 44 61 74 61 5b 5d  t fit on aData[]
3370: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 43 65 6c   */.    u8 *pCel
3380: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  l;          /* P
3390: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 62  ointers to the b
33a0: 6f 64 79 20 6f 66 20 74 68 65 20 6f 76 65 72 66  ody of the overf
33b0: 6c 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  low cell */.    
33c0: 75 31 36 20 69 64 78 3b 20 20 20 20 20 20 20 20  u16 idx;        
33d0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
33e0: 69 73 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 69  is cell before i
33f0: 64 78 2d 74 68 20 6e 6f 6e 2d 6f 76 65 72 66 6c  dx-th non-overfl
3400: 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 7d 20 61  ow cell */.  } a
3410: 4f 76 66 6c 5b 35 5d 3b 0a 20 20 42 74 53 68 61  Ovfl[5];.  BtSha
3420: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
3430: 2f 2a 20 50 6f 69 6e 74 65 72 20 62 61 63 6b 20  /* Pointer back 
3440: 74 6f 20 42 54 72 65 65 20 73 74 72 75 63 74 75  to BTree structu
3450: 72 65 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  re */.  u8 *aDat
3460: 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
3470: 50 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20  Pointer back to 
3480: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
3490: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
34a0: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
34b0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
34c0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
34d0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
34e0: 6e 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61  nt;    /* The pa
34f0: 72 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  rent of this pag
3500: 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f  e.  NULL for roo
3510: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  t */.};../*.** T
3520: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61  he in-memory ima
3530: 67 65 20 6f 66 20 61 20 64 69 73 6b 20 70 61 67  ge of a disk pag
3540: 65 20 68 61 73 20 74 68 65 20 61 75 78 69 6c 69  e has the auxili
3550: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
3560: 61 70 70 65 6e 64 65 64 0a 2a 2a 20 74 6f 20 74  appended.** to t
3570: 68 65 20 65 6e 64 2e 20 20 45 58 54 52 41 5f 53  he end.  EXTRA_S
3580: 49 5a 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65  IZE is the numbe
3590: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
35a0: 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ace needed to ho
35b0: 6c 64 0a 2a 2a 20 74 68 61 74 20 65 78 74 72 61  ld.** that extra
35c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
35d0: 0a 23 64 65 66 69 6e 65 20 45 58 54 52 41 5f 53  .#define EXTRA_S
35e0: 49 5a 45 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  IZE sizeof(MemPa
35f0: 67 65 29 0a 0a 2f 2a 20 42 74 72 65 65 20 68 61  ge)../* Btree ha
3600: 6e 64 6c 65 20 2a 2f 0a 73 74 72 75 63 74 20 42  ndle */.struct B
3610: 74 72 65 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tree {.  sqlite3
3620: 20 2a 70 53 71 6c 69 74 65 3b 0a 20 20 42 74 53   *pSqlite;.  BtS
3630: 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 75 38  hared *pBt;.  u8
3640: 20 69 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20   inTrans;       
3650: 20 20 20 20 20 2f 2a 20 54 52 41 4e 53 5f 4e 4f       /* TRANS_NO
3660: 4e 45 2c 20 54 52 41 4e 53 5f 52 45 41 44 20 6f  NE, TRANS_READ o
3670: 72 20 54 52 41 4e 53 5f 57 52 49 54 45 20 2a 2f  r TRANS_WRITE */
3680: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 74 72 65 65  .};../*.** Btree
3690: 2e 69 6e 54 72 61 6e 73 20 6d 61 79 20 74 61 6b  .inTrans may tak
36a0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  e one of the fol
36b0: 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a  lowing values..*
36c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
36d0: 65 64 2d 64 61 74 61 20 65 78 74 65 6e 73 69 6f  ed-data extensio
36e0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
36f0: 65 72 65 20 6d 61 79 20 62 65 20 6d 75 6c 74 69  ere may be multi
3700: 70 6c 65 20 75 73 65 72 73 0a 2a 2a 20 6f 66 20  ple users.** of 
3710: 74 68 65 20 42 74 72 65 65 20 73 74 72 75 63 74  the Btree struct
3720: 75 72 65 2e 20 41 74 20 6d 6f 73 74 20 6f 6e 65  ure. At most one
3730: 20 6f 66 20 74 68 65 73 65 20 6d 61 79 20 6f 70   of these may op
3740: 65 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  en a write trans
3750: 61 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 61  action,.** but a
3760: 6e 79 20 6e 75 6d 62 65 72 20 6d 61 79 20 68 61  ny number may ha
3770: 76 65 20 61 63 74 69 76 65 20 72 65 61 64 20 74  ve active read t
3780: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 56 61 72  ransactions. Var
3790: 69 61 62 6c 65 20 42 74 72 65 65 2e 70 44 62 20  iable Btree.pDb 
37a0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
37b0: 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
37c0: 6e 73 20 61 6e 79 20 63 75 72 72 65 6e 74 20 77  ns any current w
37d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 52 41  ..*/.#define TRA
37f0: 4e 53 5f 4e 4f 4e 45 20 20 30 0a 23 64 65 66 69  NS_NONE  0.#defi
3800: 6e 65 20 54 52 41 4e 53 5f 52 45 41 44 20 20 31  ne TRANS_READ  1
3810: 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 57  .#define TRANS_W
3820: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 45 76  RITE 2../*.** Ev
3830: 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64  erything we need
3840: 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 20 61   to know about a
3850: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  n open database.
3860: 2a 2f 0a 73 74 72 75 63 74 20 42 74 53 68 61 72  */.struct BtShar
3870: 65 64 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ed {.  Pager *pP
3880: 61 67 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ager;        /* 
3890: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 2a  The page cache *
38a0: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
38b0: 75 72 73 6f 72 3b 20 20 20 20 2f 2a 20 41 20 6c  ursor;    /* A l
38c0: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
38d0: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 4d 65 6d  cursors */.  Mem
38e0: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
38f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
3900: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3910: 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b   */.  u8 inStmt;
3920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3930: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 69 6e  rue if we are in
3940: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3950: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3960: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
3970: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3980: 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
3990: 20 66 69 6c 65 20 69 73 20 72 65 61 64 6f 6e 6c   file is readonl
39a0: 79 20 2a 2f 0a 20 20 75 38 20 6d 61 78 45 6d 62  y */.  u8 maxEmb
39b0: 65 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20  edFrac;      /* 
39c0: 4d 61 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20  Maximum payload 
39d0: 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61  as % of total pa
39e0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20  ge size */.  u8 
39f0: 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 20 20 20  minEmbedFrac;   
3a00: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 70 61     /* Minimum pa
3a10: 79 6c 6f 61 64 20 61 73 20 25 20 6f 66 20 74 6f  yload as % of to
3a20: 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tal page size */
3a30: 0a 20 20 75 38 20 6d 69 6e 4c 65 61 66 46 72 61  .  u8 minLeafFra
3a40: 63 3b 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  c;       /* Mini
3a50: 6d 75 6d 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  mum leaf payload
3a60: 20 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70   as % of total p
3a70: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38  age size */.  u8
3a80: 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 3b 20   pageSizeFixed; 
3a90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3aa0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 6e  he page size can
3ab0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
3ac0: 61 6e 67 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  anged */.#ifndef
3ad0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3ae0: 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 61 75 74  OVACUUM.  u8 aut
3af0: 6f 56 61 63 75 75 6d 3b 20 20 20 20 20 20 20 20  oVacuum;        
3b00: 2f 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62  /* True if datab
3b10: 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
3b20: 6f 2d 76 61 63 75 75 6d 20 2a 2f 0a 23 65 6e 64  o-vacuum */.#end
3b30: 69 66 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  if.  u16 pageSiz
3b40: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  e;         /* To
3b50: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
3b60: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
3b70: 0a 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a  .  u16 usableSiz
3b80: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  e;       /* Numb
3b90: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
3ba0: 65 73 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  es on each page 
3bb0: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
3bc0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  l;         /* Ma
3bd0: 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c  ximum local payl
3be0: 6f 61 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46 44  oad in non-LEAFD
3bf0: 41 54 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ATA tables */.  
3c00: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20  int minLocal;   
3c10: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
3c20: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3c30: 6e 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74  n non-LEAFDATA t
3c40: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  ables */.  int m
3c50: 61 78 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  axLeaf;         
3c60: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61   /* Maximum loca
3c70: 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c  l payload in a L
3c80: 45 41 46 44 41 54 41 20 74 61 62 6c 65 20 2a 2f  EAFDATA table */
3c90: 0a 20 20 69 6e 74 20 6d 69 6e 4c 65 61 66 3b 20  .  int minLeaf; 
3ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
3cb0: 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  mum local payloa
3cc0: 64 20 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20  d in a LEAFDATA 
3cd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 42 75 73 79 48  table */.  BusyH
3ce0: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
3cf0: 64 6c 65 72 3b 20 20 20 2f 2a 20 43 61 6c 6c 62  dler;   /* Callb
3d00: 61 63 6b 20 66 6f 72 20 77 68 65 6e 20 74 68 65  ack for when the
3d10: 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
3d20: 6e 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 6e  ntion */.  u8 in
3d30: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20  Transaction;    
3d40: 20 2f 2a 20 54 72 61 6e 73 61 63 74 69 6f 6e 20   /* Transaction 
3d50: 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  state */.  int n
3d60: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
3d70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3d80: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
3d90: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3da0: 69 6e 74 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  int nTransaction
3db0: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3dc0: 6f 66 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  of open transact
3dd0: 69 6f 6e 73 20 28 72 65 61 64 20 2b 20 77 72 69  ions (read + wri
3de0: 74 65 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  te) */.  void *p
3df0: 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20 20 2f  Schema;        /
3e00: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 70 61  * Pointer to spa
3e10: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ce allocated by 
3e20: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
3e30: 6d 61 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  ma() */.  void (
3e40: 2a 78 46 72 65 65 53 63 68 65 6d 61 29 28 76 6f  *xFreeSchema)(vo
3e50: 69 64 2a 29 3b 20 20 2f 2a 20 44 65 73 74 72 75  id*);  /* Destru
3e60: 63 74 6f 72 20 66 6f 72 20 42 74 53 68 61 72 65  ctor for BtShare
3e70: 64 2e 70 53 63 68 65 6d 61 20 2a 2f 0a 23 69 66  d.pSchema */.#if
3e80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e90: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
3ea0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 20 20  BtLock *pLock;  
3eb0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3ec0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 6f 6e 20 74   locks held on t
3ed0: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
3ee0: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 42 74 53   struct */.  BtS
3ef0: 68 61 72 65 64 20 2a 70 4e 65 78 74 3b 20 20 20  hared *pNext;   
3f00: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 54 68     /* Next in Th
3f10: 72 65 61 64 44 61 74 61 2e 70 42 74 72 65 65 20  readData.pBtree 
3f20: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 23  linked list */.#
3f30: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
3f40: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3f50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3f60: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
3f70: 6f 20 68 6f 6c 64 20 69 6e 66 6f 72 6d 61 74 69  o hold informati
3f80: 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 61 20 63 65  on.** about a ce
3f90: 6c 6c 2e 20 20 54 68 65 20 70 61 72 73 65 43 65  ll.  The parseCe
3fa0: 6c 6c 50 74 72 28 29 20 66 75 6e 63 74 69 6f 6e  llPtr() function
3fb0: 20 66 69 6c 6c 73 20 69 6e 20 74 68 69 73 20 73   fills in this s
3fc0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 61 73 65  tructure.** base
3fd0: 64 20 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  d on information
3fe0: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 74 68   extract from th
3ff0: 65 20 72 61 77 20 64 69 73 6b 20 70 61 67 65 2e  e raw disk page.
4000: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
4010: 63 74 20 43 65 6c 6c 49 6e 66 6f 20 43 65 6c 6c  ct CellInfo Cell
4020: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 43 65 6c  Info;.struct Cel
4030: 6c 49 6e 66 6f 20 7b 0a 20 20 75 38 20 2a 70 43  lInfo {.  u8 *pC
4040: 65 6c 6c 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ell;     /* Poin
4050: 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ter to the start
4060: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
4070: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 3b 20   */.  i64 nKey; 
4080: 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
4090: 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  for INTKEY table
40a0: 73 2c 20 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  s, or number of 
40b0: 62 79 74 65 73 20 69 6e 20 6b 65 79 20 2a 2f 0a  bytes in key */.
40c0: 20 20 75 33 32 20 6e 44 61 74 61 3b 20 20 20 20    u32 nData;    
40d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
40e0: 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  tes of data */. 
40f0: 20 75 31 36 20 6e 48 65 61 64 65 72 3b 20 20 20   u16 nHeader;   
4100: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63  /* Size of the c
4110: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
4120: 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
4130: 20 75 31 36 20 6e 4c 6f 63 61 6c 3b 20 20 20 20   u16 nLocal;    
4140: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 70 61 79  /* Amount of pay
4150: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
4160: 79 20 2a 2f 0a 20 20 75 31 36 20 69 4f 76 65 72  y */.  u16 iOver
4170: 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66 73 65 74 20  flow; /* Offset 
4180: 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
4190: 20 6e 75 6d 62 65 72 2e 20 20 5a 65 72 6f 20 69   number.  Zero i
41a0: 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 2a 2f  f no overflow */
41b0: 0a 20 20 75 31 36 20 6e 53 69 7a 65 3b 20 20 20  .  u16 nSize;   
41c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
41d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 6e   cell content on
41e0: 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
41f0: 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   page */.};../*.
4200: 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 61  ** A cursor is a
4210: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 61   pointer to a pa
4220: 72 74 69 63 75 6c 61 72 20 65 6e 74 72 79 20 69  rticular entry i
4230: 6e 20 74 68 65 20 42 54 72 65 65 2e 0a 2a 2a 20  n the BTree..** 
4240: 54 68 65 20 65 6e 74 72 79 20 69 73 20 69 64 65  The entry is ide
4250: 6e 74 69 66 69 65 64 20 62 79 20 69 74 73 20 4d  ntified by its M
4260: 65 6d 50 61 67 65 20 61 6e 64 20 74 68 65 20 69  emPage and the i
4270: 6e 64 65 78 20 69 6e 0a 2a 2a 20 4d 65 6d 50 61  ndex in.** MemPa
4280: 67 65 2e 61 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  ge.aCell[] of th
4290: 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 72 75  e entry..*/.stru
42a0: 63 74 20 42 74 43 75 72 73 6f 72 20 7b 0a 20 20  ct BtCursor {.  
42b0: 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 20 20  Btree *pBtree;  
42c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
42d0: 20 42 74 72 65 65 20 74 6f 20 77 68 69 63 68 20   Btree to which 
42e0: 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
42f0: 6e 67 73 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ngs */.  BtCurso
4300: 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76  r *pNext, *pPrev
4310: 3b 20 20 2f 2a 20 46 6f 72 6d 73 20 61 20 6c 69  ;  /* Forms a li
4320: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c  nked list of all
4330: 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 69 6e   cursors */.  in
4340: 74 20 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  t (*xCompare)(vo
4350: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
4360: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
4370: 69 64 2a 29 3b 20 2f 2a 20 4b 65 79 20 63 6f 6d  id*); /* Key com
4380: 70 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64  p func */.  void
4390: 20 2a 70 41 72 67 3b 20 20 20 20 20 20 20 20 20   *pArg;         
43a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
43b0: 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
43c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52   */.  Pgno pgnoR
43d0: 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  oot;            
43e0: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
43f0: 20 6f 66 20 74 68 69 73 20 74 72 65 65 20 2a 2f   of this tree */
4400: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
4410: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
4420: 50 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Page that contai
4430: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 2a 2f 0a  ns the entry */.
4440: 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
4460: 6e 64 65 78 20 6f 66 20 74 68 65 20 65 6e 74 72  ndex of the entr
4470: 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
4480: 6c 5b 5d 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  l[] */.  CellInf
4490: 6f 20 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  o info;         
44a0: 20 20 20 2f 2a 20 41 20 70 61 72 73 65 20 6f 66     /* A parse of
44b0: 20 74 68 65 20 63 65 6c 6c 20 77 65 20 61 72 65   the cell we are
44c0: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 2a 2f 0a   pointing at */.
44d0: 20 20 75 38 20 77 72 46 6c 61 67 3b 20 20 20 20    u8 wrFlag;    
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
44f0: 72 75 65 20 69 66 20 77 72 69 74 61 62 6c 65 20  rue if writable 
4500: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 55 52  * One of the CUR
4530: 53 4f 52 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74  SOR_XXX constant
4540: 73 20 28 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f  s (see below) */
4550: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4560: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
4570: 45 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a  E.  void *pKey;.
4580: 20 20 69 36 34 20 6e 4b 65 79 3b 0a 20 20 69 6e    i64 nKey;.  in
4590: 74 20 73 6b 69 70 3b 20 20 20 20 20 20 20 20 2f  t skip;        /
45a0: 2a 20 28 73 6b 69 70 3c 30 29 20 2d 3e 20 50 72  * (skip<0) -> Pr
45b0: 65 76 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  ev() is a no-op.
45c0: 20 28 73 6b 69 70 3e 30 29 20 2d 3e 20 4e 65 78   (skip>0) -> Nex
45d0: 74 28 29 20 69 73 20 2a 2f 0a 23 65 6e 64 69 66  t() is */.#endif
45e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 6f 74 65 6e  .};../*.** Poten
45f0: 74 69 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  tial values for 
4600: 42 74 43 75 72 73 6f 72 2e 65 53 74 61 74 65 2e  BtCursor.eState.
4610: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 76   The first two v
4620: 61 6c 75 65 73 20 28 56 41 4c 49 44 20 61 6e 64  alues (VALID and
4630: 20 0a 2a 2a 20 49 4e 56 41 4c 49 44 29 20 6d 61   .** INVALID) ma
4640: 79 20 6f 63 63 75 72 20 69 6e 20 61 6e 79 20 62  y occur in any b
4650: 75 69 6c 64 2e 20 54 68 65 20 74 68 69 72 64 20  uild. The third 
4660: 28 52 45 51 55 49 52 45 53 45 45 4b 29 20 6d 61  (REQUIRESEEK) ma
4670: 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 0a 2a 2a  y only occur .**
4680: 20 69 66 20 73 71 6c 69 74 65 20 77 61 73 20 63   if sqlite was c
4690: 6f 6d 70 69 6c 65 64 20 77 69 74 68 6f 75 74 20  ompiled without 
46a0: 74 68 65 20 4f 4d 49 54 5f 53 48 41 52 45 44 5f  the OMIT_SHARED_
46b0: 43 41 43 48 45 20 73 79 6d 62 6f 6c 20 64 65 66  CACHE symbol def
46c0: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53  ined..**.** CURS
46d0: 4f 52 5f 56 41 4c 49 44 3a 0a 2a 2a 20 20 20 43  OR_VALID:.**   C
46e0: 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
46f0: 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 67  a valid entry. g
4700: 65 74 50 61 79 6c 6f 61 64 28 29 20 65 74 63 2e  etPayload() etc.
4710: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 2e 0a   may be called..
4720: 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  **.** CURSOR_INV
4730: 41 4c 49 44 3a 0a 2a 2a 20 20 20 43 75 72 73 6f  ALID:.**   Curso
4740: 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74  r does not point
4750: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4760: 79 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  y. This can happ
4770: 65 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  en (for example)
4780: 20 0a 2a 2a 20 20 20 62 65 63 61 75 73 65 20 74   .**   because t
4790: 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
47a0: 79 20 6f 72 20 62 65 63 61 75 73 65 20 42 74 72  y or because Btr
47b0: 65 65 43 75 72 73 6f 72 46 69 72 73 74 28 29 20  eeCursorFirst() 
47c0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20  has not been.** 
47d0: 20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20    called..**.** 
47e0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
47f0: 45 4b 3a 0a 2a 2a 20 20 20 54 68 65 20 74 61 62  EK:.**   The tab
4800: 6c 65 20 74 68 61 74 20 74 68 69 73 20 63 75 72  le that this cur
4810: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
4820: 6e 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2c 20  n still exists, 
4830: 62 75 74 20 68 61 73 20 62 65 65 6e 20 0a 2a 2a  but has been .**
4840: 20 20 20 6d 6f 64 69 66 69 65 64 20 73 69 6e 63     modified sinc
4850: 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  e the cursor was
4860: 20 6c 61 73 74 20 75 73 65 64 2e 20 54 68 65 20   last used. The 
4870: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4880: 69 73 20 73 61 76 65 64 0a 2a 2a 20 20 20 69 6e  is saved.**   in
4890: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
48a0: 73 6f 72 2e 70 4b 65 79 20 61 6e 64 20 42 74 43  sor.pKey and BtC
48b0: 75 72 73 6f 72 2e 6e 4b 65 79 2e 20 57 68 65 6e  ursor.nKey. When
48c0: 20 61 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20   a cursor is in 
48d0: 0a 2a 2a 20 20 20 74 68 69 73 20 73 74 61 74 65  .**   this state
48e0: 2c 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  , restoreOrClear
48f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
4900: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 74   can be called t
4910: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 65  o attempt to see
4920: 6b 20 0a 2a 2a 20 20 20 74 68 65 20 63 75 72 73  k .**   the curs
4930: 6f 72 20 74 6f 20 74 68 65 20 73 61 76 65 64 20  or to the saved 
4940: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65  position..*/.#de
4950: 66 69 6e 65 20 43 55 52 53 4f 52 5f 49 4e 56 41  fine CURSOR_INVA
4960: 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 30 0a  LID           0.
4970: 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 56  #define CURSOR_V
4980: 41 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 20  ALID            
4990: 20 31 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f   1.#define CURSO
49a0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 20 20  R_REQUIRESEEK   
49b0: 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      2../*.** The
49c0: 20 54 52 41 43 45 20 6d 61 63 72 6f 20 77 69 6c   TRACE macro wil
49d0: 6c 20 70 72 69 6e 74 20 68 69 67 68 2d 6c 65 76  l print high-lev
49e0: 65 6c 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  el status inform
49f0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a  ation about the.
4a00: 2a 2a 20 62 74 72 65 65 20 6f 70 65 72 61 74 69  ** btree operati
4a10: 6f 6e 20 77 68 65 6e 20 74 68 65 20 67 6c 6f 62  on when the glob
4a20: 61 6c 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69  al variable sqli
4a30: 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20  te3_btree_trace 
4a40: 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64 2e 0a 2a  is.** enabled..*
4a50: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  /.#if SQLITE_TES
4a60: 54 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45  T.# define TRACE
4a70: 28 58 29 20 20 20 69 66 28 20 73 71 6c 69 74 65  (X)   if( sqlite
4a80: 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20 29 5c  3_btree_trace )\
4a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4aa0: 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c 69 74           { sqlit
4ab0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b  e3DebugPrintf X;
4ac0: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
4ad0: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
4ae0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
4af0: 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 74  f.int sqlite3_bt
4b00: 72 65 65 5f 74 72 61 63 65 3d 30 3b 20 20 2f 2a  ree_trace=0;  /*
4b10: 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20   True to enable 
4b20: 74 72 61 63 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  tracing */../*.*
4b30: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
4b40: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
4b50: 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  int checkReadLoc
4b60: 6b 73 28 42 74 53 68 61 72 65 64 2a 2c 50 67 6e  ks(BtShared*,Pgn
4b70: 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f  o,BtCursor*);../
4b80: 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20 77 72 69  *.** Read or wri
4b90: 74 65 20 61 20 74 77 6f 2d 20 61 6e 64 20 66 6f  te a two- and fo
4ba0: 75 72 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69  ur-byte big-endi
4bb0: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
4bc0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  s..*/.static u32
4bd0: 20 67 65 74 32 62 79 74 65 28 75 6e 73 69 67 6e   get2byte(unsign
4be0: 65 64 20 63 68 61 72 20 2a 70 29 7b 0a 20 20 72  ed char *p){.  r
4bf0: 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c 38 29 20  eturn (p[0]<<8) 
4c00: 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63  | p[1];.}.static
4c10: 20 75 33 32 20 67 65 74 34 62 79 74 65 28 75 6e   u32 get4byte(un
4c20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b  signed char *p){
4c30: 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c  .  return (p[0]<
4c40: 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c 31 36  <24) | (p[1]<<16
4c50: 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20 7c 20  ) | (p[2]<<8) | 
4c60: 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 76  p[3];.}.static v
4c70: 6f 69 64 20 70 75 74 32 62 79 74 65 28 75 6e 73  oid put2byte(uns
4c80: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
4c90: 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20  32 v){.  p[0] = 
4ca0: 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d 20 3d 20 76  v>>8;.  p[1] = v
4cb0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4cc0: 70 75 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65  put4byte(unsigne
4cd0: 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32 20 76  d char *p, u32 v
4ce0: 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 32  ){.  p[0] = v>>2
4cf0: 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e 3e 31  4;.  p[1] = v>>1
4d00: 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e 3e 38  6;.  p[2] = v>>8
4d10: 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a 7d 0a  ;.  p[3] = v;.}.
4d20: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
4d30: 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  to read and writ
4d40: 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74  e variable-lengt
4d50: 68 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 65  h integers.  The
4d60: 73 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65  se used to.** be
4d70: 20 64 65 66 69 6e 65 64 20 6c 6f 63 61 6c 6c 79   defined locally
4d80: 2c 20 62 75 74 20 6e 6f 77 20 77 65 20 75 73 65  , but now we use
4d90: 20 74 68 65 20 76 61 72 69 6e 74 20 72 6f 75 74   the varint rout
4da0: 69 6e 65 73 20 69 6e 20 74 68 65 20 75 74 69 6c  ines in the util
4db0: 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 23  .c.** file..*/.#
4dc0: 64 65 66 69 6e 65 20 67 65 74 56 61 72 69 6e 74  define getVarint
4dd0: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 56 61      sqlite3GetVa
4de0: 72 69 6e 74 0a 2f 2a 20 23 64 65 66 69 6e 65 20  rint./* #define 
4df0: 67 65 74 56 61 72 69 6e 74 33 32 20 20 73 71 6c  getVarint32  sql
4e00: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 20  ite3GetVarint32 
4e10: 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61  */.#define getVa
4e20: 72 69 6e 74 33 32 28 41 2c 42 29 20 20 28 28 2a  rint32(A,B)  ((*
4e30: 42 3d 2a 28 41 29 29 3c 3d 30 78 37 66 3f 31 3a  B=*(A))<=0x7f?1:
4e40: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
4e50: 33 32 28 41 2c 42 29 29 0a 23 64 65 66 69 6e 65  32(A,B)).#define
4e60: 20 70 75 74 56 61 72 69 6e 74 20 20 20 20 73 71   putVarint    sq
4e70: 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 0a 0a  lite3PutVarint..
4e80: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
4e90: 70 61 67 65 20 74 68 65 20 50 45 4e 44 49 4e 47  page the PENDING
4ea0: 5f 42 59 54 45 20 6f 63 63 75 70 69 65 73 2e 20  _BYTE occupies. 
4eb0: 54 68 69 73 20 70 61 67 65 20 69 73 20 6e 65 76  This page is nev
4ec0: 65 72 20 75 73 65 64 2e 0a 2a 2a 20 54 4f 44 4f  er used..** TODO
4ed0: 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  : This macro is 
4ee0: 76 65 72 79 20 73 69 6d 69 6c 61 72 79 20 74 6f  very similary to
4ef0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 29   PAGER_MJ_PGNO()
4f00: 20 69 6e 20 70 61 67 65 72 2e 63 2e 20 54 68 65   in pager.c. The
4f10: 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 70 6f 73 73  y.** should poss
4f20: 69 62 6c 79 20 62 65 20 63 6f 6e 73 6f 6c 69 64  ibly be consolid
4f30: 61 74 65 64 20 28 70 72 65 73 75 6d 61 62 6c 79  ated (presumably
4f40: 20 69 6e 20 70 61 67 65 72 2e 68 29 2e 0a 2a 2f   in pager.h)..*/
4f50: 0a 23 64 65 66 69 6e 65 20 50 45 4e 44 49 4e 47  .#define PENDING
4f60: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
4f70: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
4f80: 70 42 74 29 2d 3e 70 61 67 65 53 69 7a 65 29 2b  pBt)->pageSize)+
4f90: 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b  1)../*.** A link
4fa0: 65 64 20 6c 69 73 74 20 6f 66 20 74 68 65 20 66  ed list of the f
4fb0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
4fc0: 72 65 73 20 69 73 20 73 74 6f 72 65 64 20 61 74  res is stored at
4fd0: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 2e   BtShared.pLock.
4fe0: 0a 2a 2a 20 4c 6f 63 6b 73 20 61 72 65 20 61 64  .** Locks are ad
4ff0: 64 65 64 20 28 6f 72 20 75 70 67 72 61 64 65 64  ded (or upgraded
5000: 20 66 72 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b 20   from READ_LOCK 
5010: 74 6f 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 77  to WRITE_LOCK) w
5020: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 0a 2a 2a  hen a cursor .**
5030: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
5040: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
5050: 74 20 70 61 67 65 20 42 74 53 68 61 72 65 64 2e  t page BtShared.
5060: 69 54 61 62 6c 65 2e 20 4c 6f 63 6b 73 20 61 72  iTable. Locks ar
5070: 65 20 72 65 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f  e removed.** fro
5080: 6d 20 74 68 69 73 20 6c 69 73 74 20 77 68 65 6e  m this list when
5090: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
50a0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  s committed or r
50b0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 6f 72 20 77  olled back, or w
50c0: 68 65 6e 0a 2a 2a 20 61 20 62 74 72 65 65 20 68  hen.** a btree h
50d0: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 2e  andle is closed.
50e0: 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74 4c 6f 63  .*/.struct BtLoc
50f0: 6b 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  k {.  Btree *pBt
5100: 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ree;        /* B
5110: 74 72 65 65 20 68 61 6e 64 6c 65 20 68 6f 6c 64  tree handle hold
5120: 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b 20 2a 2f  ing this lock */
5130: 0a 20 20 50 67 6e 6f 20 69 54 61 62 6c 65 3b 20  .  Pgno iTable; 
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
5150: 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 2a   page of table *
5160: 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20  /.  u8 eLock;   
5170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
5180: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
5190: 4c 4f 43 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b  LOCK */.  BtLock
51a0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
51b0: 2f 2a 20 4e 65 78 74 20 69 6e 20 42 74 53 68 61  /* Next in BtSha
51c0: 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 20 2a  red.pLock list *
51d0: 2f 0a 7d 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64 61  /.};../* Candida
51e0: 74 65 20 76 61 6c 75 65 73 20 66 6f 72 20 42 74  te values for Bt
51f0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64  Lock.eLock */.#d
5200: 65 66 69 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20  efine READ_LOCK 
5210: 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 52      1.#define WR
5220: 49 54 45 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a 23  ITE_LOCK    2..#
5230: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5240: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
5250: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e   /*.  ** The fun
5260: 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62 6c  ctions queryTabl
5270: 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62  eLock(), lockTab
5280: 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41  le() and unlockA
5290: 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20  llTables().  ** 
52a0: 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69  manipulate entri
52b0: 65 73 20 69 6e 20 74 68 65 20 42 74 53 68 61 72  es in the BtShar
52c0: 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20  ed.pLock linked 
52d0: 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f  list used to sto
52e0: 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63  re.  ** shared-c
52f0: 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c  ache table level
5300: 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c   locks. If the l
5310: 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c  ibrary is compil
5320: 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
5330: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
5340: 61 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20  ature disabled, 
5350: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e  then there is on
5360: 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72  ly ever one user
5370: 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74  .  ** of each Bt
5380: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
5390: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63   and so this loc
53a0: 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  king is not nece
53b0: 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20  ssary. .  ** So 
53c0: 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20  define the lock 
53d0: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
53e0: 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a  s as no-ops..  *
53f0: 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65 72  /.  #define quer
5400: 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  yTableLock(a,b,c
5410: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
5420: 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28  efine lockTable(
5430: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
5440: 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63  .  #define unloc
5450: 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 20 20  kAllTables(a).  
5460: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f  #define restoreO
5470: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
5480: 74 69 6f 6e 28 61 2c 62 29 20 53 51 4c 49 54 45  tion(a,b) SQLITE
5490: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 61  _OK.  #define sa
54a0: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 61 2c 62  veAllCursors(a,b
54b0: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23  ,c) SQLITE_OK..#
54c0: 65 6c 73 65 0a 0a 73 74 61 74 69 63 20 76 6f 69  else..static voi
54d0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
54e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 0a 0a  mPage *pPage);..
54f0: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63  /*.** Save the c
5500: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
5510: 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61  sition in the va
5520: 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72  riables BtCursor
5530: 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74  .nKey .** and Bt
5540: 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65  Cursor.pKey. The
5550: 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20   cursor's state 
5560: 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
5570: 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f  _REQUIRESEEK..*/
5580: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5590: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
55a0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
55b0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
55c0: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
55d0: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
55e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
55f0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
5600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5610: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
5620: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
5630: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5640: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
5650: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
5660: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
5670: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
5680: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
5690: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
56a0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
56b0: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
56c0: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
56d0: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
56e0: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
56f0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5700: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5710: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5720: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
5730: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
5740: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
5750: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
5760: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5770: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67  && 0==pCur->pPag
5780: 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20  e->intKey){.    
5790: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c  void *pKey = sql
57a0: 69 74 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e  iteMalloc(pCur->
57b0: 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70  nKey);.    if( p
57c0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
57d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
57e0: 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d  y(pCur, 0, pCur-
57f0: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
5800: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5810: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5820: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
5830: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
5840: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
5850: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5860: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5870: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5880: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
5890: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
58a0: 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
58b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
58c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
58d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
58e0: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
58f0: 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
5900: 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->pPage = 0;.   
5910: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5920: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5930: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  EK;.  }..  retur
5940: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5950: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
5960: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
5970: 20 65 78 63 65 70 74 20 70 45 78 63 65 70 74 20   except pExcept 
5980: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c  open on the tabl
5990: 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d  e .** with root-
59a0: 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61  page iRoot. Usua
59b0: 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c  lly, this is cal
59c0: 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
59d0: 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70  cursor.** pExcep
59e0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
59f0: 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 28 42  ify the table (B
5a00: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
5a10: 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a  BtreeInsert())..
5a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5a30: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5a40: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5a50: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5a60: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5a70: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28  Cursor *p;.  if(
5a80: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
5a90: 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73  taReadOnly()->us
5aa0: 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20  eSharedData ){. 
5ab0: 20 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43     for(p=pBt->pC
5ac0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5ad0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
5ae0: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5af0: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
5b00: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
5b10: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d  && .          p-
5b20: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b30: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20  VALID ){.       
5b40: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
5b50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
5b60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
5b70: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
5b80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
5b90: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
5ba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5bc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  K;.}../*.** Rest
5bd0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
5be0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
5bf0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
5c00: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
5c10: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
5c20: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5c30: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
5c40: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
5c50: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
5c60: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
5c70: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
5c80: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5c90: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
5ca0: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
5cb0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
5cc0: 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
5cd0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
5ce0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
5cf0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
5d00: 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  ition()..**.** I
5d10: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
5d20: 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d  ument argument -
5d30: 20 64 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c   doSeek - is fal
5d40: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
5d50: 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e   of .** returnin
5d60: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
5d70: 69 74 27 73 20 73 61 76 65 64 20 70 6f 73 69 74  it's saved posit
5d80: 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65 64 20 70  ion, any saved p
5d90: 6f 73 69 74 69 6f 6e 20 69 73 20 64 65 6c 65 74  osition is delet
5da0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 75  ed.** and the cu
5db0: 72 73 6f 72 20 73 74 61 74 65 20 73 65 74 20 74  rsor state set t
5dc0: 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  o CURSOR_INVALID
5dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5de0: 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
5df0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 58 28 42 74  rsorPositionX(Bt
5e00: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5e10: 74 20 64 6f 53 65 65 6b 29 7b 0a 20 20 69 6e 74  t doSeek){.  int
5e20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5e30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5e40: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
5e50: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
5e60: 64 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  dData );.  asser
5e70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5e80: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
5e90: 45 45 4b 20 29 3b 0a 20 20 70 43 75 72 2d 3e 65  EEK );.  pCur->e
5ea0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5eb0: 4e 56 41 4c 49 44 3b 0a 20 20 69 66 28 20 64 6f  NVALID;.  if( do
5ec0: 53 65 65 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  Seek ){.    rc =
5ed0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
5ee0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
5ef0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
5f00: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
5f10: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
5f20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5f30: 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e  qliteFree(pCur->
5f40: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
5f50: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
5f60: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5f70: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5f80: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 49 4e 56 41  e || CURSOR_INVA
5f90: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5fa0: 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  e );.  }.  retur
5fb0: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
5fc0: 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
5fd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 2c  ursorPosition(p,
5fe0: 78 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  x) \.  (p->eStat
5ff0: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
6000: 45 53 45 45 4b 3f 72 65 73 74 6f 72 65 4f 72 43  ESEEK?restoreOrC
6010: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
6020: 6f 6e 58 28 70 2c 78 29 3a 53 51 4c 49 54 45 5f  onX(p,x):SQLITE_
6030: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79  OK)../*.** Query
6040: 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65 65   to see if btree
6050: 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62   handle p may ob
6060: 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
6070: 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52  ype eLock .** (R
6080: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54  EAD_LOCK or WRIT
6090: 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74  E_LOCK) on the t
60a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
60b0: 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e  age iTab. Return
60c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
60d0: 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65   the lock may be
60e0: 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61   obtained (by ca
60f0: 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28  lling lockTable(
6100: 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  )), or.** SQLITE
6110: 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a  _LOCKED if not..
6120: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75  */.static int qu
6130: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  eryTableLock(Btr
6140: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
6150: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
6160: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
6170: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
6180: 2a 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68  *pIter;..  /* Th
6190: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
61a0: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
61b0: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
61c0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
61d0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
61e0: 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61  adOnly()->useSha
61f0: 72 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72  redData ){.    r
6200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6210: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
6220: 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b  (along with lock
6230: 54 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72  Table()) is wher
6240: 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  e the ReadUncomm
6250: 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20  itted flag is.  
6260: 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49  ** dealt with. I
6270: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
6280: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
6290: 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65  ead-lock and the
62a0: 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65   flag is.  ** se
62b0: 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69  t, it is uncondi
62c0: 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64  tionally granted
62d0: 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65   - even if there
62e0: 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73   are write-locks
62f0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62  .  ** on the tab
6300: 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c  le. If a write-l
6310: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
6320: 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  , the ReadUncomm
6330: 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20  itted flag.  ** 
6340: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
6350: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  d..  **.  ** In 
6360: 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62  function lockTab
6370: 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d  le(), if a read-
6380: 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64  lock is demanded
6390: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52   and the .  ** R
63a0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
63b0: 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65  lag is set, no e
63c0: 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
63d0: 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20   the locks list 
63e0: 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e  .  ** (BtShared.
63f0: 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a  pLock)..  **.  *
6400: 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20  * To summarize: 
6410: 49 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  If the ReadUncom
6420: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
6430: 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75  et, then read cu
6440: 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f  rsors do.  ** no
6450: 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70  t create or resp
6460: 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e  ect table locks.
6470: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f   The locking pro
6480: 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20  cedure for a .  
6490: 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20  ** write-cursor 
64a0: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e  does not change.
64b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
64c0: 20 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20   !p->pSqlite || 
64d0: 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c  .    0==(p->pSql
64e0: 69 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  ite->flags&SQLIT
64f0: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
6500: 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b  d) || .    eLock
6510: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a  ==WRITE_LOCK ||.
6520: 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52      iTab==MASTER
6530: 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66  _ROOT.  ){.    f
6540: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
6550: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
6560: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
6570: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
6580: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
6590: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
65a0: 61 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ab && .         
65b0: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
65c0: 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d  eLock || eLock!=
65d0: 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  READ_LOCK) ){.  
65e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
65f0: 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
6600: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
6630: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
6640: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
6650: 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20  e iTable to the 
6660: 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65  shared-btree use
6670: 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61  d.** by Btree ha
6680: 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65  ndle p. Paramete
6690: 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20  r eLock must be 
66a0: 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b  either READ_LOCK
66b0: 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f   or .** WRITE_LO
66c0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
66d0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
66e0: 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61  if the lock is a
66f0: 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
6700: 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  y. SQLITE_BUSY a
6710: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  nd.** SQLITE_NOM
6720: 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72  EM may also be r
6730: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6740: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65  ic int lockTable
6750: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
6760: 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b  iTable, u8 eLock
6770: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
6780: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
6790: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30  tLock *pLock = 0
67a0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
67b0: 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  r;..  /* This is
67c0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
67d0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
67e0: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
67f0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54   if( 0==sqlite3T
6800: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
6810: 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61  y()->useSharedDa
6820: 74 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ta ){.    return
6830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
6840: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
6850: 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65  E_OK==queryTable
6860: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
6870: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
6880: 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  If the read-unco
6890: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
68a0: 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c  set and a read-l
68b0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
68c0: 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61  ,.  ** return ea
68d0: 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64 69  rly without addi
68e0: 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  ng an entry to t
68f0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
6900: 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a  k list. See.  **
6910: 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63   comment in func
6920: 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c  tion queryTableL
6930: 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69  ock() for more i
6940: 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20  nfo on handling 
6950: 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e  .  ** the ReadUn
6960: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a  committed flag..
6970: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
6980: 28 70 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20  (p->pSqlite) && 
6990: 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65  .    (p->pSqlite
69a0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
69b0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20  eadUncommitted) 
69c0: 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d  && .    (eLock==
69d0: 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20  READ_LOCK) &&.  
69e0: 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52    iTable!=MASTER
69f0: 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72  _ROOT.  ){.    r
6a00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6a10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74  .  }..  /* First
6a20: 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74   search the list
6a30: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
6a40: 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61   lock on this ta
6a50: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
6a60: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
6a70: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
6a80: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
6a90: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c  if( pIter->iTabl
6aa0: 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74  e==iTable && pIt
6ab0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  er->pBtree==p ){
6ac0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  .      pLock = p
6ad0: 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61  Iter;.      brea
6ae0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
6af0: 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
6b00: 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66  search did not f
6b10: 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72  ind a BtLock str
6b20: 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20  uct associating 
6b30: 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74  Btree p.  ** wit
6b40: 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20  h table iTable, 
6b50: 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64  allocate one and
6b60: 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68   link it into th
6b70: 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e list..  */.  i
6b80: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
6b90: 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b   pLock = (BtLock
6ba0: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
6bb0: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
6bc0: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
6bd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6be0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6bf0: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
6c00: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
6c10: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
6c20: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
6c30: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
6c40: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
6c50: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
6c60: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
6c70: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
6c80: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
6c90: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
6ca0: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
6cb0: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
6cc0: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
6cd0: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
6ce0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
6cf0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
6d00: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
6d10: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
6d20: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
6d30: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
6d40: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
6d50: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
6d60: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
6d70: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
6d80: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
6d90: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
6da0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
6dc0: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
6dd0: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
6de0: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
6df0: 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65  to the lockTable
6e00: 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29  ().** procedure)
6e10: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68   held by Btree h
6e20: 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74  andle p..*/.stat
6e30: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c  ic void unlockAl
6e40: 6c 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70  lTables(Btree *p
6e50: 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70  ){.  BtLock **pp
6e60: 49 74 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e  Iter = &p->pBt->
6e70: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
6e80: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
6e90: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f   extension is no
6ea0: 74 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65  t enabled, there
6eb0: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20   should be no.  
6ec0: 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20  ** locks in the 
6ed0: 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c  BtShared.pLock l
6ee0: 69 73 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73  ist, making this
6ef0: 20 70 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d   procedure a no-
6f00: 6f 70 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20  op. Assert.  ** 
6f10: 74 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65  that this is the
6f20: 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   case..  */.  as
6f30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 54 68 72  sert( sqlite3Thr
6f40: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
6f50: 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  )->useSharedData
6f60: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
6f70: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49  ;..  while( *ppI
6f80: 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ter ){.    BtLoc
6f90: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74  k *pLock = *ppIt
6fa0: 65 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  er;.    if( pLoc
6fb0: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
6fc0: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
6fd0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
6fe0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
6ff0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Lock);.    }else
7000: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
7010: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
7020: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
7030: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7040: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
7050: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
7060: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7070: 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61  M./*.** These ma
7080: 63 72 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20  cros define the 
7090: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
70a0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
70b0: 79 20 66 6f 72 20 61 20 0a 2a 2a 20 64 61 74 61  y for a .** data
70c0: 62 61 73 65 20 70 61 67 65 2e 20 54 68 65 20 66  base page. The f
70d0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
70e0: 20 65 61 63 68 20 69 73 20 74 68 65 20 6e 75 6d   each is the num
70f0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 0a 2a 2a  ber of usable.**
7100: 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68 20 70   bytes on each p
7110: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
7120: 61 73 65 20 28 6f 66 74 65 6e 20 31 30 32 34 29  ase (often 1024)
7130: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 69 73 20  . The second is 
7140: 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
7150: 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e  er to look up in
7160: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7170: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 50  ..**.** PTRMAP_P
7180: 41 47 45 4e 4f 20 72 65 74 75 72 6e 73 20 74 68  AGENO returns th
7190: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
71a0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 6f  number of the po
71b0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 70 61 67  inter-map.** pag
71c0: 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  e that stores th
71d0: 65 20 72 65 71 75 69 72 65 64 20 70 6f 69 6e 74  e required point
71e0: 65 72 2e 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  er. PTRMAP_PTROF
71f0: 46 53 45 54 20 72 65 74 75 72 6e 73 0a 2a 2a 20  FSET returns.** 
7200: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
7210: 65 20 72 65 71 75 65 73 74 65 64 20 6d 61 70 20  e requested map 
7220: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  entry..**.** If 
7230: 74 68 65 20 70 67 6e 6f 20 61 72 67 75 6d 65 6e  the pgno argumen
7240: 74 20 70 61 73 73 65 64 20 74 6f 20 50 54 52 4d  t passed to PTRM
7250: 41 50 5f 50 41 47 45 4e 4f 20 69 73 20 61 20 70  AP_PAGENO is a p
7260: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
7270: 0a 2a 2a 20 74 68 65 6e 20 70 67 6e 6f 20 69 73  .** then pgno is
7280: 20 72 65 74 75 72 6e 65 64 2e 20 53 6f 20 28 70   returned. So (p
7290: 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
72a0: 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f 29 29 20  NO(pgsz, pgno)) 
72b0: 63 61 6e 20 62 65 0a 2a 2a 20 75 73 65 64 20 74  can be.** used t
72c0: 6f 20 74 65 73 74 20 69 66 20 70 67 6e 6f 20 69  o test if pgno i
72d0: 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  s a pointer-map 
72e0: 70 61 67 65 2e 20 50 54 52 4d 41 50 5f 49 53 50  page. PTRMAP_ISP
72f0: 41 47 45 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  AGE implements.*
7300: 2a 20 74 68 69 73 20 74 65 73 74 2e 0a 2a 2f 0a  * this test..*/.
7310: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50  #define PTRMAP_P
7320: 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f  AGENO(pgsz, pgno
7330: 29 20 28 28 28 70 67 6e 6f 2d 32 29 2f 28 70 67  ) (((pgno-2)/(pg
7340: 73 7a 2f 35 2b 31 29 29 2a 28 70 67 73 7a 2f 35  sz/5+1))*(pgsz/5
7350: 2b 31 29 2b 32 29 0a 23 64 65 66 69 6e 65 20 50  +1)+2).#define P
7360: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7370: 70 67 73 7a 2c 20 70 67 6e 6f 29 20 28 28 28 70  pgsz, pgno) (((p
7380: 67 6e 6f 2d 32 29 25 28 70 67 73 7a 2f 35 2b 31  gno-2)%(pgsz/5+1
7390: 29 2d 31 29 2a 35 29 0a 23 64 65 66 69 6e 65 20  )-1)*5).#define 
73a0: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 67  PTRMAP_ISPAGE(pg
73b0: 73 7a 2c 20 70 67 6e 6f 29 20 28 50 54 52 4d 41  sz, pgno) (PTRMA
73c0: 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 70 67  P_PAGENO(pgsz,pg
73d0: 6e 6f 29 3d 3d 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a  no)==pgno)../*.*
73e0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
73f0: 70 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61  p is a lookup ta
7400: 62 6c 65 20 74 68 61 74 20 69 64 65 6e 74 69 66  ble that identif
7410: 69 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70  ies the parent p
7420: 61 67 65 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  age for.** each 
7430: 63 68 69 6c 64 20 70 61 67 65 20 69 6e 20 74 68  child page in th
7440: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
7450: 20 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67    The parent pag
7460: 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  e is the page th
7470: 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  at.** contains a
7480: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7490: 63 68 69 6c 64 2e 20 20 45 76 65 72 79 20 70 61  child.  Every pa
74a0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
74b0: 73 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 30  se contains.** 0
74c0: 20 6f 72 20 31 20 70 61 72 65 6e 74 20 70 61 67   or 1 parent pag
74d0: 65 73 2e 20 20 28 49 6e 20 74 68 69 73 20 63 6f  es.  (In this co
74e0: 6e 74 65 78 74 20 27 64 61 74 61 62 61 73 65 20  ntext 'database 
74f0: 70 61 67 65 27 20 72 65 66 65 72 73 0a 2a 2a 20  page' refers.** 
7500: 74 6f 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  to any page that
7510: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
7520: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7530: 69 74 73 65 6c 66 2e 29 20 20 45 61 63 68 20 70  itself.)  Each p
7540: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 65 6e  ointer map.** en
7550: 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  try consists of 
7560: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 27 74  a single byte 't
7570: 79 70 65 27 20 61 6e 64 20 61 20 34 20 62 79 74  ype' and a 4 byt
7580: 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  e parent page nu
7590: 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20 50 54 52  mber..** The PTR
75a0: 4d 41 50 5f 58 58 58 20 69 64 65 6e 74 69 66 69  MAP_XXX identifi
75b0: 65 72 73 20 62 65 6c 6f 77 20 61 72 65 20 74 68  ers below are th
75c0: 65 20 76 61 6c 69 64 20 74 79 70 65 73 2e 0a 2a  e valid types..*
75d0: 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65  *.** The purpose
75e0: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
75f0: 6d 61 70 20 69 73 20 74 6f 20 66 61 63 69 6c 69  map is to facili
7600: 74 79 20 6d 6f 76 69 6e 67 20 70 61 67 65 73 20  ty moving pages 
7610: 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70 6f 73 69  from one.** posi
7620: 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  tion in the file
7630: 20 74 6f 20 61 6e 6f 74 68 65 72 20 61 73 20 70   to another as p
7640: 61 72 74 20 6f 66 20 61 75 74 6f 76 61 63 75 75  art of autovacuu
7650: 6d 2e 20 20 57 68 65 6e 20 61 20 70 61 67 65 0a  m.  When a page.
7660: 2a 2a 20 69 73 20 6d 6f 76 65 64 2c 20 74 68 65  ** is moved, the
7670: 20 70 6f 69 6e 74 65 72 20 69 6e 20 69 74 73 20   pointer in its 
7680: 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 75  parent must be u
7690: 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20  pdated to point 
76a0: 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 6f  to the.** new lo
76b0: 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 6f 69  cation.  The poi
76c0: 6e 74 65 72 20 6d 61 70 20 69 73 20 75 73 65 64  nter map is used
76d0: 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 70   to locate the p
76e0: 61 72 65 6e 74 20 70 61 67 65 20 71 75 69 63 6b  arent page quick
76f0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ly..**.** PTRMAP
7700: 5f 52 4f 4f 54 50 41 47 45 3a 20 54 68 65 20 64  _ROOTPAGE: The d
7710: 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20  atabase page is 
7720: 61 20 72 6f 6f 74 2d 70 61 67 65 2e 20 54 68 65  a root-page. The
7730: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
7740: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  not.**          
7750: 20 20 20 20 20 20 20 20 75 73 65 64 20 69 6e 20          used in 
7760: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
7770: 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
7780: 3a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70  : The database p
7790: 61 67 65 20 69 73 20 61 6e 20 75 6e 75 73 65 64  age is an unused
77a0: 20 28 66 72 65 65 29 20 70 61 67 65 2e 20 54 68   (free) page. Th
77b0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 0a 2a  e page-number .*
77c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
77d0: 20 20 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69     is not used i
77e0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
77f0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
7800: 4f 57 31 3a 20 54 68 65 20 64 61 74 61 62 61 73  OW1: The databas
7810: 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
7820: 72 73 74 20 70 61 67 65 20 69 6e 20 61 20 6c 69  rst page in a li
7830: 73 74 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20  st of .**       
7840: 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
7850: 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
7860: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 64 65 6e  page number iden
7870: 74 69 66 69 65 73 20 74 68 65 20 70 61 67 65 20  tifies the page 
7880: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
7890: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 61 69            contai
78a0: 6e 73 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ns the cell with
78b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
78c0: 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
78d0: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
78e0: 56 45 52 46 4c 4f 57 32 3a 20 54 68 65 20 64 61  VERFLOW2: The da
78f0: 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20 74  tabase page is t
7900: 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 6c 61 74  he second or lat
7910: 65 72 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73  er page in a lis
7920: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
7930: 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
7940: 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 61  ow pages. The pa
7950: 67 65 2d 6e 75 6d 62 65 72 20 69 64 65 6e 74 69  ge-number identi
7960: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
7970: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
7980: 20 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 74         page in t
7990: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
79a0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 54 52   list..**.** PTR
79b0: 4d 41 50 5f 42 54 52 45 45 3a 20 54 68 65 20 64  MAP_BTREE: The d
79c0: 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20  atabase page is 
79d0: 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74 72 65 65  a non-root btree
79e0: 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20   page. The page 
79f0: 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20  number.**       
7a00: 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
7a10: 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  es the parent pa
7a20: 67 65 20 69 6e 20 74 68 65 20 62 74 72 65 65 2e  ge in the btree.
7a30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  .*/.#define PTRM
7a40: 41 50 5f 52 4f 4f 54 50 41 47 45 20 31 0a 23 64  AP_ROOTPAGE 1.#d
7a50: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 46 52 45  efine PTRMAP_FRE
7a60: 45 50 41 47 45 20 32 0a 23 64 65 66 69 6e 65 20  EPAGE 2.#define 
7a70: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
7a80: 20 33 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41   3.#define PTRMA
7a90: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 34 0a 23 64  P_OVERFLOW2 4.#d
7aa0: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 42 54 52  efine PTRMAP_BTR
7ab0: 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  EE 5../*.** Writ
7ac0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
7ad0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7ae0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7af0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
7b00: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7b10: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
7b20: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
7b30: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
7b40: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
7b50: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7b60: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20  r 'pgno'..** An 
7b70: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
7b80: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
7b90: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
7ba0: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
7bb0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
7bc0: 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  nt ptrmapPut(BtS
7bd0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7be0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
7bf0: 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20  Pgno parent){.  
7c00: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
7c10: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7c20: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ap page */.  Pgn
7c30: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 2f 2a 20  o iPtrmap;   /* 
7c40: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7c50: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7c60: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7c70: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
7c80: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7c90: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
7ca0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7cb0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7cc0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
7cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7ce0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7cf0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7d00: 5f 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61  _PAGENO(pBt->usa
7d10: 62 6c 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 20  bleSize, key);. 
7d20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
7d30: 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67  er_get(pBt->pPag
7d40: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 28 76 6f  er, iPtrmap, (vo
7d50: 69 64 20 2a 2a 29 26 70 50 74 72 6d 61 70 29 3b  id **)&pPtrmap);
7d60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
7d80: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
7d90: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7da0: 4f 46 46 53 45 54 28 70 42 74 2d 3e 75 73 61 62  OFFSET(pBt->usab
7db0: 6c 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 0a 20  leSize, key);.. 
7dc0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
7dd0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
7de0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
7df0: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
7e00: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
7e10: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
7e20: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
7e30: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
7e40: 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d  rent));.    rc =
7e50: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
7e60: 69 74 65 28 70 50 74 72 6d 61 70 29 3b 0a 20 20  ite(pPtrmap);.  
7e70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7e80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
7e90: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
7ea0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
7eb0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7ec0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
7ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
7ee0: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
7ef0: 66 28 70 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  f(pPtrmap);.  re
7f00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7f10: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
7f20: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
7f30: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
7f40: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
7f50: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
7f60: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
7f70: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
7f80: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
7f90: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
7fa0: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
7fb0: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
7fc0: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
7fd0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
7fe0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
7ff0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
8000: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
8010: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
8020: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
8030: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8040: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
8050: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
8060: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
8070: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8080: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
8090: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
80a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
80b0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
80c0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
80d0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
80e0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
80f0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
8100: 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20   rc;..  iPtrmap 
8110: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8120: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c  pBt->usableSize,
8130: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
8140: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
8150: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
8160: 6d 61 70 2c 20 28 76 6f 69 64 20 2a 2a 29 26 70  map, (void **)&p
8170: 50 74 72 6d 61 70 29 3b 0a 20 20 69 66 28 20 72  Ptrmap);.  if( r
8180: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8190: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 6f 66  rn rc;.  }..  of
81a0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
81b0: 52 4f 46 46 53 45 54 28 70 42 74 2d 3e 75 73 61  ROFFSET(pBt->usa
81c0: 62 6c 65 53 69 7a 65 2c 20 6b 65 79 29 3b 0a 20  bleSize, key);. 
81d0: 20 69 66 28 20 70 45 54 79 70 65 20 29 20 2a 70   if( pEType ) *p
81e0: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
81f0: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
8200: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
8210: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
8220: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
8230: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
8240: 72 65 66 28 70 50 74 72 6d 61 70 29 3b 0a 20 20  ref(pPtrmap);.  
8250: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
8260: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
8270: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8280: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
8290: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
82a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
82b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
82c0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
82d0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
82e0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
82f0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
8300: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
8310: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
8320: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
8330: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
8340: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
8350: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
8360: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
8370: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
8380: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
8390: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
83a0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
83b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
83c0: 2a 66 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67  *findCell(MemPag
83d0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
83e0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 64 61 74 61  ell){.  u8 *data
83f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
8400: 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c  .  assert( iCell
8410: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
8420: 20 69 43 65 6c 6c 3c 67 65 74 32 62 79 74 65 28   iCell<get2byte(
8430: 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
8440: 4f 66 66 73 65 74 2b 33 5d 29 20 29 3b 0a 20 20  Offset+3]) );.  
8450: 72 65 74 75 72 6e 20 64 61 74 61 20 2b 20 67 65  return data + ge
8460: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
8470: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
8480: 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  *iCell]);.}../*.
8490: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
84a0: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
84b0: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
84c0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
84d0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
84e0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
84f0: 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74  lls.  See insert
8500: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66  .*/.static u8 *f
8510: 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
8520: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8530: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e  int iCell){.  in
8540: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  t i;.  for(i=pPa
8550: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
8560: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
8570: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
8580: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
8590: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
85a0: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
85b0: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
85c0: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
85d0: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
85e0: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
85f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8600: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
8610: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
8620: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
8630: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
8640: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
8650: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
8660: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
8670: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
8680: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
8690: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
86a0: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
86b0: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
86c0: 69 6f 6e 2e 20 20 70 61 72 73 65 43 65 6c 6c 28  ion.  parseCell(
86d0: 29 20 74 61 6b 65 73 20 61 20 63 65 6c 6c 20 69  ) takes a cell i
86e0: 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 73  ndex.** as the s
86f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
8700: 6e 64 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  nd parseCellPtr(
8710: 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65  ) takes a pointe
8720: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 62 6f 64 79  r to the.** body
8730: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
8740: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
8750: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
8760: 6f 69 64 20 70 61 72 73 65 43 65 6c 6c 50 74 72  oid parseCellPtr
8770: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8780: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8790: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
87a0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
87b0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
87c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
87d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
87e0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
87f0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8800: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8810: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8820: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
8830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8840: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
8850: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
8860: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8870: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8880: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8890: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
88a0: 2a 2f 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65  */..  pInfo->pCe
88b0: 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73  ll = pCell;.  as
88c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
88d0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
88e0: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20  eaf==1 );.  n = 
88f0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
8900: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
8910: 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  ==4-4*pPage->lea
8920: 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  f );.  if( pPage
8930: 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
8940: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
8950: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50  2(&pCell[n], &nP
8960: 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65  ayload);.  }else
8970: 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
8980: 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d   0;.  }.  pInfo-
8990: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
89a0: 64 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  d;.  if( pPage->
89b0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20  intKey ){.    n 
89c0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43  += getVarint(&pC
89d0: 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26  ell[n], (u64 *)&
89e0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
89f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32 20 78  }else{.    u32 x
8a00: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
8a10: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
8a20: 2c 20 26 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f  , &x);.    pInfo
8a30: 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20  ->nKey = x;.    
8a40: 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20  nPayload += x;. 
8a50: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61   }.  pInfo->nHea
8a60: 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e  der = n;.  if( n
8a70: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
8a80: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
8a90: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
8aa0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
8ab0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
8ac0: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
8ad0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
8ae0: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
8af0: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
8b00: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
8b10: 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  nt nSize;       
8b20: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
8b30: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
8b40: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
8b50: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8b60: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70   nPayload;.    p
8b70: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
8b80: 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  = 0;.    nSize =
8b90: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20   nPayload + n;. 
8ba0: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
8bb0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
8bc0: 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e  4;        /* Min
8bd0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
8be0: 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  s 4 */.    }.   
8bf0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8c00: 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nSize;.  }else{.
8c10: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
8c20: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
8c30: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
8c40: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
8c50: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
8c60: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
8c70: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
8c80: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
8c90: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
8ca0: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
8cb0: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
8cc0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
8cd0: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
8ce0: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
8cf0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
8d00: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
8d10: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
8d20: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
8d30: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
8d40: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
8d50: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
8d60: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
8d70: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
8d80: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
8d90: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
8da0: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
8db0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
8dc0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
8dd0: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
8de0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
8df0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
8e00: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
8e10: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
8e20: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
8e30: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
8e40: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
8e50: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
8e60: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
8e70: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
8e80: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
8e90: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
8ea0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
8eb0: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
8ec0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
8ed0: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
8ee0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8ef0: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
8f00: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
8f10: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
8f20: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8f30: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
8f40: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
8f50: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
8f60: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8f70: 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65   surplus;.    }e
8f80: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  lse{.      pInfo
8f90: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f  ->nLocal = minLo
8fa0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
8fb0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
8fc0: 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  = pInfo->nLocal 
8fd0: 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  + n;.    pInfo->
8fe0: 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69  nSize = pInfo->i
8ff0: 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20  Overflow + 4;.  
9000: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9010: 70 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d  parseCell(.  Mem
9020: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9030: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9040: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9050: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c   */.  int iCell,
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9070: 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e   The cell index.
9080: 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20    First cell is 
9090: 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  0 */.  CellInfo 
90a0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
90b0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
90c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
90d0: 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
90e0: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
90f0: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
9100: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
9110: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
9120: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9130: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
9140: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
9150: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
9160: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
9170: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
9180: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
9190: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
91a0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
91b0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
91c0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
91d0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
91e0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
91f0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
9200: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
9210: 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69  tatic int cellSi
9220: 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ze(MemPage *pPag
9230: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
9240: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
9250: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
9260: 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, iCell, &info)
9270: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
9280: 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nSize;.}.#endif.
9290: 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53  static int cellS
92a0: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
92b0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
92c0: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
92d0: 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50  fo;.  parseCellP
92e0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
92f0: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
9300: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
9310: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9320: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
9330: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
9340: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
9350: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
9360: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
9370: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
9380: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
9390: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
93a0: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
93b0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
93c0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
93d0: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
93e0: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
93f0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
9400: 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a  .  if( pCell ){.
9410: 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
9420: 6f 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c  o;.    parseCell
9430: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
9440: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 69 66  , &info);.    if
9450: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
9460: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
9470: 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e  nfo.nKey))>info.
9480: 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
9490: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
94a0: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
94b0: 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
94c0: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
94d0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
94e0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
94f0: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9500: 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pgno);.    }.  }
9510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9520: 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20  _OK;.}./*.** If 
9530: 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e  the cell with in
9540: 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67  dex iCell on pag
9550: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
9560: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9570: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
9580: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
9590: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
95a0: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
95b0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
95c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
95d0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65  ptrmapPutOvfl(Me
95e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
95f0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a  t iCell){.  u8 *
9600: 70 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d  pCell;.  pCell =
9610: 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
9620: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
9630: 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70  .  return ptrmap
9640: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
9650: 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64  , pCell);.}.#end
9660: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 73 61  if.../*.** Do sa
9670: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
9680: 20 61 20 70 61 67 65 2e 20 20 54 68 72 6f 77 20   a page.  Throw 
9690: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
96a0: 61 6e 79 74 68 69 6e 67 20 69 73 0a 2a 2a 20 6e  anything is.** n
96b0: 6f 74 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  ot right..**.** 
96c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
96d0: 75 73 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  used for interna
96e0: 6c 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  l error checking
96f0: 20 6f 6e 6c 79 2e 20 20 49 74 20 69 73 20 6f 6d   only.  It is om
9700: 69 74 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 6f  itted.** from mo
9710: 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  st builds..*/.#i
9720: 66 20 64 65 66 69 6e 65 64 28 42 54 52 45 45 5f  f defined(BTREE_
9730: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
9740: 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 30 0a  ed(NDEBUG) && 0.
9750: 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
9760: 65 49 6e 74 65 67 72 69 74 79 28 4d 65 6d 50 61  eIntegrity(MemPa
9770: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
9780: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
9790: 75 38 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  u8 *data;.  int 
97a0: 69 2c 20 6a 2c 20 69 64 78 2c 20 63 2c 20 70 63  i, j, idx, c, pc
97b0: 2c 20 68 64 72 2c 20 6e 46 72 65 65 3b 0a 20 20  , hdr, nFree;.  
97c0: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  int cellOffset;.
97d0: 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 63 65 6c    int nCell, cel
97e0: 6c 4c 69 6d 69 74 3b 0a 20 20 75 38 20 2a 75 73  lLimit;.  u8 *us
97f0: 65 64 3b 0a 0a 20 20 75 73 65 64 20 3d 20 73 71  ed;..  used = sq
9800: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
9810: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
9820: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 75 73 65  ize );.  if( use
9830: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
9840: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
9850: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9860: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9870: 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 26 28  pPage->aData==&(
9880: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9890: 70 50 61 67 65 29 5b 2d 70 50 61 67 65 2d 3e 70  pPage)[-pPage->p
98a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b  Bt->pageSize] );
98b0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
98c0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  hdrOffset;.  ass
98d0: 65 72 74 28 20 68 64 72 3d 3d 28 70 50 61 67 65  ert( hdr==(pPage
98e0: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
98f0: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
9900: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
9910: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
9920: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44  number(pPage->aD
9930: 61 74 61 29 20 29 3b 0a 20 20 63 20 3d 20 70 50  ata) );.  c = pP
9940: 61 67 65 2d 3e 61 44 61 74 61 5b 68 64 72 5d 3b  age->aData[hdr];
9950: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
9960: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
9970: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
9980: 3d 3d 20 28 28 63 20 26 20 50 54 46 5f 4c 45 41  == ((c & PTF_LEA
9990: 46 29 21 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  F)!=0) );.    as
99a0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 7a 65 72  sert( pPage->zer
99b0: 6f 44 61 74 61 20 3d 3d 20 28 28 63 20 26 20 50  oData == ((c & P
99c0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 29  TF_ZERODATA)!=0)
99d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
99e0: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
99f0: 3d 3d 20 28 28 63 20 26 20 50 54 46 5f 4c 45 41  == ((c & PTF_LEA
9a00: 46 44 41 54 41 29 21 3d 30 29 20 29 3b 0a 20 20  FDATA)!=0) );.  
9a10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9a20: 3e 69 6e 74 4b 65 79 20 3d 3d 20 28 28 63 20 26  >intKey == ((c &
9a30: 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46   (PTF_INTKEY|PTF
9a40: 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 29 20  _LEAFDATA))!=0) 
9a50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9a60: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 3d  Page->hasData ==
9a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 21 28  .             !(
9a80: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
9a90: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
9aa0: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
9ab0: 61 74 61 29 29 20 29 3b 0a 20 20 20 20 61 73 73  ata)) );.    ass
9ac0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
9ad0: 4f 66 66 73 65 74 3d 3d 70 50 61 67 65 2d 3e 68  Offset==pPage->h
9ae0: 64 72 4f 66 66 73 65 74 2b 31 32 2d 34 2a 70 50  drOffset+12-4*pP
9af0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
9b00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9b10: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
9b20: 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 68  (&pPage->aData[h
9b30: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 7d 0a 20 20  dr+3]) );.  }.  
9b40: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
9b50: 61 74 61 3b 0a 20 20 6d 65 6d 73 65 74 28 75 73  ata;.  memset(us
9b60: 65 64 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a  ed, 0, usableSiz
9b70: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
9b80: 3c 68 64 72 2b 31 30 2d 70 50 61 67 65 2d 3e 6c  <hdr+10-pPage->l
9b90: 65 61 66 2a 34 3b 20 69 2b 2b 29 20 75 73 65 64  eaf*4; i++) used
9ba0: 5b 69 5d 20 3d 20 31 3b 0a 20 20 6e 46 72 65 65  [i] = 1;.  nFree
9bb0: 20 3d 20 30 3b 0a 20 20 70 63 20 3d 20 67 65 74   = 0;.  pc = get
9bc0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9bd0: 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  1]);.  while( pc
9be0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65   ){.    int size
9bf0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  ;.    assert( pc
9c00: 3e 30 20 26 26 20 70 63 3c 75 73 61 62 6c 65 53  >0 && pc<usableS
9c10: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 73 69 7a  ize-4 );.    siz
9c20: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
9c30: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 61  ta[pc+2]);.    a
9c40: 73 73 65 72 74 28 20 70 63 2b 73 69 7a 65 3c 3d  ssert( pc+size<=
9c50: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9c60: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
9c70: 0a 20 20 20 20 66 6f 72 28 69 3d 70 63 3b 20 69  .    for(i=pc; i
9c80: 3c 70 63 2b 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a  <pc+size; i++){.
9c90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73        assert( us
9ca0: 65 64 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  ed[i]==0 );.    
9cb0: 20 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20    used[i] = 1;. 
9cc0: 20 20 20 7d 0a 20 20 20 20 70 63 20 3d 20 67 65     }.    pc = ge
9cd0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
9ce0: 29 3b 0a 20 20 7d 0a 20 20 69 64 78 20 3d 20 30  );.  }.  idx = 0
9cf0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
9d00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
9d10: 5d 29 3b 0a 20 20 63 65 6c 6c 4c 69 6d 69 74 20  ]);.  cellLimit 
9d20: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9d30: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
9d40: 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
9d50: 74 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  t==0 .         |
9d60: 7c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d  | pPage->nFree==
9d70: 6e 46 72 65 65 2b 64 61 74 61 5b 68 64 72 2b 37  nFree+data[hdr+7
9d80: 5d 2b 63 65 6c 6c 4c 69 6d 69 74 2d 28 63 65 6c  ]+cellLimit-(cel
9d90: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 29  lOffset+2*nCell)
9da0: 20 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74   );.  cellOffset
9db0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
9dc0: 66 73 65 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  fset;.  for(i=0;
9dd0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
9de0: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20      int size;.  
9df0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
9e00: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9e10: 2b 32 2a 69 5d 29 3b 0a 20 20 20 20 61 73 73 65  +2*i]);.    asse
9e20: 72 74 28 20 70 63 3e 30 20 26 26 20 70 63 3c 75  rt( pc>0 && pc<u
9e30: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
9e40: 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69     size = cellSi
9e50: 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
9e60: 70 63 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  pc]);.    assert
9e70: 28 20 70 63 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  ( pc+size<=usabl
9e80: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 66 6f 72  eSize );.    for
9e90: 28 6a 3d 70 63 3b 20 6a 3c 70 63 2b 73 69 7a 65  (j=pc; j<pc+size
9ea0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
9eb0: 73 65 72 74 28 20 75 73 65 64 5b 6a 5d 3d 3d 30  sert( used[j]==0
9ec0: 20 29 3b 0a 20 20 20 20 20 20 75 73 65 64 5b 6a   );.      used[j
9ed0: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 1;.    }.  }
9ee0: 0a 20 20 66 6f 72 28 69 3d 63 65 6c 6c 4f 66 66  .  for(i=cellOff
9ef0: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 20 69 3c 63  set+2*nCell; i<c
9f00: 65 6c 6c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20  ellimit; i++){. 
9f10: 20 20 20 61 73 73 65 72 74 28 20 75 73 65 64 5b     assert( used[
9f20: 69 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 65  i]==0 );.    use
9f30: 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  d[i] = 1;.  }.  
9f40: 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 66 6f 72  nFree = 0;.  for
9f50: 28 69 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69  (i=0; i<usableSi
9f60: 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ze; i++){.    as
9f70: 73 65 72 74 28 20 75 73 65 64 5b 69 5d 3c 3d 31  sert( used[i]<=1
9f80: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 64   );.    if( used
9f90: 5b 69 5d 3d 3d 30 20 29 20 6e 46 72 65 65 2b 2b  [i]==0 ) nFree++
9fa0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9fb0: 6e 46 72 65 65 3d 3d 64 61 74 61 5b 68 64 72 2b  nFree==data[hdr+
9fc0: 37 5d 20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  7] );.  sqliteFr
9fd0: 65 65 28 75 73 65 64 29 3b 0a 7d 0a 23 64 65 66  ee(used);.}.#def
9fe0: 69 6e 65 20 70 61 67 65 49 6e 74 65 67 72 69 74  ine pageIntegrit
9ff0: 79 28 58 29 20 5f 70 61 67 65 49 6e 74 65 67 72  y(X) _pageIntegr
a000: 69 74 79 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  ity(X).#else.# d
a010: 65 66 69 6e 65 20 70 61 67 65 49 6e 74 65 67 72  efine pageIntegr
a020: 69 74 79 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  ity(X).#endif../
a030: 2a 20 41 20 62 75 6e 63 68 20 6f 66 20 61 73 73  * A bunch of ass
a040: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
a050: 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 74 72   to check the tr
a060: 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
a070: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
a080: 68 61 6e 64 6c 65 20 70 20 28 74 79 70 65 20 42  handle p (type B
a090: 74 72 65 65 2a 29 20 61 72 65 20 69 6e 74 65 72  tree*) are inter
a0a0: 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
a0b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62 74 72  ..*/.#define btr
a0c0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 20 5c  eeIntegrity(p) \
a0d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
a0e0: 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
a0f0: 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72  E || p->pBt->nTr
a100: 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e 70 42 74  ansaction<p->pBt
a110: 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73  ->nRef ); \.  as
a120: 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 6e 54  sert( p->pBt->nT
a130: 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d 3e 70  ransaction<=p->p
a140: 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20  Bt->nRef ); \.  
a150: 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
a160: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
a170: 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e  RANS_NONE || p->
a180: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
a190: 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61 73 73 65  n==0 ); \.  asse
a1a0: 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72  rt( p->pBt->inTr
a1b0: 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e  ansaction>=p->in
a1c0: 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a 2a 2a  Trans ); ../*.**
a1d0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
a1e0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
a1f0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
a200: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
a210: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
a220: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
a230: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
a240: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
a250: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
a260: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
a270: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
a280: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
a290: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
a2a0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
a2b0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
a2c0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
a2d0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a300: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
a310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a320: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
a330: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
a340: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a360: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
a370: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
a380: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
a390: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
a3c0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
a3d0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3f0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
a400: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
a410: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
a420: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
a430: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
a440: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
a450: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
a460: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
a470: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
a480: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
a490: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
a4a0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
a4b0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
a4c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
a4d0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
a4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a4f0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
a500: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
a510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
a520: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
a530: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
a540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
a550: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
a560: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
a570: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
a580: 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
a590: 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
a5a0: 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
a5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a5c0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
a5d0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
a5e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
a5f0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a600: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
a610: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
a620: 77 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d  w==0 );.  temp =
a630: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
a640: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
a650: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d  ize );.  if( tem
a660: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
a670: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61  LITE_NOMEM;.  da
a680: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
a690: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
a6a0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
a6b0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
a6c0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
a6d0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
a6e0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
a6f0: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
a700: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
a710: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
a720: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
a730: 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d  bleSize;.  brk =
a740: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a750: 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
a760: 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64  y(&temp[brk], &d
a770: 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
a780: 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62  Size - brk);.  b
a790: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
a7a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
a7b0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
a7c0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
a7d0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
a7e0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
a7f0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
a800: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
a810: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
a820: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73  (pAddr);.    ass
a830: 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70  ert( pc<pPage->p
a840: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a850: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
a860: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
a870: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
a880: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
a890: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72   memcpy(&data[br
a8a0: 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73  k], &temp[pc], s
a8b0: 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ize);.    put2by
a8c0: 74 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a  te(pAddr, brk);.
a8d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72    }.  assert( br
a8e0: 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  k>=cellOffset+2*
a8f0: 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62  nCell );.  put2b
a900: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a910: 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68  , brk);.  data[h
a920: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
a930: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
a940: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
a950: 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66  .  addr = cellOf
a960: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20  fset+2*nCell;.  
a970: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64  memset(&data[add
a980: 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29  r], 0, brk-addr)
a990: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74  ;.  sqliteFree(t
a9a0: 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  emp);.  return S
a9b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a9c0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
a9d0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
a9e0: 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   on a page..**.*
a9f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
aa00: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
aa10: 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69  Data[] of the fi
aa20: 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74  rst byte of.** t
aa30: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
aa40: 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69  n. Or return 0 i
aa50: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  f there is not e
aa60: 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70  nough free.** sp
aa70: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
aa80: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61  to satisfy the a
aa90: 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73  llocation reques
aaa0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
aab0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42  page contains nB
aac0: 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61  ytes of free spa
aad0: 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ce but does not 
aae0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65  contain.** nByte
aaf0: 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20  s of contiguous 
ab00: 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e  free space, then
ab10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75   this routine au
ab20: 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63  tomatically.** c
ab30: 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74  alls defragement
ab40: 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c  Page() to consol
ab50: 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73  idate all free s
ab60: 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20  pace before .** 
ab70: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e  allocating the n
ab80: 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61  ew chunk..*/.sta
ab90: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
aba0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
abb0: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29  Page, int nByte)
abc0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63  {.  int addr, pc
abd0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a  , hdr;.  int siz
abe0: 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a  e;.  int nFrag;.
abf0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74    int top;.  int
ac00: 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65   nCell;.  int ce
ac10: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69  llOffset;.  unsi
ac20: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
ac30: 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61  .  .  data = pPa
ac40: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73  ge->aData;.  ass
ac50: 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67 65  ert( sqlite3page
ac60: 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 64 61  r_iswriteable(da
ac70: 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ta) );.  assert(
ac80: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
ac90: 20 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e   if( nByte<4 ) n
aca0: 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20  Byte = 4;.  if( 
acb0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79  pPage->nFree<nBy
acc0: 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  te || pPage->nOv
acd0: 65 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72  erflow>0 ) retur
ace0: 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  n 0;.  pPage->nF
acf0: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
ad00: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
ad10: 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67  Offset;..  nFrag
ad20: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
ad30: 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29    if( nFrag<60 )
ad40: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
ad50: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
ad60: 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20  king for a slot 
ad70: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
ad80: 74 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a  tisfy the.    **
ad90: 20 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20   space request. 
ada0: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64  */.    addr = hd
adb0: 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  r+1;.    while( 
adc0: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
add0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
ade0: 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  {.      size = g
adf0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
ae00: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
ae10: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
ae20: 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c         if( size<
ae30: 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20  nByte+4 ){.     
ae40: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
ae50: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
ae60: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
ae70: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
ae80: 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e  nFrag + size - n
ae90: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Byte;.          
aea0: 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20  return pc;.     
aeb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aec0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
aed0: 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e  ta[pc+2], size-n
aee0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Byte);.         
aef0: 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a   return pc + siz
af00: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
af10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
af20: 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20     addr = pc;.  
af30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
af40: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
af50: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
af60: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
af70: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
af80: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
af90: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a  ontent area..  *
afa0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
afb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
afc0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
afd0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
afe0: 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ]);.  cellOffset
aff0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
b000: 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61  fset;.  if( nFra
b010: 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66  g>=60 || cellOff
b020: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20  set + 2*nCell > 
b030: 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20  top - nByte ){. 
b040: 20 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e     if( defragmen
b050: 74 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72  tPage(pPage) ) r
b060: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70  eturn 0;.    top
b070: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b080: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20  a[hdr+5]);.  }. 
b090: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b0a0: 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66   assert( cellOff
b0b0: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d  set + 2*nCell <=
b0c0: 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79   top );.  put2by
b0d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
b0e0: 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20   top);.  return 
b0f0: 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  top;.}../*.** Re
b100: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
b110: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
b120: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
b130: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
b140: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
b150: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
b160: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
b170: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
b180: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
b190: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
b1a0: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
b1b0: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
b1c0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
b1d0: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
b1e0: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
b1f0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
b200: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
b210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
b220: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
b230: 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74  pPage, int start
b240: 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69  , int size){.  i
b250: 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c  nt addr, pbegin,
b260: 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64   hdr;.  unsigned
b270: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
b280: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
b290: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b2a0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b2b0: 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  ( sqlite3pager_i
b2c0: 73 77 72 69 74 65 61 62 6c 65 28 64 61 74 61 29  swriteable(data)
b2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
b2e0: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
b2f0: 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
b300: 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61  leaf?0:4) );.  a
b310: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
b320: 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42  size)<=pPage->pB
b330: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
b340: 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20  .  if( size<4 ) 
b350: 73 69 7a 65 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20  size = 4;..  /* 
b360: 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61  Add the space ba
b370: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ck into the link
b380: 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  ed list of freeb
b390: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d  locks */.  hdr =
b3a0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b3b0: 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  t;.  addr = hdr 
b3c0: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  + 1;.  while( (p
b3d0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
b3e0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73  (&data[addr]))<s
b3f0: 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30  tart && pbegin>0
b400: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b410: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
b420: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
b430: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b440: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
b450: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
b460: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b470: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
b480: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
b490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 62   );.  assert( pb
b4a0: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
b4b0: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
b4c0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
b4d0: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
b4e0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
b4f0: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
b500: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
b510: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
b520: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
b530: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
b540: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
b550: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
b560: 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  ddr = pPage->hdr
b570: 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68  Offset + 1;.  wh
b580: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
b590: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
b5a0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
b5b0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b  nt pnext, psize;
b5c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
b5d0: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
b5e0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
b5f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b600: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
b610: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
b620: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
b630: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
b640: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
b650: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
b660: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
b670: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
b680: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
b690: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
b6a0: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
b6b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b6c0: 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61 67   frag<=data[pPag
b6d0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20  e->hdrOffset+7] 
b6e0: 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50  );.      data[pP
b6f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
b700: 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20 20  ] -= frag;.     
b710: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b720: 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79 74  pbegin], get2byt
b730: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 29  e(&data[pnext]))
b740: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
b750: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
b760: 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74 65  , pnext+get2byte
b770: 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29  (&data[pnext+2])
b780: 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65  -pbegin);.    }e
b790: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
b7a0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
b7b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
b7c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b7d0: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
b7e0: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
b7f0: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
b800: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
b810: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
b820: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
b830: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
b840: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
b850: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b860: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
b870: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
b880: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
b890: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
b8a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b8b0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74 32  dr+5]);.    put2
b8c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b8d0: 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79 74  ], top + get2byt
b8e0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
b8f0: 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ]));.  }.}../*.*
b900: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
b910: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
b920: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
b930: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
b940: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
b950: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
b960: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
b970: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
b980: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b990: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
b9a0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
b9b0: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
b9c0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
b9d0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
b9e0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
b9f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
ba00: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
ba10: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
ba20: 30 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  0) );.  pPage->i
ba30: 6e 74 4b 65 79 20 3d 20 28 66 6c 61 67 42 79 74  ntKey = (flagByt
ba40: 65 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c  e & (PTF_INTKEY|
ba50: 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d  PTF_LEAFDATA))!=
ba60: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f  0;.  pPage->zero
ba70: 44 61 74 61 20 3d 20 28 66 6c 61 67 42 79 74 65  Data = (flagByte
ba80: 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29   & PTF_ZERODATA)
ba90: 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  !=0;.  pPage->le
baa0: 61 66 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26  af = (flagByte &
bab0: 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20   PTF_LEAF)!=0;. 
bac0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
bad0: 53 69 7a 65 20 3d 20 34 2a 28 70 50 61 67 65 2d  Size = 4*(pPage-
bae0: 3e 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74  >leaf==0);.  pBt
baf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
bb00: 20 69 66 28 20 66 6c 61 67 42 79 74 65 20 26 20   if( flagByte & 
bb10: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a  PTF_LEAFDATA ){.
bb20: 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44      pPage->leafD
bb30: 61 74 61 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ata = 1;.    pPa
bb40: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
bb50: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
bb60: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
bb70: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
bb80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
bb90: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
bba0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
bbb0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
bbc0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
bbd0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
bbe0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
bbf0: 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  .  pPage->hasDat
bc00: 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72  a = !(pPage->zer
bc10: 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65  oData || (!pPage
bc20: 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d  ->leaf && pPage-
bc30: 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a  >leafData));.}..
bc40: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
bc50: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
bc60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
bc70: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
bc80: 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 20 70  ** The pParent p
bc90: 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65  arameter must be
bca0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
bcb0: 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a  e MemPage which.
bcc0: 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65 6e 74  ** is the parent
bcd0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 62 65 69   of the page bei
bce0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  ng initialized. 
bcf0: 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a   The root of a.*
bd00: 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70  * BTree has no p
bd10: 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72  arent and so for
bd20: 20 74 68 61 74 20 70 61 67 65 2c 20 70 50 61 72   that page, pPar
bd30: 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ent==NULL..**.**
bd40: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
bd50: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
bd60: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
bd70: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
bd80: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
bd90: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
bda0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
bdb0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
bdc0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
bdd0: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
bde0: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
bdf0: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
be00: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
be10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
be20: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
be30: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
be40: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
be50: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
be60: 63 20 69 6e 74 20 69 6e 69 74 50 61 67 65 28 0a  c int initPage(.
be70: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
be80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
be90: 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69  page to be initi
bea0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  alized */.  MemP
beb0: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
bec0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
bed0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
bee0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b   */.){.  int pc;
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
bf00: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
bf10: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
bf20: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
bf30: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
bf40: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
bf50: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
bf60: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
bf70: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
bf80: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
bf90: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
bfa0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
bfb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
bfc0: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
bfd0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
bfe0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
bff0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
c000: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
c010: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
c020: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
c030: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
c040: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
c050: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
c060: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
c070: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c080: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
c090: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
c0a0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
c0b0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c0c0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
c0d0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70  ent area */..  p
c0e0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
c0f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d  .  assert( pBt!=
c100: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c110: 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61  Parent==0 || pPa
c120: 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  rent->pBt==pBt )
c130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c140: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
c150: 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72  pager_pagenumber
c160: 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29  (pPage->aData) )
c170: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c180: 65 2d 3e 61 44 61 74 61 20 3d 3d 20 26 28 28 75  e->aData == &((u
c190: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50  nsigned char*)pP
c1a0: 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  age)[-pBt->pageS
c1b0: 69 7a 65 5d 20 29 3b 0a 20 20 69 66 28 20 70 50  ize] );.  if( pP
c1c0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50  age->pParent!=pP
c1d0: 61 72 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d  arent && (pPage-
c1e0: 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70  >pParent!=0 || p
c1f0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b  Page->isInit) ){
c200: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65  .    /* The pare
c210: 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e  nt page should n
c220: 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65  ever change unle
c230: 73 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  ss the file is c
c240: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
c250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c260: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
c270: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
c280: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
c290: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
c2a0: 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26  e->pParent==0 &&
c2b0: 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20   pParent!=0 ){. 
c2c0: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
c2d0: 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
c2e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
c2f0: 66 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  f(pParent->aData
c300: 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70  );.  }.  hdr = p
c310: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c320: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
c330: 3e 61 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65  >aData;.  decode
c340: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
c350: 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65  a[hdr]);.  pPage
c360: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
c370: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
c380: 66 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65  ft = 0;.  usable
c390: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
c3a0: 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d  leSize;.  pPage-
c3b0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
c3c0: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
c3d0: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
c3e0: 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  eaf;.  top = get
c3f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c400: 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  5]);.  pPage->nC
c410: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
c420: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
c430: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
c440: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
c450: 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20  .    /* To many 
c460: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
c470: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
c480: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
c490: 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
c4a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c4b0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
c4c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
c4d0: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26  && pParent!=0 &&
c4e0: 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d   pParent->pgno!=
c4f0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  1 ){.    /* All 
c500: 70 61 67 65 73 20 6d 75 73 74 20 68 61 76 65 20  pages must have 
c510: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
c520: 6c 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f  l, except for ro
c530: 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ot pages */.    
c540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c550: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
c560: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
c570: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
c580: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
c590: 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
c5a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
c5b0: 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
c5c0: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28  hdr+7] + top - (
c5d0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
c5e0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
c5f0: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
c600: 20 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a     int next, siz
c610: 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  e;.    if( pc>us
c620: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
c630: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
c640: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
c650: 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
c660: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c670: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
c680: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
c690: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
c6a0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
c6b0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
c6c0: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
c6d0: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
c6e0: 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72  3 ){.      /* Fr
c6f0: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
c700: 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  e in accending o
c710: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rder */.      re
c720: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c730: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
c740: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69  .    nFree += si
c750: 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78  ze;.    pc = nex
c760: 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  t;.  }.  pPage->
c770: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20  nFree = nFree;. 
c780: 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62   if( nFree>=usab
c790: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  leSize ){.    /*
c7a0: 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e   Free space cann
c7b0: 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20  ot exceed total 
c7c0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  page size */.   
c7d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c7e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c7f0: 7d 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  }..  pPage->isIn
c800: 69 74 20 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e  it = 1;.  pageIn
c810: 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a  tegrity(pPage);.
c820: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c830: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
c840: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
c850: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
c860: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
c870: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
c880: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
c890: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
c8a0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c8b0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
c8c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c8d0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
c8e0: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
c8f0: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
c900: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
c910: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c920: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
c930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c940: 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65  3pager_pagenumbe
c950: 72 28 64 61 74 61 29 3d 3d 70 50 61 67 65 2d 3e  r(data)==pPage->
c960: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
c970: 28 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67  ( &data[pBt->pag
c980: 65 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67  eSize] == (unsig
c990: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20  ned char*)pPage 
c9a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c9b0: 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
c9c0: 65 61 62 6c 65 28 64 61 74 61 29 20 29 3b 0a 20  eable(data) );. 
c9d0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
c9e0: 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
c9f0: 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
ca00: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61   data[hdr] = fla
ca10: 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
ca20: 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67  r + 8 + 4*((flag
ca30: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b  s&PTF_LEAF)==0);
ca40: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
ca50: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
ca60: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
ca70: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
ca80: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
ca90: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
caa0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
cab0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
cac0: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
cad0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
cae0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
caf0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
cb00: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
cb10: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
cb20: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
cb30: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  0;.  pPage->idxS
cb40: 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  hift = 0;.  pPag
cb50: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
cb60: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cb70: 31 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69  1;.  pageIntegri
cb80: 74 79 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  ty(pPage);.}../*
cb90: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
cba0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
cbb0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
cbc0: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
cbd0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
cbe0: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
cbf0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
cc00: 74 20 67 65 74 50 61 67 65 28 42 74 53 68 61 72  t getPage(BtShar
cc10: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
cc20: 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  no, MemPage **pp
cc30: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
cc40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
cc50: 20 2a 61 44 61 74 61 3b 0a 20 20 4d 65 6d 50 61   *aData;.  MemPa
cc60: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 63 20  ge *pPage;.  rc 
cc70: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
cc80: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
cc90: 70 67 6e 6f 2c 20 28 76 6f 69 64 2a 2a 29 26 61  pgno, (void**)&a
cca0: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20  Data);.  if( rc 
ccb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
ccc0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
ccd0: 29 26 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  )&aData[pBt->pag
cce0: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
ccf0: 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61 3b 0a  >aData = aData;.
cd00: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
cd10: 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  Bt;.  pPage->pgn
cd20: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67  o = pgno;.  pPag
cd30: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
cd40: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
cd50: 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61  100 : 0;.  *ppPa
cd60: 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65  ge = pPage;.  re
cd70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
cd90: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
cda0: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
cdb0: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
cdc0: 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61  ine.** is just a
cdd0: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
cde0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
cdf0: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  rate calls to.**
ce00: 20 67 65 74 50 61 67 65 28 29 20 61 6e 64 20 69   getPage() and i
ce10: 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  nitPage()..*/.st
ce20: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
ce30: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
ce40: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ce50: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
ce60: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
ce70: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
ce80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
ce90: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
cea0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ceb0: 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
cec0: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
ced0: 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d  er here */.  Mem
cee0: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20  Page *pParent   
cef0: 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74    /* Parent of t
cf00: 68 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  he page */.){.  
cf10: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 67  int rc;.  if( pg
cf20: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
cf30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cf40: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20  PT_BKPT; .  }.  
cf50: 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
cf60: 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 29 3b  , pgno, ppPage);
cf70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
cf80: 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65  E_OK && (*ppPage
cf90: 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
cfa0: 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67      rc = initPag
cfb0: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
cfc0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
cfd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
cfe0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
cff0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
d000: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
d010: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
d020: 63 61 6c 6c 20 74 6f 20 67 65 74 50 61 67 65 2e  call to getPage.
d030: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d040: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
d050: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
d060: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
d070: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
d080: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
d090: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
d0a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70  ;.    assert( &p
d0b0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
d0c0: 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
d0d0: 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ]==(unsigned cha
d0e0: 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  r*)pPage );.    
d0f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
d100: 65 66 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  ef(pPage->aData)
d110: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d120: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d130: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72  alled when the r
d140: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
d150: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 72 65 61  or a page.** rea
d160: 63 68 65 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e  ches zero.  We n
d170: 65 65 64 20 74 6f 20 75 6e 72 65 66 20 74 68 65  eed to unref the
d180: 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72   pParent pointer
d190: 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61   when that.** ha
d1a0: 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ppens..*/.static
d1b0: 20 76 6f 69 64 20 70 61 67 65 44 65 73 74 72 75   void pageDestru
d1c0: 63 74 6f 72 28 76 6f 69 64 20 2a 70 44 61 74 61  ctor(void *pData
d1d0: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
d1e0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
d1f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
d200: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
d210: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
d220: 50 61 67 65 2a 29 26 28 28 63 68 61 72 2a 29 70  Page*)&((char*)p
d230: 44 61 74 61 29 5b 70 61 67 65 53 69 7a 65 5d 3b  Data)[pageSize];
d240: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
d250: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d  arent ){.    Mem
d260: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20  Page *pParent = 
d270: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
d280: 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
d290: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  nt = 0;.    rele
d2a0: 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29  asePage(pParent)
d2b0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69  ;.  }.  pPage->i
d2c0: 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  sInit = 0;.}../*
d2d0: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
d2e0: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
d2f0: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
d300: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
d310: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
d320: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
d330: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
d340: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
d350: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
d360: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
d370: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
d380: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
d390: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d3a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
d3b0: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
d3c0: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
d3d0: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
d3e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
d3f0: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
d400: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
d410: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
d420: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
d430: 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e  (void *pData, in
d440: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d  t pageSize){.  M
d450: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
d460: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
d470: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
d480: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
d490: 2a 29 26 28 28 63 68 61 72 2a 29 70 44 61 74 61  *)&((char*)pData
d4a0: 29 5b 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 69  )[pageSize];.  i
d4b0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d4c0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
d4d0: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
d4e0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
d4f0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  Page->pParent);.
d500: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
d510: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
d520: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
d530: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
d540: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d550: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
d560: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61  ame is NULL.** a
d570: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69   new database wi
d580: 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65  th a random name
d590: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
d5a0: 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65  is randomly name
d5b0: 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  d.** database fi
d5c0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
d5d0: 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ed when sqlite3B
d5e0: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
d5f0: 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  alled..*/.int sq
d600: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
d610: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
d620: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
d630: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
d640: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
d650: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
d660: 20 73 71 6c 69 74 65 33 20 2a 70 53 71 6c 69 74   sqlite3 *pSqlit
d670: 65 2c 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f  e,       /* Asso
d680: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
d690: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
d6a0: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
d6b0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
d6c0: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
d6d0: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
d6e0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d700: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  Options */.){.  
d710: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
d720: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
d730: 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
d740: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
d750: 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
d760: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
d770: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d780: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52  int rc;.  int nR
d790: 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e  eserve;.  unsign
d7a0: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
d7b0: 72 5b 31 30 30 5d 3b 0a 23 69 66 20 21 64 65 66  r[100];.#if !def
d7c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d7d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
d7e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
d7f0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
d800: 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
d810: 61 20 2a 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69  a *pTsdro;.#endi
d820: 66 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  f..  /* Set the 
d830: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
d840: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
d850: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
d860: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
d870: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
d880: 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68  sed database. Th
d890: 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c  is symbol is onl
d8a0: 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20  y required if.  
d8b0: 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ** either of the
d8c0: 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20   shared-data or 
d8d0: 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75  autovacuum featu
d8e0: 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64  res are compiled
d8f0: 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20   .  ** into the 
d900: 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69  library..  */.#i
d910: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
d920: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
d930: 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  CHE) || !defined
d940: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54  (SQLITE_OMIT_AUT
d950: 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65  OVACUUM).  #ifde
d960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
d970: 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69  MORYDB.  const i
d980: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 21 7a 46  nt isMemdb = !zF
d990: 69 6c 65 6e 61 6d 65 3b 0a 20 20 23 65 6c 73 65  ilename;.  #else
d9a0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
d9b0: 65 6d 64 62 20 3d 20 21 7a 46 69 6c 65 6e 61 6d  emdb = !zFilenam
d9c0: 65 20 7c 7c 20 28 73 74 72 63 6d 70 28 7a 46 69  e || (strcmp(zFi
d9d0: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
d9e0: 3a 22 29 3f 30 3a 31 29 3b 0a 20 20 23 65 6e 64  :")?0:1);.  #end
d9f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d  if.#endif..  p =
da00: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
da10: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
da20: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
da30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
da40: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
da50: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
da60: 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d  ;.  p->pSqlite =
da70: 20 70 53 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20   pSqlite;..  /* 
da80: 54 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 20 65  Try to find an e
da90: 78 69 73 74 69 6e 67 20 42 74 72 65 65 20 73 74  xisting Btree st
daa0: 72 75 63 74 75 72 65 20 6f 70 65 6e 65 64 20 6f  ructure opened o
dab0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  n zFilename. */.
dac0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
dad0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
dae0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
daf0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
db00: 49 53 4b 49 4f 29 0a 20 20 70 54 73 64 72 6f 20  ISKIO).  pTsdro 
db10: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
db20: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
db30: 20 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65   if( pTsdro->use
db40: 53 68 61 72 65 64 44 61 74 61 20 26 26 20 7a 46  SharedData && zF
db50: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
db60: 6d 64 62 20 29 7b 0a 20 20 20 20 63 68 61 72 20  mdb ){.    char 
db70: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
db80: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
db90: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
dba0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 75 6c  );.    if( !zFul
dbb0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
dbc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29     sqliteFree(p)
dbd0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
dbe0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
dbf0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70   }.    for(pBt=p
dc00: 54 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70  Tsdro->pBtree; p
dc10: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
dc20: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
dc30: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
dc40: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
dc50: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
dc60: 61 6d 65 2c 20 73 71 6c 69 74 65 33 70 61 67 65  ame, sqlite3page
dc70: 72 5f 66 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  r_filename(pBt->
dc80: 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20  pPager)) ){.    
dc90: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
dca0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 42 74 72  ;.        *ppBtr
dcb0: 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ee = p;.        
dcc0: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
dcd0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
dce0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
dcf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
dd00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
dd10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
dd20: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
dd30: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
dd40: 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  f..  /*.  ** The
dd50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
dd60: 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
dd70: 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
dd80: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
dd90: 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  re.  ** the righ
dda0: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
ddb0: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
ddc0: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
ddd0: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20  hat result.  ** 
dde0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
ddf0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
de00: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f  chitecture..  */
de10: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
de20: 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 61  f(i64)==8 );.  a
de30: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
de40: 34 29 3d 3d 38 20 29 3b 0a 20 20 61 73 73 65 72  4)==8 );.  asser
de50: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
de60: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  4 );.  assert( s
de70: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
de80: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
de90: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20  f(Pgno)==4 );.. 
dea0: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pBt = sqliteMal
deb0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  loc( sizeof(*pBt
dec0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d  ) );.  if( pBt==
ded0: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 74 72 65  0 ){.    *ppBtre
dee0: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
def0: 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  eFree(p);.    re
df00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
df10: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
df20: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28  lite3pager_open(
df30: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
df40: 69 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53  ilename, EXTRA_S
df50: 49 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  IZE, flags);.  i
df60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
df70: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
df80: 3e 70 50 61 67 65 72 20 29 20 73 71 6c 69 74 65  >pPager ) sqlite
df90: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 70 42 74  3pager_close(pBt
dfa0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73  ->pPager);.    s
dfb0: 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a  qliteFree(pBt);.
dfc0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
dfd0: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
dfe0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
dff0: 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42 74  rc;.  }.  p->pBt
e000: 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74   = pBt;..  sqlit
e010: 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74  e3pager_set_dest
e020: 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67  ructor(pBt->pPag
e030: 65 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74  er, pageDestruct
e040: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  or);.  sqlite3pa
e050: 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72  ger_set_reiniter
e060: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
e070: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42 74  geReinit);.  pBt
e080: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
e090: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
e0a0: 3b 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  ;.  pBt->readOnl
e0b0: 79 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  y = sqlite3pager
e0c0: 5f 69 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  _isreadonly(pBt-
e0d0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
e0e0: 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69  te3pager_read_fi
e0f0: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
e100: 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 7a 44 62  ager, sizeof(zDb
e110: 48 65 61 64 65 72 29 2c 20 7a 44 62 48 65 61 64  Header), zDbHead
e120: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  er);.  pBt->page
e130: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
e140: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
e150: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
e160: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
e170: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
e180: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
e190: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
e1a0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
e1b0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
e1c0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
e1d0: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
e1e0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
e1f0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
e200: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
e210: 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  25% */.    pBt->
e220: 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33  minEmbedFrac = 3
e230: 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f  2;   /* 12.5% */
e240: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  .    pBt->minLea
e250: 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f  fFrac = 32;    /
e260: 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64  * 12.5% */.#ifnd
e270: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e280: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a  UTOVACUUM.    /*
e290: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
e2a0: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
e2b0: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
e2c0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
e2d0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f 20   then.    ** do 
e2e0: 6e 6f 74 20 73 65 74 20 74 68 65 20 61 75 74 6f  not set the auto
e2f0: 2d 76 61 63 75 75 6d 20 66 6c 61 67 2c 20 65 76  -vacuum flag, ev
e300: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46  en if SQLITE_DEF
e310: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  AULT_AUTOVACUUM.
e320: 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2e 20      ** is true. 
e330: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
e340: 64 2c 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  d, if SQLITE_OMI
e350: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
e360: 65 65 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20 20  een defined,.   
e370: 20 2a 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72   ** then ":memor
e380: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 20 72 65  y:" is just a re
e390: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
e3a0: 20 52 65 73 70 65 63 74 20 74 68 65 20 61 75 74   Respect the aut
e3b0: 6f 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  o-vacuum.    ** 
e3c0: 64 65 66 61 75 6c 74 20 69 6e 20 74 68 69 73 20  default in this 
e3d0: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
e3e0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
e3f0: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
e400: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
e410: 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  uum = SQLITE_DEF
e420: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b  AULT_AUTOVACUUM;
e430: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e440: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
e450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
e460: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
e470: 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  r[20];.    pBt->
e480: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a  maxEmbedFrac = z
e490: 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20  DbHeader[21];.  
e4a0: 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46    pBt->minEmbedF
e4b0: 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rac = zDbHeader[
e4c0: 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  22];.    pBt->mi
e4d0: 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48  nLeafFrac = zDbH
e4e0: 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70  eader[23];.    p
e4f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
e500: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
e510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e520: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
e530: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
e540: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
e550: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
e560: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
e570: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
e580: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
e590: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73   nReserve;.  ass
e5a0: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
e5b0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
e5c0: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
e5d0: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
e5e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
e5f0: 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28 70  r_set_pagesize(p
e600: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
e610: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69 66  >pageSize);..#if
e620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
e640: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 62  /* Add the new b
e650: 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69 6e 6b  tree to the link
e660: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
e670: 20 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 70   at ThreadData.p
e680: 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68 65 72  Btree..  ** Ther
e690: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
e6a0: 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6d  hat a malloc() m
e6b0: 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65 20 6f  ay fail inside o
e6c0: 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71 6c 69  f the .  ** sqli
e6d0: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
e6e0: 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54 68 72  call, as the Thr
e6f0: 65 61 64 44 61 74 61 20 73 74 72 75 63 74 75 72  eadData structur
e700: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
e710: 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 61 6c  ady.  ** been al
e720: 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54 73 64  located for pTsd
e730: 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ro->useSharedDat
e740: 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  a to be non-zero
e750: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 73  ..  */.  if( pTs
e760: 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61  dro->useSharedDa
e770: 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20  ta && zFilename 
e780: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
e790: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
e7a0: 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b 0a  pTsdro->pBtree;.
e7b0: 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61      sqlite3Threa
e7c0: 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65 65 20  dData()->pBtree 
e7d0: 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  = pBt;.  }.#endi
e7e0: 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20  f.  pBt->nRef = 
e7f0: 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  1;.  *ppBtree = 
e800: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
e810: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e820: 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
e830: 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
e840: 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
e850: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
e860: 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
e870: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
e880: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
e890: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
e8a0: 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r;..#ifndef SQLI
e8b0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e8c0: 41 43 48 45 0a 20 20 54 68 72 65 61 64 44 61 74  ACHE.  ThreadDat
e8d0: 61 20 2a 70 54 73 64 3b 0a 23 65 6e 64 69 66 0a  a *pTsd;.#endif.
e8e0: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
e8f0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
e900: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
e910: 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 70 42 74   */.  pCur = pBt
e920: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
e930: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
e940: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
e950: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
e960: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
e970: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
e980: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
e990: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
e9a0: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
e9b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
e9c0: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
e9d0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
e9e0: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
e9f0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
ea00: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
ea10: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
ea20: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
ea30: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
ea40: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
ea50: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
ea60: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
ea70: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  k(p);.  sqliteFr
ea80: 65 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ee(p);..#ifndef 
ea90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
eaa0: 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
eab0: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
eac0: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
ead0: 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
eae0: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
eaf0: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
eb00: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
eb10: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
eb20: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
eb30: 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
eb40: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
eb50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
eb60: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
eb70: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
eb80: 66 28 20 70 42 74 2d 3e 6e 52 65 66 20 29 7b 0a  f( pBt->nRef ){.
eb90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eba0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
ebb0: 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65  Remove the share
ebc0: 64 2d 62 74 72 65 65 20 66 72 6f 6d 20 74 68 65  d-btree from the
ebd0: 20 74 68 72 65 61 64 20 77 69 64 65 20 6c 69 73   thread wide lis
ebe0: 74 2e 20 43 61 6c 6c 20 0a 20 20 2a 2a 20 54 68  t. Call .  ** Th
ebf0: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
ec00: 28 29 20 61 6e 64 20 74 68 65 6e 20 63 61 73 74  () and then cast
ec10: 20 61 77 61 79 20 74 68 65 20 63 6f 6e 73 74 20   away the const 
ec20: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
ec30: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
ec40: 20 61 76 6f 69 64 20 61 6c 6c 6f 63 61 74 69 6e   avoid allocatin
ec50: 67 20 74 68 72 65 61 64 20 64 61 74 61 20 69 66  g thread data if
ec60: 20 69 74 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c   it is not reall
ec70: 79 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  y required..  */
ec80: 0a 20 20 70 54 73 64 20 3d 20 28 54 68 72 65 61  .  pTsd = (Threa
ec90: 64 44 61 74 61 20 2a 29 73 71 6c 69 74 65 33 54  dData *)sqlite3T
eca0: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
ecb0: 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73 64 2d  y();.  if( pTsd-
ecc0: 3e 70 42 74 72 65 65 3d 3d 70 42 74 20 29 7b 0a  >pBtree==pBt ){.
ecd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73 64      assert( pTsd
ece0: 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  ==sqlite3ThreadD
ecf0: 61 74 61 28 29 20 29 3b 0a 20 20 20 20 70 54 73  ata() );.    pTs
ed00: 64 2d 3e 70 42 74 72 65 65 20 3d 20 70 42 74 2d  d->pBtree = pBt-
ed10: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
ed20: 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
ed30: 50 72 65 76 3b 0a 20 20 20 20 66 6f 72 28 70 50  Prev;.    for(pP
ed40: 72 65 76 3d 70 54 73 64 2d 3e 70 42 74 72 65 65  rev=pTsd->pBtree
ed50: 3b 20 70 50 72 65 76 20 26 26 20 70 50 72 65 76  ; pPrev && pPrev
ed60: 2d 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20 70 50  ->pNext!=pBt; pP
ed70: 72 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65 78 74  rev=pPrev->pNext
ed80: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 65 76  );.    if( pPrev
ed90: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
eda0: 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54  ( pTsd==sqlite3T
edb0: 68 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20  hreadData() );. 
edc0: 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78       pPrev->pNex
edd0: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
ede0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
edf0: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65  ..  /* Close the
ee00: 20 70 61 67 65 72 20 61 6e 64 20 66 72 65 65 20   pager and free 
ee10: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
ee20: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
ee30: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
ee40: 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74  ursor );.  sqlit
ee50: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 70 42  e3pager_close(pB
ee60: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
ee70: 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
ee80: 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
ee90: 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 78  ma ){.    pBt->x
eea0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
eeb0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
eec0: 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 2d 3e  sqliteFree(pBt->
eed0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
eee0: 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20 20 72  teFree(pBt);.  r
eef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ef00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
ef10: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
ef20: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
ef30: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
ef40: 74 65 33 42 74 72 65 65 53 65 74 42 75 73 79 48  te3BtreeSetBusyH
ef50: 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a 70 2c  andler(Btree *p,
ef60: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 48   BusyHandler *pH
ef70: 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53 68 61  andler){.  BtSha
ef80: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ef90: 74 3b 0a 20 20 70 42 74 2d 3e 70 42 75 73 79 48  t;.  pBt->pBusyH
efa0: 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64 6c 65  andler = pHandle
efb0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  r;.  sqlite3page
efc0: 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65  r_set_busyhandle
efd0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
efe0: 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65 74 75  Handler);.  retu
eff0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f000: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
f010: 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
f020: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
f030: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
f040: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
f050: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
f060: 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
f070: 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
f080: 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
f090: 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
f0a0: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
f0b0: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
f0c0: 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
f0d0: 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
f0e0: 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
f0f0: 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
f100: 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
f110: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
f120: 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
f130: 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
f140: 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
f150: 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
f160: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
f170: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
f180: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
f190: 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
f1a0: 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
f1b0: 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
f1c0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
f1d0: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
f1e0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
f1f0: 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
f200: 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
f210: 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
f220: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
f230: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
f240: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
f250: 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
f260: 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
f270: 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
f280: 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
f290: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
f2a0: 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
f2b0: 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
f2c0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
f2d0: 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
f2e0: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
f2f0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f300: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
f310: 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68  e3pager_set_cach
f320: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
f330: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 72 65  r, mxPage);.  re
f340: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f350: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
f360: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
f370: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
f380: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
f390: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
f3a0: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
f3b0: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
f3c0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
f3d0: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
f3e0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
f3f0: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
f400: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
f410: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
f420: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
f430: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
f440: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
f450: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
f460: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
f470: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
f480: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
f490: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
f4a0: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
f4b0: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
f4c0: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
f4d0: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
f4e0: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
f4f0: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
f500: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
f510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f520: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
f530: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
f540: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
f550: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
f560: 6c 65 76 65 6c 29 7b 0a 20 20 42 74 53 68 61 72  level){.  BtShar
f570: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
f580: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
f590: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
f5a0: 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
f5b0: 65 76 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  evel);.  return 
f5c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
f5d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
f5e0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
f5f0: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
f600: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
f610: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
f620: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
f630: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
f640: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
f650: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
f660: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
f670: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
f680: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
f690: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
f6a0: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
f6b0: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
f6c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
f6d0: 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28 70 42 74  pager_nosync(pBt
f6e0: 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69  ->pPager);.}..#i
f6f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
f700: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
f710: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
f720: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
f730: 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
f740: 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
f750: 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
f760: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
f770: 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
f780: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
f790: 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
f7a0: 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
f7b0: 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
f7c0: 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
f7d0: 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
f7e0: 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
f7f0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
f800: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
f810: 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
f820: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
f830: 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
f840: 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
f850: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
f860: 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
f870: 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
f880: 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
f890: 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
f8a0: 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
f8b0: 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
f8c0: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
f8d0: 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
f8e0: 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
f8f0: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
f900: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
f910: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
f920: 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
f930: 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
f940: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
f950: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
f960: 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
f970: 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
f980: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
f990: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
f9a0: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
f9b0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
f9c0: 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
f9d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f9e0: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
f9f0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
fa00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fa10: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
fa20: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
fa30: 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
fa40: 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
fa50: 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
fa60: 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  leSize;.  }.  if
fa70: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
fa80: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
fa90: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
faa0: 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
fab0: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
fac0: 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
fad0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
fae0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
faf0: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
fb00: 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
fb10: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
fb20: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 71 6c  ->pageSize = sql
fb30: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61  ite3pager_set_pa
fb40: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
fb50: 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  er, pageSize);. 
fb60: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
fb70: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
fb80: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
fb90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fba0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
fbb0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
fbc0: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
fbd0: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
fbe0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
fbf0: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
fc00: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
fc10: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
fc20: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
fc30: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
fc40: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
fc50: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
fc60: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
fc70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
fc80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fc90: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
fca0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
fcb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
fcc0: 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
fcd0: 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
fce0: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
fcf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
fd00: 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
fd10: 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
fd20: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
fd30: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
fd40: 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
fd50: 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
fd60: 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
fd70: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
fd80: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
fd90: 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
fda0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
fdb0: 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
fdc0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
fdd0: 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
fde0: 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
fdf0: 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
fe00: 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
fe10: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fe20: 3d 20 70 2d 3e 70 42 74 3b 3b 0a 23 69 66 64 65  = p->pBt;;.#ifde
fe30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fe40: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
fe50: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
fe60: 59 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70  Y;.#else.  if( p
fe70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
fe80: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
fe90: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
fea0: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f  .  }.  pBt->auto
feb0: 56 61 63 75 75 6d 20 3d 20 28 61 75 74 6f 56 61  Vacuum = (autoVa
fec0: 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 72 65 74  cuum?1:0);.  ret
fed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
fee0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
fef0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
ff00: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
ff10: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
ff20: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
ff30: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
ff40: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
ff50: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
ff60: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
ff70: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
ff80: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
ff90: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ffa0: 55 4d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  UM.  return 0;.#
ffb0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 2d  else.  return p-
ffc0: 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
ffd0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
ffe0: 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
fff0: 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
10000 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10010 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
10020 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
10030 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
10040 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
10050 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10060 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
10070 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
10080 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
10090 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
100a0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
100b0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
100c0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
100d0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
100e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
100f0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
10100 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
10110 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
10120 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
10130 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
10140 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
10150 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6c 6f  if there is a lo
10160 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 76  cking protocol v
10170 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  iolation..*/.sta
10180 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
10190 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
101a0 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65  {.  int rc, page
101b0 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Size;.  MemPage 
101c0 2a 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70  *pPage1;.  if( p
101d0 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74  Bt->pPage1 ) ret
101e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
101f0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
10200 74 2c 20 31 2c 20 26 70 50 61 67 65 31 29 3b 0a  t, 1, &pPage1);.
10210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10220 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
10230 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  .  ..  /* Do som
10240 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
10250 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
10260 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
10270 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
10280 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
10290 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
102a0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
102b0 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
102c0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  r_pagecount(pBt-
102d0 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20  >pPager)>0 ){.  
102e0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
102f0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
10300 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
10310 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
10320 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
10330 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
10340 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10350 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
10360 3e 31 20 7c 7c 20 70 61 67 65 31 5b 31 39 5d 3e  >1 || page1[19]>
10370 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
10380 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10390 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
103a0 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
103b0 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20  (&page1[16]);.  
103c0 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
103d0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
103e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
103f0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
10400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
10410 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
10420 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  7)==0 );.    pBt
10430 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
10440 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
10450 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
10460 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
10470 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ];.    if( pBt->
10480 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29  usableSize<500 )
10490 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
104a0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
104b0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d      }.    pBt->m
104c0 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61  axEmbedFrac = pa
104d0 67 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74  ge1[21];.    pBt
104e0 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
104f0 20 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20   page1[22];.    
10500 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
10510 20 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69   = page1[23];.#i
10520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10530 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
10540 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
10550 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
10560 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
10570 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
10580 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
10590 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
105a0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
105b0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
105c0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
105d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
105e0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
105f0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
10600 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
10610 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
10620 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
10630 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
10640 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
10650 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
10660 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
10670 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
10680 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
10690 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
106a0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
106b0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
106c0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
106d0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
106e0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
106f0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
10700 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
10710 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
10720 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
10730 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
10740 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
10750 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
10760 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
10770 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
10780 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
10790 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
107a0 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
107b0 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
107c0 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
107d0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
107e0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
107f0 2d 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62  -12)*pBt->maxEmb
10800 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b  edFrac/255 - 23;
10810 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
10820 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10830 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
10840 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20  EmbedFrac/255 - 
10850 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
10860 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
10870 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
10880 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
10890 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
108a0 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61  *pBt->minLeafFra
108b0 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66  c/255 - 23;.  if
108c0 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e  ( pBt->minLocal>
108d0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c  pBt->maxLocal ||
108e0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30   pBt->maxLocal<0
108f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   ){.    goto pag
10900 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
10910 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
10920 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
10930 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
10940 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
10950 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
10960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10970 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
10980 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
10990 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
109a0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
109b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
109c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
109d0 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
109e0 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65  lockBtree() exce
109f0 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20  pt that it also 
10a00 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62  invokes the.** b
10a10 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
10a20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f  there is lock co
10a30 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ntention..*/.sta
10a40 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
10a50 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65  eWithRetry(Btree
10a60 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72   *pRef){.  int r
10a70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10a80 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61   if( pRef->inTra
10a90 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
10aa0 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73  {.    u8 inTrans
10ab0 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70  action = pRef->p
10ac0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10ad0 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65  n;.    btreeInte
10ae0 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20  grity(pRef);.   
10af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10b00 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65  eeBeginTrans(pRe
10b10 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d  f, 0);.    pRef-
10b20 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
10b30 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74  ion = inTransact
10b40 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69  ion;.    pRef->i
10b50 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
10b60 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ONE;.    if( rc=
10b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10b80 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e      pRef->pBt->n
10b90 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
10ba0 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e     }.    btreeIn
10bb0 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
10bc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10bd0 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  }.       ../*.**
10be0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
10bf0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
10c00 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
10c10 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
10c20 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
10c30 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
10c40 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
10c50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
10c60 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
10c70 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
10c80 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
10c90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10ca0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
10cb0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
10cc0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
10cd0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
10ce0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
10cf0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c  tanding cursors,
10d00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10d10 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
10d20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
10d30 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
10d40 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
10d50 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
10d60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
10d70 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
10d80 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
10d90 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  ){.  if( pBt->in
10da0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
10db0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
10dc0 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42  pCursor==0 && pB
10dd0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
10de0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
10df0 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b  ge1->aData==0 ){
10e00 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
10e10 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
10e20 67 65 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ge1;.      pPage
10e30 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a  ->aData = &((u8*
10e40 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61  )pPage)[-pBt->pa
10e50 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 70  geSize];.      p
10e60 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
10e70 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67  .      pPage->pg
10e80 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  no = 1;.    }.  
10e90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
10ea0 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
10eb0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
10ec0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
10ed0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
10ee0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
10ef0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
10f00 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
10f10 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
10f20 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
10f30 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
10f40 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10f50 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
10f60 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
10f70 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
10f80 63 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  c;.  if( sqlite3
10f90 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
10fa0 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
10fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10fc0 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  K;.  pP1 = pBt->
10fd0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
10fe0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
10ff0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
11000 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
11010 61 67 65 72 5f 77 72 69 74 65 28 64 61 74 61 29  ager_write(data)
11020 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
11030 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
11040 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
11050 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
11060 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
11070 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
11080 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
11090 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
110a0 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67  ta[16], pBt->pag
110b0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31  eSize);.  data[1
110c0 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
110d0 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32  9] = 1;.  data[2
110e0 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  0] = pBt->pageSi
110f0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
11100 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d  Size;.  data[21]
11110 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64   = pBt->maxEmbed
11120 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d  Frac;.  data[22]
11130 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64   = pBt->minEmbed
11140 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d  Frac;.  data[23]
11150 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46   = pBt->minLeafF
11160 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  rac;.  memset(&d
11170 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
11180 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
11190 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
111a0 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
111b0 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
111c0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
111d0 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
111e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
111f0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
11200 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 70  oVacuum ){.    p
11210 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
11220 20 2b 20 34 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d   + 4*4], 1);.  }
11230 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
11240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11250 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
11260 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
11270 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
11280 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
11290 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
112a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
112b0 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
112c0 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
112d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
112e0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
112f0 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
11300 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
11310 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
11320 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
11330 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
11340 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
11350 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
11360 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
11370 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
11380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
11390 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
113a0 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
113b0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
113c0 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
113d0 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
113e0 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
113f0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
11400 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
11410 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
11420 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
11430 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
11440 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
11450 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
11460 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
11470 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
11480 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
11490 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
114a0 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
114b0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
114c0 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
114d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
114e0 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
114f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
11500 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
11510 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11520 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
11530 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11540 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
11550 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11560 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
11570 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
11580 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
11590 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
115a0 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
115b0 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
115c0 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
115d0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
115e0 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
115f0 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
11600 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
11610 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
11620 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
11630 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
11640 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
11650 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
11660 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
11670 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
11680 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
11690 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
116a0 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
116b0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
116c0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
116d0 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
116e0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
116f0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
11700 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
11710 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
11720 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
11730 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
11740 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
11750 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
11760 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
11770 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
11780 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
11790 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
117a0 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
117b0 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
117c0 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
117d0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
117e0 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
117f0 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
11800 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
11810 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
11820 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
11830 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
11840 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
11850 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
11860 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
11870 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
11880 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
11890 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
118a0 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
118b0 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
118c0 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
118d0 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
118e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
118f0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
11900 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
11910 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
11920 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11930 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
11940 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62 74 72 65  LITE_OK;..  btre
11950 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
11960 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
11970 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
11980 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
11990 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
119a0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
119b0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
119c0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
119d0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
119e0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
119f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
11a00 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
11a10 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
11a20 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
11a30 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
11a40 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74  flag) ){.    ret
11a50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11a60 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
11a70 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
11a80 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
11a90 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
11aa0 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42  base */.  if( pB
11ab0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
11ac0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rflag ){.    ret
11ad0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11ae0 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  NLY;.  }..  /* I
11af0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
11b00 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
11b10 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
11b20 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11b30 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
11b40 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
11b50 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
11b60 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
11b70 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
11b80 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
11b90 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f  QLITE_BUSY..  */
11ba0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
11bb0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11bc0 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61 67  _WRITE && wrflag
11bd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11be0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
11bf0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20  .  do {.    if( 
11c00 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
11c10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
11c20 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
11c30 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
11c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
11c50 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72  rflag ){.      r
11c60 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
11c70 5f 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  _begin(pBt->pPag
11c80 65 31 2d 3e 61 44 61 74 61 2c 20 77 72 66 6c 61  e1->aData, wrfla
11c90 67 3e 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  g>1);.      if( 
11ca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11cb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65  .        rc = ne
11cc0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
11cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11ce0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11d00 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
11d10 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
11d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
11d30 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
11d40 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
11d50 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11d60 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
11d70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11d80 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
11d90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
11da0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11db0 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c  (pBt->pBusyHandl
11dc0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  er) );..  if( rc
11dd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11de0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11df0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
11e00 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
11e10 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
11e20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
11e30 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
11e40 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
11e50 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
11e60 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
11e70 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
11e80 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
11e90 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
11ea0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ns;.    }.  }.. 
11eb0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
11ec0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11ed0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11ee0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11ef0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
11f00 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
11f10 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
11f20 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
11f30 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
11f40 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
11f50 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
11f60 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
11f70 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
11f80 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
11f90 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
11fa0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
11fb0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
11fc0 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
11fd0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
11fe0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
12010 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
12020 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12050 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
12060 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
12070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12090 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
120a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
120b0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
120c0 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
120d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
120e0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
120f0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69  ge->pgno;..  ini
12100 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
12110 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
12120 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
12130 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
12140 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
12150 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
12160 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
12170 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
12180 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
12190 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
121a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
121b0 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
121c0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
121d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
121e0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
121f0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
12200 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
12210 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
12220 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
12230 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
12240 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
12250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12260 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
12270 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
12280 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
12290 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
122a0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
122b0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
122c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
122d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
122e0 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
122f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12300 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12310 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
12320 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
12330 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
12340 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12350 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
12360 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
12370 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
12380 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
12390 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  enteed to be a b
123a0 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
123b0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
123c0 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
123d0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
123e0 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
123f0 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
12400 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
12410 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
12420 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
12430 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
12440 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
12450 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
12460 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
12470 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
12480 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
12490 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
124a0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
124d0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
124e0 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
124f0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
12500 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
12510 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
12520 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
12530 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
12540 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
12550 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
12560 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
12570 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
12580 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
12590 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
125a0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
125b0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
125c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
125d0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
125e0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
125f0 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
12600 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
12610 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
12620 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
12630 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65 54  eType){.  if( eT
12640 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
12650 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
12660 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
12670 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
12680 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
12690 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
126a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
126b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
126c0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
126d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
126e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
126f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
12700 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
12710 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
12720 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
12730 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
12740 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
12750 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
12760 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61      initPage(pPa
12770 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
12780 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
12790 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
127a0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
127b0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
127c0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
127d0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
127e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
127f0 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12800 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12810 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
12820 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
12830 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
12840 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
12850 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
12860 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
12870 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
12880 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
12890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
128a0 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
128b0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
128c0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
128d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
128e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
128f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12900 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
12910 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
12920 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
12930 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
12940 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12950 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12970 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
12980 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
12990 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
129a0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
129b0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
129c0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
129d0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
129e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
129f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12a00 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
12a10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
12a20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
12a30 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
12a40 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
12a50 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12a60 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
12a70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12a80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12a90 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
12aa0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
12ab0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
12ac0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
12ad0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
12ae0 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
12af0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
12b00 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
12b10 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
12b20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12b30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
12b40 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
12b50 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
12b60 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
12b70 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
12b80 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
12b90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12ba0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
12bb0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
12bc0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
12bd0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12be0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
12bf0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
12c00 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
12c10 20 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20   iFreePage      
12c20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
12c30 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
12c40 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  Page to */.){.  
12c50 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
12c60 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
12c70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
12c80 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
12c90 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
12ca0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
12cb0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
12cc0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
12cd0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
12ce0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
12cf0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
12d00 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
12d10 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
12d20 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
12d30 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
12d40 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
12d50 54 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d  TPAGE );..  /* M
12d60 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
12d70 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65   from it's curre
12d80 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
12d90 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
12da0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
12db0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
12dc0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
12dd0 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
12de0 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
12df0 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
12e00 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
12e10 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
12e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
12e30 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 70 50 61  ger_movepage(pPa
12e40 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 61 44  ger, pDbPage->aD
12e50 61 74 61 2c 20 69 46 72 65 65 50 61 67 65 29 3b  ata, iFreePage);
12e60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
12e80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
12e90 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
12ea0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
12eb0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
12ec0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
12ed0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
12ee0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
12ef0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
12f00 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
12f10 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
12f20 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
12f30 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
12f40 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
12f50 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
12f60 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
12f70 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
12f80 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
12f90 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
12fa0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
12fb0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
12fc0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
12fd0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
12fe0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
12ff0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
13000 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
13010 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
13020 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
13030 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
13040 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13050 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
13060 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
13070 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
13080 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
13090 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
130a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
130b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
130c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
130d0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
130e0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
130f0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
13100 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
13110 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
13120 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
13130 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
13140 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
13150 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
13160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
13180 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13190 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
131a0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
131b0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
131c0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
131d0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
131e0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
131f0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
13200 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
13210 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
13220 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
13230 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
13240 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
13250 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
13260 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
13270 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
13280 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
13290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
132a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
132b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
132c0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
132d0 77 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  write(pPtrPage->
132e0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
132f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13300 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13310 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
13320 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13330 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
13340 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13350 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
13360 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
13370 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
13380 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
13390 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
133a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
133b0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
133c0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
133d0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
133e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
133f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
13400 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
13410 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61 75  n required by au
13420 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 29  toVacuumCommit()
13430 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
13440 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 42 74 53  allocatePage(BtS
13450 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
13460 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
13470 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  o, u8);../*.** T
13480 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13490 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
134a0 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
134b0 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
134c0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
134d0 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
134e0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
134f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13500 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
13510 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
13520 50 67 6e 6f 20 2a 6e 54 72 75 6e 63 29 7b 0a 20  Pgno *nTrunc){. 
13530 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
13540 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
13550 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
13560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13570 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
13580 6d 61 69 6e 69 6e 67 20 6f 6e 20 74 68 65 20 66  maining on the f
13590 72 65 65 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20 69  ree-list. */.  i
135a0 6e 74 20 6e 50 74 72 4d 61 70 3b 20 20 20 20 20  nt nPtrMap;     
135b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
135c0 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  ber of pointer-m
135d0 61 70 20 70 61 67 65 73 20 64 65 61 6c 6c 6f 63  ap pages dealloc
135e0 61 74 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  ated */.  Pgno o
135f0 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
13600 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 69 6e       /* Pages in
13610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13620 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 66 69 6e  le */.  Pgno fin
13630 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
13640 20 20 20 2f 2a 20 50 61 67 65 73 20 69 6e 20 74     /* Pages in t
13650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13660 20 61 66 74 65 72 20 74 72 75 6e 63 61 74 69 6f   after truncatio
13670 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
136a0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 0a   */.  u8 eType;.
136b0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74    int pgsz = pBt
136c0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20  ->pageSize;  /* 
136d0 50 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68  Page size for th
136e0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
136f0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 3b 20 20   Pgno iDbPage;  
13700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13710 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
13720 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 4d 65   to move */.  Me
13730 6d 50 61 67 65 20 2a 70 44 62 4d 65 6d 50 61 67  mPage *pDbMemPag
13740 65 20 3d 20 30 3b 20 20 20 2f 2a 20 22 22 20 2a  e = 0;   /* "" *
13750 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
13760 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
13770 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
13780 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
13790 65 72 20 74 6f 20 69 44 62 50 61 67 65 20 2a 2f  er to iDbPage */
137a0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
137b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
137c0 20 54 68 65 20 66 72 65 65 2d 6c 69 73 74 20 70   The free-list p
137d0 61 67 65 20 74 6f 20 6d 6f 76 65 20 69 44 62 50  age to move iDbP
137e0 61 67 65 20 74 6f 20 2a 2f 0a 20 20 4d 65 6d 50  age to */.  MemP
137f0 61 67 65 20 2a 70 46 72 65 65 4d 65 6d 50 61 67  age *pFreeMemPag
13800 65 20 3d 20 30 3b 20 2f 2a 20 22 22 20 2a 2f 0a  e = 0; /* "" */.
13810 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13820 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 2a 73 71    int nRef = *sq
13830 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
13840 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66  (pPager);.#endif
13850 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
13860 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
13870 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
13880 47 45 28 70 67 73 7a 2c 20 73 71 6c 69 74 65 33  GE(pgsz, sqlite3
13890 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
138a0 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20  pPager)) ){.    
138b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
138c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
138d0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
138e0 20 68 6f 77 20 6d 61 6e 79 20 66 72 65 65 2d 70   how many free-p
138f0 61 67 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ages are in the 
13900 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
13910 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66  re are no.  ** f
13920 72 65 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  ree pages, then 
13930 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 61  auto-vacuum is a
13940 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 6e   no-op..  */.  n
13950 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
13960 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
13970 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
13980 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
13990 20 29 7b 0a 20 20 20 20 2a 6e 54 72 75 6e 63 20   ){.    *nTrunc 
139a0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
139b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
139c0 20 20 6f 72 69 67 53 69 7a 65 20 3d 20 73 71 6c    origSize = sql
139d0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
139e0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 6e  unt(pPager);.  n
139f0 50 74 72 4d 61 70 20 3d 20 28 6e 46 72 65 65 4c  PtrMap = (nFreeL
13a00 69 73 74 2d 6f 72 69 67 53 69 7a 65 2b 50 54 52  ist-origSize+PTR
13a10 4d 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c  MAP_PAGENO(pgsz,
13a20 20 6f 72 69 67 53 69 7a 65 29 2b 70 67 73 7a 2f   origSize)+pgsz/
13a30 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 66  5)/(pgsz/5);.  f
13a40 69 6e 53 69 7a 65 20 3d 20 6f 72 69 67 53 69 7a  inSize = origSiz
13a50 65 20 2d 20 6e 46 72 65 65 4c 69 73 74 20 2d 20  e - nFreeList - 
13a60 6e 50 74 72 4d 61 70 3b 0a 20 20 69 66 28 20 6f  nPtrMap;.  if( o
13a70 72 69 67 53 69 7a 65 3e 3d 50 45 4e 44 49 4e 47  rigSize>=PENDING
13a80 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
13a90 26 26 20 66 69 6e 53 69 7a 65 3c 3d 50 45 4e 44  && finSize<=PEND
13aa0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13ab0 74 29 20 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a  t) ){.    finSiz
13ac0 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 50 54 52  e--;.    if( PTR
13ad0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2d 3e  MAP_ISPAGE(pBt->
13ae0 75 73 61 62 6c 65 53 69 7a 65 2c 20 66 69 6e 53  usableSize, finS
13af0 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 66 69  ize) ){.      fi
13b00 6e 53 69 7a 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nSize--;.    }. 
13b10 20 7d 0a 20 20 54 52 41 43 45 28 28 22 41 55 54   }.  TRACE(("AUT
13b20 4f 56 41 43 55 55 4d 3a 20 42 65 67 69 6e 20 28  OVACUUM: Begin (
13b30 64 62 20 73 69 7a 65 20 25 64 2d 3e 25 64 29 5c  db size %d->%d)\
13b40 6e 22 2c 20 6f 72 69 67 53 69 7a 65 2c 20 66 69  n", origSize, fi
13b50 6e 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 56  nSize));..  /* V
13b60 61 72 69 61 62 6c 65 20 27 66 69 6e 53 69 7a 65  ariable 'finSize
13b70 27 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69  ' will be the si
13b80 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
13b90 6e 20 70 61 67 65 73 20 61 66 74 65 72 0a 20 20  n pages after.  
13ba0 2a 2a 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  ** the auto-vacu
13bb0 75 6d 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64  um has completed
13bc0 20 28 74 68 65 20 63 75 72 72 65 6e 74 20 66 69   (the current fi
13bd0 6c 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  le size minus th
13be0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
13bf0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
13c00 65 65 20 6c 69 73 74 29 2e 20 4c 6f 6f 70 20 74  ee list). Loop t
13c10 68 72 6f 75 67 68 20 74 68 65 20 70 61 67 65 73  hrough the pages
13c20 20 74 68 61 74 20 6c 69 65 20 62 65 79 6f 6e 64   that lie beyond
13c30 0a 20 20 2a 2a 20 74 68 69 73 20 6d 61 72 6b 2c  .  ** this mark,
13c40 20 61 6e 64 20 69 66 20 74 68 65 79 20 61 72 65   and if they are
13c50 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e 20   not already on 
13c60 74 68 65 20 66 72 65 65 20 6c 69 73 74 2c 20 6d  the free list, m
13c70 6f 76 65 20 74 68 65 6d 0a 20 20 2a 2a 20 74 6f  ove them.  ** to
13c80 20 61 20 66 72 65 65 20 70 61 67 65 20 65 61 72   a free page ear
13c90 6c 69 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  lier in the file
13ca0 20 28 73 6f 6d 65 77 68 65 72 65 20 62 65 66 6f   (somewhere befo
13cb0 72 65 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a  re finSize)..  *
13cc0 2f 0a 20 20 66 6f 72 28 20 69 44 62 50 61 67 65  /.  for( iDbPage
13cd0 3d 66 69 6e 53 69 7a 65 2b 31 3b 20 69 44 62 50  =finSize+1; iDbP
13ce0 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 3b 20 69  age<=origSize; i
13cf0 44 62 50 61 67 65 2b 2b 20 29 7b 0a 20 20 20 20  DbPage++ ){.    
13d00 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69 73  /* If iDbPage is
13d10 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
13d20 61 67 65 2c 20 6f 72 20 74 68 65 20 70 65 6e 64  age, or the pend
13d30 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2c 20 73  ing-byte page, s
13d40 6b 69 70 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  kip it. */.    i
13d50 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
13d60 28 70 67 73 7a 2c 20 69 44 62 50 61 67 65 29 20  (pgsz, iDbPage) 
13d70 7c 7c 20 69 44 62 50 61 67 65 3d 3d 50 45 4e 44  || iDbPage==PEND
13d80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13d90 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  t) ){.      cont
13da0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
13db0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
13dc0 70 42 74 2c 20 69 44 62 50 61 67 65 2c 20 26 65  pBt, iDbPage, &e
13dd0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
13de0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13df0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
13e00 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
13e10 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
13e20 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
13e30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13e40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
13e50 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f  .      goto auto
13e60 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20  vacuum_out;.    
13e70 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 44 62  }..    /* If iDb
13e80 50 61 67 65 20 69 73 20 66 72 65 65 2c 20 64 6f  Page is free, do
13e90 20 6e 6f 74 20 73 77 61 70 20 69 74 2e 20 20 2a   not swap it.  *
13ea0 2f 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  /.    if( eType=
13eb0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
13ec0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
13ed0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ue;.    }.    rc
13ee0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
13ef0 69 44 62 50 61 67 65 2c 20 26 70 44 62 4d 65 6d  iDbPage, &pDbMem
13f00 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
13f10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
13f20 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
13f30 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  ut;..    /* Find
13f40 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
13f50 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
13f60 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  that is not alre
13f70 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 0a  ady at the end .
13f80 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
13f90 6c 65 2e 20 41 20 70 61 67 65 20 63 61 6e 20 62  le. A page can b
13fa0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
13fb0 20 66 72 65 65 20 6c 69 73 74 20 75 73 69 6e 67   free list using
13fc0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c   the .    ** all
13fd0 6f 63 61 74 65 50 61 67 65 28 29 20 72 6f 75 74  ocatePage() rout
13fe0 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
13ff0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  do{.      if( pF
14000 72 65 65 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  reeMemPage ){.  
14010 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14020 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b  e(pFreeMemPage);
14030 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 4d 65  .        pFreeMe
14040 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  mPage = 0;.     
14050 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c   }.      rc = al
14060 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
14070 26 70 46 72 65 65 4d 65 6d 50 61 67 65 2c 20 26  &pFreeMemPage, &
14080 69 46 72 65 65 50 61 67 65 2c 20 30 2c 20 30 29  iFreePage, 0, 0)
14090 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
140a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
140b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
140c0 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  (pDbMemPage);.  
140d0 20 20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76        goto autov
140e0 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 20  acuum_out;.     
140f0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
14100 20 69 46 72 65 65 50 61 67 65 3c 3d 6f 72 69 67   iFreePage<=orig
14110 53 69 7a 65 20 29 3b 0a 20 20 20 20 7d 77 68 69  Size );.    }whi
14120 6c 65 28 20 69 46 72 65 65 50 61 67 65 3e 66 69  le( iFreePage>fi
14130 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 65 6c  nSize );.    rel
14140 65 61 73 65 50 61 67 65 28 70 46 72 65 65 4d 65  easePage(pFreeMe
14150 6d 50 61 67 65 29 3b 0a 20 20 20 20 70 46 72 65  mPage);.    pFre
14160 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 0a 20  eMemPage = 0;.. 
14170 20 20 20 2f 2a 20 52 65 6c 6f 63 61 74 65 20 74     /* Relocate t
14180 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
14190 20 62 6f 64 79 20 6f 66 20 74 68 65 20 66 69 6c   body of the fil
141a0 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 6c 74  e. Note that alt
141b0 68 6f 75 67 68 20 74 68 65 20 0a 20 20 20 20 2a  hough the .    *
141c0 2a 20 70 61 67 65 20 68 61 73 20 6d 6f 76 65 64  * page has moved
141d0 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61   within the data
141e0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 70  base file, the p
141f0 44 62 4d 65 6d 50 61 67 65 20 70 6f 69 6e 74 65  DbMemPage pointe
14200 72 20 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e  r .    ** remain
14210 73 20 76 61 6c 69 64 2e 20 54 68 69 73 20 6d 65  s valid. This me
14220 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 66 75  ans that this fu
14230 6e 63 74 69 6f 6e 20 63 61 6e 20 72 75 6e 20 77  nction can run w
14240 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 69 6e  ithout.    ** in
14250 76 61 6c 69 64 61 74 69 6e 67 20 63 75 72 73 6f  validating curso
14260 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  rs open on the b
14270 74 72 65 65 2e 20 54 68 69 73 20 69 73 20 69 6d  tree. This is im
14280 70 6f 72 74 61 6e 74 20 69 6e 20 0a 20 20 20 20  portant in .    
14290 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
142a0 6d 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mode..    */.   
142b0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
142c0 67 65 28 70 42 74 2c 20 70 44 62 4d 65 6d 50 61  ge(pBt, pDbMemPa
142d0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
142e0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b  age, iFreePage);
142f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
14300 28 70 44 62 4d 65 6d 50 61 67 65 29 3b 0a 20 20  (pDbMemPage);.  
14310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14320 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76  _OK ) goto autov
14330 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  acuum_out;.  }..
14340 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
14350 66 72 65 65 2d 6c 69 73 74 20 68 61 73 20 62 65  free-list has be
14360 65 6e 20 73 77 61 70 70 65 64 20 74 6f 20 74 68  en swapped to th
14370 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
14380 65 2e 20 53 6f 0a 20 20 2a 2a 20 74 72 75 6e 63  e. So.  ** trunc
14390 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
143a0 20 66 69 6c 65 20 74 6f 20 66 69 6e 53 69 7a 65   file to finSize
143b0 20 70 61 67 65 73 20 61 6e 64 20 63 6f 6e 73 69   pages and consi
143c0 64 65 72 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  der the.  ** fre
143d0 65 2d 6c 69 73 74 20 65 6d 70 74 79 2e 0a 20 20  e-list empty..  
143e0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
143f0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 42 74  3pager_write(pBt
14400 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
14410 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14420 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74  TE_OK ) goto aut
14430 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 70  ovacuum_out;.  p
14440 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14450 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
14460 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
14470 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
14480 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 69  ata[36], 0);.  i
14490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
144a0 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75   ) goto autovacu
144b0 75 6d 5f 6f 75 74 3b 0a 20 20 2a 6e 54 72 75 6e  um_out;.  *nTrun
144c0 63 20 3d 20 66 69 6e 53 69 7a 65 3b 0a 0a 61 75  c = finSize;..au
144d0 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3a 0a 20 20  tovacuum_out:.  
144e0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 2a 73  assert( nRef==*s
144f0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
14500 73 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69  s(pPager) );.  i
14510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   ){.    sqlite3p
14530 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
14540 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
14550 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
14560 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
14570 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
14580 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
14590 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
145a0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
145b0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
145c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
145d0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
145e0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
145f0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
14600 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
14610 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
14620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
14630 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
14640 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14650 3e 70 42 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e  >pBt;..  btreeIn
14660 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
14670 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
14680 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
14690 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
146a0 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
146b0 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
146c0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
146d0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
146e0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
146f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
14700 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
14710 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
14720 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
14730 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14740 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
14750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
14760 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
14770 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
14780 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
14790 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
147a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
147b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
147c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
147d0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
147e0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
147f0 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  EAD;.    pBt->in
14800 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
14810 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
14820 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
14830 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
14840 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
14850 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
14860 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
14870 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
14880 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
14890 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
148a0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
148b0 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
148c0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
148d0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
148e0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
148f0 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
14900 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
14910 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
14920 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14930 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
14940 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
14950 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
14960 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
14970 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
14980 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
14990 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
149a0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
149b0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
149c0 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
149d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
149e0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
149f0 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
14a00 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
14a10 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
14a20 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
14a30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
14a40 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61  .  */.  p->inTra
14a50 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
14a60 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14a70 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
14a80 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14aa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
14ab0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
14ac0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
14ad0 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
14ae0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
14af0 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
14b00 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
14b10 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
14b20 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
14b30 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
14b40 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
14b50 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
14b60 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
14b70 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
14b80 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
14b90 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
14ba0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
14bb0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
14bc0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
14bd0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
14be0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 20 72  pCur->wrFlag ) r
14bf0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
14c00 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n r;.}.#endif..#
14c10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14c20 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
14c30 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14c40 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 64 65 62  ./*.** Print deb
14c50 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ugging informati
14c60 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 63 75 72  on about all cur
14c70 73 6f 72 73 20 74 6f 20 73 74 61 6e 64 61 72 64  sors to standard
14c80 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 76 6f 69 64   output..*/.void
14c90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14ca0 73 6f 72 4c 69 73 74 28 42 74 72 65 65 20 2a 70  sorList(Btree *p
14cb0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
14cc0 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  Cur;.  BtShared 
14cd0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
14ce0 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
14cf0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
14d00 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
14d10 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
14d20 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
14d30 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f  e;.    char *zMo
14d40 64 65 20 3d 20 70 43 75 72 2d 3e 77 72 46 6c 61  de = pCur->wrFla
14d50 67 20 3f 20 22 72 77 22 20 3a 20 22 72 6f 22 3b  g ? "rw" : "ro";
14d60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
14d70 67 50 72 69 6e 74 66 28 22 43 55 52 53 4f 52 20  gPrintf("CURSOR 
14d80 25 70 20 72 6f 6f 74 65 64 20 61 74 20 25 34 64  %p rooted at %4d
14d90 28 25 73 29 20 63 75 72 72 65 6e 74 6c 79 20 61  (%s) currently a
14da0 74 20 25 64 2e 25 64 25 73 5c 6e 22 2c 0a 20 20  t %d.%d%s\n",.  
14db0 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
14dc0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a 4d 6f 64 65  >pgnoRoot, zMode
14dd0 2c 0a 20 20 20 20 20 20 20 70 50 61 67 65 20 3f  ,.       pPage ?
14de0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3a 20 30   pPage->pgno : 0
14df0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 0a 20 20 20  , pCur->idx,.   
14e00 20 20 20 20 28 70 43 75 72 2d 3e 65 53 74 61 74      (pCur->eStat
14e10 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
14e20 20 3f 20 22 22 20 3a 20 22 20 65 6f 66 22 0a 20   ? "" : " eof". 
14e30 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64     );.  }.}.#end
14e40 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  if../*.** Rollba
14e50 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
14e60 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
14e70 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
14e80 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
14e90 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
14ea0 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
14eb0 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
14ec0 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
14ed0 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
14ee0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
14ef0 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
14f00 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
14f10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
14f20 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
14f30 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
14f40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14f50 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
14f60 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
14f70 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
14f80 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
14f90 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
14fa0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
14fb0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
14fc0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
14fd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14fe0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
14ff0 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ..  rc = saveAll
15000 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
15010 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
15020 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15030 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
15040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15050 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
15060 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
15070 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
15080 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  () error occured
15090 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
150a0 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
150b0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
150c0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
150d0 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
150e0 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
150f0 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
15100 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
15110 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
15120 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
15130 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
15140 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
15150 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
15160 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
15170 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
15180 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
15190 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
151a0 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
151b0 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
151c0 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
151d0 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
151e0 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
151f0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
15200 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
15210 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
15220 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pBt->pCursor ){.
15230 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
15240 62 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  b = pBt->pCursor
15250 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
15260 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 20  e;.      if( db 
15270 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15280 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74 69  e3AbortOtherActi
15290 76 65 56 64 62 65 73 28 64 62 2c 20 30 29 3b 0a  veVdbes(db, 0);.
152a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
152b0 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
152c0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
152d0 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
152e0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
152f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
15300 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
15310 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
15320 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
15330 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
15340 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
15350 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
15360 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
15370 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
15380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15390 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
153a0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
153b0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
153c0 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
153d0 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
153e0 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
153f0 6c 20 67 65 74 50 61 67 65 28 29 20 6f 6e 20 70  l getPage() on p
15400 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
15410 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 31 2d  ake sure pPage1-
15420 3e 61 44 61 74 61 20 69 73 0a 20 20 20 20 2a 2a  >aData is.    **
15430 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
15440 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 50 61  */.    if( getPa
15450 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
15460 65 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  e1)==SQLITE_OK )
15470 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
15480 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
15490 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
154a0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
154b0 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
154c0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
154d0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
154e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69  .  }..  if( p->i
154f0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
15500 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  NE ){.    assert
15510 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
15520 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74  ion>0 );.    pBt
15530 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
15540 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
15550 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
15560 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
15570 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
15580 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
15590 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   }..  p->inTrans
155a0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
155b0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
155c0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
155d0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
155e0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
155f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
15610 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
15620 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65  ransaction.  The
15630 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15640 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  can.** can be ro
15650 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65  lled back indepe
15660 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
15670 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
15680 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61  .** You must sta
15690 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
156a0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
156b0 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
156c0 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61  n..** The subtra
156d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
156e0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
156f0 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
15700 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69  saction.** commi
15710 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
15720 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65  ..**.** Only one
15730 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15740 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61 74  may be active at
15750 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20   a time.  It is 
15760 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a  an error to try.
15770 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  ** to start a ne
15780 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  w subtransaction
15790 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74   if another subt
157a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
157b0 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a  ready active..**
157c0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
157d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
157e0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
157f0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
15800 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
15810 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
15820 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
15830 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
15840 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
15850 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
15860 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
15870 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
15880 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
15890 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
158a0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
158b0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
158c0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
158d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
158e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
158f0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
15900 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
15910 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15920 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
15930 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  (p->inTrans!=TRA
15940 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74  NS_WRITE) || pBt
15950 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  ->inStmt ){.    
15960 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
15970 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
15980 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
15990 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
159a0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
159b0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
159c0 52 49 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 70  RITE );.  rc = p
159d0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
159e0 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
159f0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
15a00 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  in(pBt->pPager);
15a10 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
15a20 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   1;.  return rc;
15a30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
15a40 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73  t the statment s
15a50 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  ubtransaction cu
15a60 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
15a70 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73  ess.  If no.** s
15a80 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
15a90 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73   active, this is
15aa0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
15ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15ac0 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70  mitStmt(Btree *p
15ad0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
15ae0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15af0 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
15b00 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
15b10 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
15b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
15b30 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
15b40 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
15b50 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
15b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15b70 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
15b80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15b90 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
15ba0 20 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74   the active stat
15bb0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
15bc0 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62  tion.  If no sub
15bd0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
15be0 73 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f  s active this ro
15bf0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
15c00 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  ..**.** All curs
15c10 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
15c20 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
15c30 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
15c40 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73  attempt.** to us
15c50 65 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  e a cursor that 
15c60 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
15c70 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
15c80 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77  s operation.** w
15c90 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
15ca0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
15cb0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
15cc0 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ackStmt(Btree *p
15cd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
15cf0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15d00 74 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  t;.  sqlite3Mall
15d10 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20  ocDisallow();.  
15d20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
15d30 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
15d40 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
15d50 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
15d60 72 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  rollback(pBt->pP
15d70 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
15d80 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
15d90 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
15da0 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
15db0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
15dc0 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b  e3MallocAllow();
15dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15de0 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b  ./*.** Default k
15df0 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey comparison fu
15e00 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 73 65  nction to be use
15e10 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73  d if no comparis
15e20 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  on function.** i
15e30 73 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74  s specified on t
15e40 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
15e50 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f  ursor() call..*/
15e60 0a 73 74 61 74 69 63 20 69 6e 74 20 64 66 6c 74  .static int dflt
15e70 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 20  Compare(.  void 
15e80 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  *NotUsed,       
15e90 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
15ea0 74 61 20 69 73 20 6e 6f 74 20 75 73 65 64 20 2a  ta is not used *
15eb0 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73  /.  int n1, cons
15ec0 74 20 76 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f  t void *p1,    /
15ed0 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20 63  * First key to c
15ee0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ompare */.  int 
15ef0 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  n2, const void *
15f00 70 32 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  p2     /* Second
15f10 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
15f20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  */.){.  int c;. 
15f30 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20   c = memcmp(p1, 
15f40 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a  p2, n1<n2 ? n1 :
15f50 20 6e 32 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30   n2);.  if( c==0
15f60 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d   ){.    c = n1 -
15f70 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n2;.  }.  retur
15f80 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n c;.}../*.** Cr
15f90 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
15fa0 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
15fb0 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
15fc0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
15fd0 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
15fe0 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
15ff0 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
16000 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
16010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
16020 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
16030 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
16040 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
16050 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
16060 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
16070 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
16080 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
16090 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
160a0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
160b0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
160c0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
160d0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
160e0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
160f0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
16100 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
16110 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
16120 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
16130 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
16140 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
16150 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
16160 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
16170 3a 20 20 4e 6f 20 6f 74 68 65 72 20 63 75 72 73  :  No other curs
16180 6f 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20  ors may be open 
16190 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
161a0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
161b0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
161c0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
161d0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
161e0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
161f0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
16200 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
16210 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
16220 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e  .**.** Condition
16230 20 32 20 77 61 72 72 61 6e 74 73 20 66 75 72 74   2 warrants furt
16240 68 65 72 20 64 69 73 63 75 73 73 69 6f 6e 2e 20  her discussion. 
16250 20 49 66 20 61 6e 79 20 63 75 72 73 6f 72 20 69   If any cursor i
16260 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 61  s opened.** on a
16270 20 74 61 62 6c 65 20 77 69 74 68 20 77 72 46 6c   table with wrFl
16280 61 67 3d 3d 30 2c 20 74 68 61 74 20 70 72 65 76  ag==0, that prev
16290 65 6e 74 73 20 61 6c 6c 20 6f 74 68 65 72 20 63  ents all other c
162a0 75 72 73 6f 72 73 20 66 72 6f 6d 0a 2a 2a 20 77  ursors from.** w
162b0 72 69 74 69 6e 67 20 74 6f 20 74 68 61 74 20 74  riting to that t
162c0 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  able.  This is a
162d0 20 6b 69 6e 64 20 6f 66 20 22 72 65 61 64 2d 6c   kind of "read-l
162e0 6f 63 6b 22 2e 20 20 57 68 65 6e 20 61 20 63 75  ock".  When a cu
162f0 72 73 6f 72 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  rsor.** is opene
16300 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
16310 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
16320 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  d that the table
16330 20 77 69 6c 6c 20 6e 6f 74 0a 2a 2a 20 63 68 61   will not.** cha
16340 6e 67 65 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  nge as long as t
16350 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
16360 6e 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  n.  This allows 
16370 74 68 65 20 63 75 72 73 6f 72 20 74 6f 0a 2a 2a  the cursor to.**
16380 20 64 6f 20 61 20 73 65 71 75 65 6e 74 69 61 6c   do a sequential
16390 20 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62   scan of the tab
163a0 6c 65 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  le without havin
163b0 67 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  g to worry about
163c0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 62 65 69 6e  .** entries bein
163d0 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  g inserted or de
163e0 6c 65 74 65 64 20 64 75 72 69 6e 67 20 74 68 65  leted during the
163f0 20 73 63 61 6e 2e 20 20 43 75 72 73 6f 72 73 20   scan.  Cursors 
16400 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 6f 70 65  should.** be ope
16410 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
16420 3d 30 20 6f 6e 6c 79 20 69 66 20 74 68 69 73 20  =0 only if this 
16430 72 65 61 64 2d 6c 6f 63 6b 20 70 72 6f 70 65 72  read-lock proper
16440 74 79 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2a  ty is needed..**
16450 20 54 68 61 74 20 69 73 20 74 6f 20 73 61 79 2c   That is to say,
16460 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20   cursors should 
16470 62 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  be opened with w
16480 72 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66  rFlag==0 only if
16490 20 74 68 65 79 0a 2a 2a 20 69 6e 74 65 6e 64 20   they.** intend 
164a0 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
164b0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 73 79  e3BtreeNext() sy
164c0 73 74 65 6d 20 63 61 6c 6c 2e 20 20 41 6c 6c 20  stem call.  All 
164d0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 0a 2a 2a  other cursors.**
164e0 20 73 68 6f 75 6c 64 20 62 65 20 6f 70 65 6e 65   should be opene
164f0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
16500 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 6e 65   even if they ne
16510 76 65 72 20 72 65 61 6c 6c 79 20 69 6e 74 65 6e  ver really inten
16520 64 0a 2a 2a 20 74 6f 20 77 72 69 74 65 2e 0a 2a  d.** to write..*
16530 2a 20 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  * .** No checkin
16540 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
16550 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
16560 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
16570 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
16580 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
16590 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
165a0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
165b0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
165c0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
165d0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ly..**.** The co
165e0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
165f0 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69 63 61  n must be logica
16600 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 6f 72  lly the same for
16610 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a 2a 2a   every cursor.**
16620 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
16630 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67 69 6e   table.  Changin
16640 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
16650 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
16660 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63 6f  esult.** in inco
16670 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 73  rrect operations
16680 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72  .  If the compar
16690 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  ison function is
166a0 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66 61   NULL, a.** defa
166b0 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  ult comparison f
166c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  unction is used.
166d0 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e    The comparison
166e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
166f0 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 20 66  always ignored f
16700 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
16710 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16720 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
16730 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16760 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
16770 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
167a0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
167b0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
167c0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
167f0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
16800 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  ly */.  int (*xC
16810 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  mp)(void*,int,co
16820 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
16830 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b  nst void*), /* K
16840 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ey Comparison fu
16850 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
16860 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
16890 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
168a0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70  /.  BtCursor **p
168b0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
168e0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
168f0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
16900 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53  sor *pCur;.  BtS
16910 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16920 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75 72 20 3d  pBt;..  *ppCur =
16930 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   0;.  if( wrFlag
16940 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
16950 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
16960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16970 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
16980 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
16990 61 64 4c 6f 63 6b 73 28 70 42 74 2c 20 69 54 61  adLocks(pBt, iTa
169a0 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
169b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
169c0 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  OCKED;.    }.  }
169d0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ..  if( pBt->pPa
169e0 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ge1==0 ){.    rc
169f0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68   = lockBtreeWith
16a00 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66  Retry(p);.    if
16a10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16a20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16a30 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
16a40 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pCur = sqliteMal
16a50 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75  loc( sizeof(*pCu
16a60 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
16a70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
16a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16a90 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
16aa0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
16ab0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
16ac0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
16ad0 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
16ae0 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 70  e==1 && sqlite3p
16af0 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
16b00 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29  Bt->pPager)==0 )
16b10 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16b20 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74  E_EMPTY;.    got
16b30 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
16b40 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
16b50 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
16b60 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
16b70 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
16b80 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  >pPage, 0);.  if
16b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16ba0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
16bb0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
16bc0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
16bd0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
16be0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
16bf0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
16c00 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
16c10 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
16c20 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
16c30 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
16c40 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
16c50 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
16c60 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
16c70 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
16c80 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
16c90 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d  ->xCompare = xCm
16ca0 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43  p ? xCmp : dfltC
16cb0 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e  ompare;.  pCur->
16cc0 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70  pArg = pArg;.  p
16cd0 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
16ce0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
16cf0 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
16d00 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
16d10 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
16d20 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
16d30 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
16d40 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
16d50 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
16d60 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
16d70 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
16d80 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72  NVALID;.  *ppCur
16d90 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75   = pCur;..  retu
16da0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63 72  rn SQLITE_OK;.cr
16db0 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
16dc0 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75  ption:.  if( pCu
16dd0 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  r ){.    release
16de0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
16df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
16e00 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75  e(pCur);.  }.  u
16e10 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
16e20 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
16e30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20 20  n rc;.}..#if 0  
16e40 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 2f  /* Not Used */./
16e50 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16e60 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d  value of the com
16e70 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16e80 20 75 73 65 64 20 62 79 20 61 20 63 75 72 73 6f   used by a curso
16e90 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
16ea0 65 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61 72  e3BtreeSetCompar
16eb0 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  e(.  BtCursor *p
16ec0 43 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Cur,     /* The 
16ed0 63 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65 20  cursor to whose 
16ee0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16ef0 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 2a  ion is changed *
16f00 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28 76  /.  int(*xCmp)(v
16f10 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
16f20 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
16f30 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63 6f  oid*), /* New co
16f40 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f  mparison func */
16f50 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
16f60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16f70 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d 70  argument to xCmp
16f80 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72 2d  () */.){.  pCur-
16f90 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
16fa0 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
16fb0 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
16fc0 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23 65  Arg = pArg;.}.#e
16fd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
16fe0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
16ff0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
17000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17010 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
17020 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
17030 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
17040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17050 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
17060 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
17070 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
17080 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
17090 42 74 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72 43  Bt;.  restoreOrC
170a0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
170b0 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 69  on(pCur, 0);.  i
170c0 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
170d0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65  {.    pCur->pPre
170e0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
170f0 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
17100 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
17110 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
17120 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
17130 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
17140 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
17150 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
17160 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
17170 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
17180 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
17190 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 73 71  nused(pBt);.  sq
171a0 6c 69 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a  liteFree(pCur);.
171b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
171c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
171d0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
171e0 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20  rsor by filling 
171f0 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  in the fields of
17200 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68   pTempCur..** Th
17210 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  e temporary curs
17220 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  or is not on the
17230 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72   cursor list for
17240 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 73   the Btree..*/.s
17250 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 54 65  tatic void getTe
17260 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
17270 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
17280 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
17290 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
172a0 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70   pCur, sizeof(*p
172b0 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  Cur));.  pTempCu
172c0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
172d0 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
172e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70  = 0;.  if( pTemp
172f0 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
17300 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
17310 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
17320 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a  ge->aData);.  }.
17330 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
17340 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
17350 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d  or such as was m
17360 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74  ade by the Creat
17370 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72  eTemporaryCursor
17380 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
17390 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
173a0 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65 6d 70  void releaseTemp
173b0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
173c0 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
173d0 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20  ur->pPage ){.   
173e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
173f0 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
17400 3e 61 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  >aData);.  }.}..
17410 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
17420 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  the BtCursor.inf
17430 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  o field of the g
17440 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73 20 76  iven cursor is v
17450 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74 20 69  alid..** If it i
17460 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
17470 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73 65 43  lid, call parseC
17480 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
17490 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
174a0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
174b0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
174c0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
174d0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
174e0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
174f0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
17500 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 70  er of calls to p
17510 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 73  arseCell()..*/.s
17520 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
17530 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
17540 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
17550 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
17560 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65 43 65  0 ){.    parseCe
17570 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
17580 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72  pCur->idx, &pCur
17590 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  ->info);.  }else
175a0 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
175b0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
175c0 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
175d0 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
175e0 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61 72 73  info));.    pars
175f0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
17600 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69  e, pCur->idx, &i
17610 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
17620 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
17630 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
17640 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
17650 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
17660 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
17670 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
17680 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
17690 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
176a0 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
176b0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
176c0 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
176d0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
176e0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
176f0 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
17700 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
17710 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
17720 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
17730 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
17740 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
17750 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
17760 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
17770 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
17780 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  the key..*/.int 
17790 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
177a0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
177b0 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
177c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74  .  int rc = rest
177d0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
177e0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31  Position(pCur, 1
177f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
17810 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
17820 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
17830 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
17840 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
17850 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
17860 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
17870 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
17880 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
17890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
178a0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
178b0 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
178c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
178d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
178e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
178f0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
17900 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17910 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
17920 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
17930 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
17940 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77   points to.  Alw
17950 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ays return SQLIT
17960 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65  E_OK..** Failure
17970 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
17980 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
17990 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
179a0 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  y.** pointing to
179b0 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68   an entry (which
179c0 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72   can happen, for
179d0 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
179e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
179f0 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69  empty) then *pSi
17a00 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ze is set to 0..
17a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17a20 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
17a30 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
17a40 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
17a50 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
17a60 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
17a70 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28  (pCur, 1);.  if(
17a80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17a90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
17aa0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17ab0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
17ac0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17ad0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
17ae0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
17af0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
17b00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
17b10 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
17b20 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74  alid entry - set
17b30 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f   *pSize to 0. */
17b40 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
17b50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
17b60 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
17b70 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
17b80 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
17b90 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  .nData;.    }.  
17ba0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17bb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 79  ../*.** Read pay
17bc0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
17bd0 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
17be0 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
17bf0 72 73 6f 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74  rsor is.** point
17c00 69 6e 67 20 74 6f 2e 20 20 42 65 67 69 6e 20 72  ing to.  Begin r
17c10 65 61 64 69 6e 67 20 74 68 65 20 70 61 79 6c 6f  eading the paylo
17c20 61 64 20 61 74 20 22 6f 66 66 73 65 74 22 20 61  ad at "offset" a
17c30 6e 64 20 72 65 61 64 0a 2a 2a 20 61 20 74 6f 74  nd read.** a tot
17c40 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
17c50 73 2e 20 20 50 75 74 20 74 68 65 20 72 65 73 75  s.  Put the resu
17c60 6c 74 20 69 6e 20 7a 42 75 66 2e 0a 2a 2a 0a 2a  lt in zBuf..**.*
17c70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
17c80 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
17c90 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
17ca0 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
17cb0 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
17cc0 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  s bytes from the
17cd0 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20   payload area.  
17ce0 44 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  Data might appea
17cf0 72 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 69 6e  r.** on the main
17d00 20 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74   page or be scat
17d10 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c  tered out on mul
17d20 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70  tiple overflow p
17d30 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
17d40 69 6e 74 20 67 65 74 50 61 79 6c 6f 61 64 28 0a  int getPayload(.
17d50 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
17d60 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
17d70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
17d80 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
17d90 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c  */.  int offset,
17da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
17db0 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
17dc0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
17dd0 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
17de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17df0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
17e00 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
17e10 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
17e20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
17e30 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
17e40 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b   */ .  int skipK
17e50 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  ey          /* o
17e60 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20  ffset begins at 
17e70 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
17e80 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
17e90 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
17ea0 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f 20 6e 65 78  load;.  Pgno nex
17eb0 74 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  tPage;.  int rc;
17ec0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
17ed0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
17ee0 42 74 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 53 69  Bt;.  int ovflSi
17ef0 7a 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ze;.  u32 nKey;.
17f00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
17f10 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  =0 && pCur->pPag
17f20 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
17f30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17f40 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
17f50 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42    pBt = pCur->pB
17f60 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  tree->pBt;.  pPa
17f70 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
17f80 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74  ;.  pageIntegrit
17f90 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65  y(pPage);.  asse
17fa0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
17fb0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
17fc0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
17fd0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
17fe0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
17ff0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
18000 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
18010 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
18020 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
18030 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
18040 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
18050 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
18060 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
18070 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66  ffset>=0 );.  if
18080 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
18090 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b   offset += nKey;
180a0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65  .  }.  if( offse
180b0 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
180c0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b  r->info.nData ){
180d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
180e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
180f0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
18100 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
18110 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
18120 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
18130 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
18140 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
18150 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
18160 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
18170 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42   }.    memcpy(pB
18180 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66  uf, &aPayload[of
18190 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20 20 20 69  fset], a);.    i
181a0 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a 20 20 20  f( a==amt ){.   
181b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
181c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  _OK;.    }.    o
181d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
181e0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
181f0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
18200 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
18210 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18220 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 53 69 7a 65  ;.  }.  ovflSize
18230 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
18240 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 61 6d  ze - 4;.  if( am
18250 74 3e 30 20 29 7b 0a 20 20 20 20 6e 65 78 74 50  t>0 ){.    nextP
18260 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
18270 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
18280 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20 20  nfo.nLocal]);.  
18290 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
182a0 26 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20  & nextPage ){.  
182b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
182c0 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70  pager_get(pBt->p
182d0 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
182e0 20 28 76 6f 69 64 2a 2a 29 26 61 50 61 79 6c 6f   (void**)&aPaylo
182f0 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ad);.      if( r
18300 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
18310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18320 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67   }.      nextPag
18330 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
18340 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 69 66  yload);.      if
18350 28 20 6f 66 66 73 65 74 3c 6f 76 66 6c 53 69 7a  ( offset<ovflSiz
18360 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
18370 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
18380 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
18390 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
183a0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
183b0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
183c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
183d0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
183e0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
183f0 34 5d 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20  4], a);.        
18400 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
18410 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
18420 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
18430 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18440 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
18450 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
18460 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  }.      sqlite3p
18470 61 67 65 72 5f 75 6e 72 65 66 28 61 50 61 79 6c  ager_unref(aPayl
18480 6f 61 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oad);.    }.  }.
18490 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
184a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
184b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
184c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
184d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
184e0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
184f0 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
18500 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
18510 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
18520 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18530 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18540 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
18550 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
18560 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
18570 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
18580 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18590 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
185a0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
185b0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
185c0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
185d0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
185e0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
185f0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
18600 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
18610 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18620 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
18630 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
18640 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
18650 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Buf){.  int rc =
18660 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
18670 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
18680 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
18690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
186a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
186b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
186c0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
186d0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
186e0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
186f0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
18700 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
18710 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18720 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
18730 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18740 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
18750 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18760 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
18770 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
18780 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
18790 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 79 6c      rc = getPayl
187a0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
187b0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
187c0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
187d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
187e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
187f0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
18800 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18810 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
18820 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
18830 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
18840 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
18850 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
18860 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
18870 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
18880 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18890 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
188a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
188b0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
188c0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
188d0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
188e0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
188f0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
18900 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
18910 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
18920 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
18930 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18940 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
18950 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
18960 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  {.  int rc = res
18970 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
18980 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
18990 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
189a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
189b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
189c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
189d0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
189e0 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
189f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18a00 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
18a10 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
18a20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
18a30 20 20 20 72 63 20 3d 20 67 65 74 50 61 79 6c 6f     rc = getPaylo
18a40 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
18a50 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 29 3b 0a   amt, pBuf, 1);.
18a60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18a80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
18a90 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
18aa0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
18ab0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
18ac0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
18ad0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
18ae0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
18af0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
18b00 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
18b10 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
18b20 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
18b30 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
18b40 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
18b50 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
18b60 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
18b70 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
18b80 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
18b90 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
18ba0 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
18bb0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
18bc0 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
18bd0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
18be0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
18bf0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
18c00 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
18c10 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
18c20 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
18c30 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
18c40 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
18c50 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
18c60 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
18c70 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
18c80 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
18c90 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
18ca0 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
18cb0 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
18cc0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
18cd0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
18ce0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
18cf0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
18d00 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 67 65  w pages, then ge
18d10 74 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  tPayload() must 
18d20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
18d30 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79  embly.** the key
18d40 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
18d50 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
18d60 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
18d70 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
18d80 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
18d90 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
18da0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
18db0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
18dc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
18dd0 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
18de0 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
18df0 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
18e00 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
18e10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
18e20 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
18e30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
18e40 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
18e50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
18e60 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
18e70 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
18e80 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
18e90 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
18ea0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18eb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
18ec0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
18ed0 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
18ee0 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
18ef0 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
18f00 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
18f10 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
18f20 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
18f30 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
18f40 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
18f50 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c  ey;.  int nLocal
18f60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
18f70 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  r!=0 && pCur->pP
18f80 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
18f90 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18fa0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18fb0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
18fc0 2d 3e 70 50 61 67 65 3b 0a 20 20 70 61 67 65 49  ->pPage;.  pageI
18fd0 6e 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b  ntegrity(pPage);
18fe0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18ff0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
19000 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
19010 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
19020 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
19030 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
19040 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
19050 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
19060 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
19070 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
19080 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
19090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
190a0 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
190b0 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
190c0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
190d0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
190e0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
190f0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
19100 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
19110 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
19120 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
19130 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
19140 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
19150 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
19160 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
19170 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
19180 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
19190 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
191a0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
191b0 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
191c0 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
191d0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
191e0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
191f0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
19200 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
19210 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
19220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19230 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
19240 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
19250 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
19260 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
19270 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
19280 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
19290 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
192a0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
192b0 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
192c0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
192d0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
192e0 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
192f0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
19300 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
19310 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
19320 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
19330 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
19340 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
19350 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
19360 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
19370 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
19380 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
19390 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
193a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
193b0 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
193c0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
193d0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
193e0 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
193f0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
19400 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
19410 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
19420 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75  pAmt){.  if( pCu
19430 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19440 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
19450 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
19460 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
19470 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
19480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19490 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
194a0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
194b0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
194c0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
194d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
194e0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
194f0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
19500 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
19510 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
19520 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
19530 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
19540 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
19550 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
19560 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
19570 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
19580 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
19590 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a  ->pBtree->pBt;..
195a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
195b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
195c0 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 67  ALID );.  rc = g
195d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
195e0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
195f0 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50 61  wPage, pCur->pPa
19600 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
19610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 61 67  return rc;.  pag
19620 65 49 6e 74 65 67 72 69 74 79 28 70 4e 65 77 50  eIntegrity(pNewP
19630 61 67 65 29 3b 0a 20 20 70 4e 65 77 50 61 67 65  age);.  pNewPage
19640 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43  ->idxParent = pC
19650 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50  ur->idx;.  pOldP
19660 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
19670 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69  e;.  pOldPage->i
19680 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
19690 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50  eleasePage(pOldP
196a0 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
196b0 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  age = pNewPage;.
196c0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
196d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
196e0 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
196f0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
19700 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19710 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19720 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
19730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19740 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
19750 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19760 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
19770 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
19780 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
19790 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
197a0 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
197b0 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
197c0 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
197d0 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
197e0 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
197f0 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
19800 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
19810 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
19820 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
19830 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
19840 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19850 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
19860 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
19870 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
19880 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
19890 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
198a0 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50   isRootPage(MemP
198b0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
198c0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
198d0 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
198e0 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
198f0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19900 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
19910 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
19920 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
19930 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
19940 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
19950 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
19960 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
19970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
19980 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
19990 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
199a0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
199b0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
199c0 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
199d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
199e0 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
199f0 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
19a00 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
19a10 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
19a20 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
19a30 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
19a40 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
19a50 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
19a60 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
19a70 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
19a80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
19a90 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
19aa0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
19ab0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20  Page *pParent;. 
19ac0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19ad0 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74  .  int idxParent
19ae0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
19af0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19b00 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61  R_VALID );.  pPa
19b10 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
19b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19b30 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
19b40 28 20 21 69 73 52 6f 6f 74 50 61 67 65 28 70 50  ( !isRootPage(pP
19b50 61 67 65 29 20 29 3b 0a 20 20 70 61 67 65 49 6e  age) );.  pageIn
19b60 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a  tegrity(pPage);.
19b70 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67    pParent = pPag
19b80 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73  e->pParent;.  as
19b90 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30  sert( pParent!=0
19ba0 20 29 3b 0a 20 20 70 61 67 65 49 6e 74 65 67 72   );.  pageIntegr
19bb0 69 74 79 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  ity(pParent);.  
19bc0 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67  idxParent = pPag
19bd0 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20  e->idxParent;.  
19be0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
19bf0 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
19c00 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19c10 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
19c20 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
19c30 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19c40 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
19c50 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
19c60 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
19c70 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
19c80 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
19c90 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
19ca0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
19cb0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
19cc0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
19cd0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
19ce0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
19cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19d00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19d10 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
19d20 70 42 74 3b 0a 0a 20 20 72 65 73 74 6f 72 65 4f  pBt;..  restoreO
19d30 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
19d40 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20  tion(pCur, 0);. 
19d50 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
19d60 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
19d70 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  t && pRoot->pgno
19d80 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
19d90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19da0 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b  pRoot->isInit );
19db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
19dc0 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
19dd0 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
19de0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
19df0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
19e00 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b  Root, 0)).    ){
19e10 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
19e20 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
19e30 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
19e40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
19e50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
19e60 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
19e70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 52 6f  ageIntegrity(pRo
19e80 6f 74 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ot);.    pCur->p
19e90 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20  Page = pRoot;.  
19ea0 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  }.  pCur->idx = 
19eb0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
19ec0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
19ed0 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
19ee0 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
19ef0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
19f00 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74  page;.    assert
19f10 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pRoot->pgno==1
19f20 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20   );.    subpage 
19f30 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
19f40 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
19f50 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
19f60 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61     assert( subpa
19f70 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72  ge>0 );.    pCur
19f80 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
19f90 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
19fa0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
19fb0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
19fc0 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
19fd0 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65   = ((pCur->pPage
19fe0 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
19ff0 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
1a000 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72  NVALID);.  retur
1a010 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1a020 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1a030 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
1a040 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1a050 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
1a060 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
1a070 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1a080 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
1a090 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1a0a0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1a0b0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
1a0c0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
1a0d0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1a0e0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1a0f0 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
1a100 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1a110 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1a120 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
1a130 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1a140 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a150 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a160 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
1a170 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1a180 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
1a190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a1a0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
1a1b0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
1a1c0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
1a1d0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1a1e0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1a1f0 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  x));.    rc = mo
1a200 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1a210 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
1a220 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1a230 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a240 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a250 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a260 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
1a270 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
1a280 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
1a290 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
1a2a0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1a2b0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
1a2c0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
1a2d0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
1a2e0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
1a2f0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1a300 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
1a310 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
1a320 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
1a330 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
1a340 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
1a350 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
1a360 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
1a370 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
1a380 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
1a390 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
1a3a0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
1a3b0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1a3c0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
1a3d0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
1a3e0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1a3f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a400 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1a410 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1a420 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1a430 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1a440 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1a450 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a460 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a470 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
1a480 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1a490 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
1a4a0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a4b0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1a4c0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1a4d0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  8]);.    pCur->i
1a4e0 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  dx = pPage->nCel
1a4f0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
1a500 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1a510 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
1a520 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1a530 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70  .  pCur->idx = p
1a540 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b  Page->nCell - 1;
1a550 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1a560 69 7a 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ize = 0;.  retur
1a570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a580 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a590 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
1a5a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1a5b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1a5c0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1a5d0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1a5e0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a5f0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a600 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a610 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a620 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a630 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a640 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
1a650 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
1a660 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1a670 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
1a680 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1a690 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
1a6a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
1a6b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a6c0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1a6d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a6e0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1a6f0 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
1a700 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1a710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1a720 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1a730 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
1a740 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1a750 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1a760 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
1a770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1a780 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1a790 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1a7a0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1a7b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1a7c0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1a7d0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1a7e0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1a7f0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1a800 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1a810 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1a820 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1a830 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1a840 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
1a850 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1a860 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1a870 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  c;.  rc = moveTo
1a880 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
1a890 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1a8a0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1a8b0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1a8c0 74 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65  tate ){.    asse
1a8d0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1a8e0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1a8f0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1a900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a910 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a920 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a930 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a940 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20  *pRes = 0;.  rc 
1a950 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1a960 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
1a970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1a980 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
1a990 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1a9a0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 70   an entry near p
1a9b0 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74  Key/nKey..** Ret
1a9c0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
1a9d0 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
1a9e0 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  TKEY tables, onl
1a9f0 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d  y the nKey param
1aa00 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
1aa10 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
1aa20 64 2e 20 20 46 6f 72 20 6f 74 68 65 72 20 74 61  d.  For other ta
1aa30 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20 74 68  bles, nKey is th
1aa40 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1aa50 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20  s of data.** in 
1aa60 70 4b 65 79 2e 20 20 54 68 65 20 63 6f 6d 70 61  pKey.  The compa
1aa70 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 73  rison function s
1aa80 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 74 68  pecified when th
1aa90 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
1aaa0 63 72 65 61 74 65 64 20 69 73 20 75 73 65 64 20  created is used 
1aab0 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65 79 73 2e  to compare keys.
1aac0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
1aad0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
1aae0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
1aaf0 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
1ab00 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
1ab10 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
1ab20 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
1ab30 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
1ab40 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
1ab50 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
1ab60 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
1ab70 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
1ab80 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
1ab90 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
1aba0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f  .** The result o
1abb0 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
1abc0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
1abd0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a  ry to which the.
1abe0 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69  ** cursor is wri
1abf0 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66  tten to *pRes if
1ac00 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68   pRes!=NULL.  Th
1ac10 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20  e meaning of.** 
1ac20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73  this value is as
1ac30 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1ac40 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
1ac50 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1ac60 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1ac70 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
1aca0 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65  n pKey or if the
1acb0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
1acc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1acd0 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
1ace0 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
1acf0 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
1ad00 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
1ad10 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
1ad20 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1ad30 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1ad40 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1ad60 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
1ad70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
1ad80 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
1ad90 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1ada0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1adb0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1add0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79  larger than pKey
1ade0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1adf0 42 74 72 65 65 4d 6f 76 65 74 6f 28 42 74 43 75  BtreeMoveto(BtCu
1ae00 72 73 6f 72 20 2a 70 43 75 72 2c 20 63 6f 6e 73  rsor *pCur, cons
1ae10 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
1ae20 34 20 6e 4b 65 79 2c 20 69 6e 74 20 2a 70 52 65  4 nKey, int *pRe
1ae30 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1ae40 69 6e 74 20 74 72 79 52 69 67 68 74 6d 6f 73 74  int tryRightmost
1ae50 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1ae60 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1ae70 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1ae80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ae90 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
1aea0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
1aeb0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 74 72 79  >isInit );.  try
1aec0 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 43 75 72  Rightmost = pCur
1aed0 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b  ->pPage->intKey;
1aee0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1aef0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1af00 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
1af10 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
1af20 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1af30 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1af40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1af50 3b 0a 20 20 7d 0a 20 20 20 66 6f 72 28 3b 3b 29  ;.  }.   for(;;)
1af60 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
1af70 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
1af80 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
1af90 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
1afa0 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63  pPage;.    int c
1afb0 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20   = -1;  /* pRes 
1afc0 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20  return if table 
1afd0 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65  is empty must be
1afe0 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d   -1 */.    lwr =
1aff0 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
1b000 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
1b010 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
1b020 74 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d 30 20  tKey && pKey==0 
1b030 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b040 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b050 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
1b060 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61  ageIntegrity(pPa
1b070 67 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ge);.    while( 
1b080 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20  lwr<=upr ){.    
1b090 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
1b0a0 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c  ;.      i64 nCel
1b0b0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72  lKey;.      pCur
1b0c0 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  ->idx = (lwr+upr
1b0d0 29 2f 32 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  )/2;.      pCur-
1b0e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1b0f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1b100 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1b110 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
1b120 20 20 20 20 20 20 20 69 66 28 20 74 72 79 52 69         if( tryRi
1b130 67 68 74 6d 6f 73 74 20 29 7b 0a 20 20 20 20 20  ghtmost ){.     
1b140 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1b150 20 75 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a   upr;.        }.
1b160 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
1b170 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1b180 70 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61  pCur->idx) + pPa
1b190 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
1b1a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1b1b0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
1b1c0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
1b1d0 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
1b1e0 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
1b1f0 74 33 32 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d  t32(pCell, &dumm
1b200 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
1b210 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
1b220 70 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e  pCell, (u64 *)&n
1b230 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1b240 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e    if( nCellKey<n
1b250 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1b260 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
1b270 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
1b280 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key>nKey ){.    
1b290 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1b2a0 20 20 20 20 20 20 20 20 74 72 79 52 69 67 68 74          tryRight
1b2b0 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  most = 0;.      
1b2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b2d0 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
1b2e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1b2f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61  .        int ava
1b300 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ilable;.        
1b310 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64  pCellKey = (void
1b320 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28   *)fetchPayload(
1b330 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
1b340 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
1b350 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69  ellKey = pCur->i
1b360 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
1b370 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e    if( available>
1b380 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  =nCellKey ){.   
1b390 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
1b3a0 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
1b3b0 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
1b3c0 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
1b3d0 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  pKey);.        }
1b3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b3f0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
1b400 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65 6c  eMallocRaw( nCel
1b410 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  lKey );.        
1b420 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
1b430 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1b440 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
1b450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b460 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
1b470 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64   nCellKey, (void
1b480 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20   *)pCellKey);.  
1b490 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72          c = pCur
1b4a0 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d  ->xCompare(pCur-
1b4b0 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c  >pArg, nCellKey,
1b4c0 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c   pCellKey, nKey,
1b4d0 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   pKey);.        
1b4e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 65    sqliteFree(pCe
1b4f0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1b500 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1b510 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1b520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b530 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
1b540 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1b550 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d  fData && !pPage-
1b560 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
1b570 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69     lwr = pCur->i
1b580 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70  dx;.          up
1b590 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20  r = lwr - 1;.   
1b5a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b5b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b5c0 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20         if( pRes 
1b5d0 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20  ) *pRes = 0;.   
1b5e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1b5f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1b600 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b610 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
1b620 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e      lwr = pCur->
1b630 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c  idx+1;.      }el
1b640 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20  se{.        upr 
1b650 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20  = pCur->idx-1;. 
1b660 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b670 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1b680 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1b690 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1b6a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1b6b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1b6c0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1b6d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1b6e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1b6f0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1b700 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b710 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b720 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1b730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1b740 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1b750 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1b760 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1b770 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1b780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b790 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1b7a0 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
1b7b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1b7c0 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1b7d0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
1b7e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b7f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  K;.    }.    pCu
1b800 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20  r->idx = lwr;.  
1b810 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1b820 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ze = 0;.    rc =
1b830 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1b840 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
1b850 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1b860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b870 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45  .  }.  /* NOT RE
1b880 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  ACHED */.}../*.*
1b890 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1b8a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1b8b0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
1b8c0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
1b8d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
1b8e0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1b8f0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
1b900 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
1b910 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
1b920 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
1b930 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
1b940 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
1b950 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
1b960 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
1b970 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
1b980 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
1b990 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1b9a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b9b0 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
1b9c0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
1b9d0 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
1b9e0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
1b9f0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1ba00 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
1ba10 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
1ba20 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
1ba30 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
1ba40 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
1ba50 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
1ba60 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
1ba70 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
1ba80 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
1ba90 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
1baa0 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
1bab0 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
1bac0 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
1bad0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
1bae0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1baf0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1bb00 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1bb10 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1bb20 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1bb30 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1bb40 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
1bb50 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1bb60 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1bb70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1bb80 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1bb90 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
1bba0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1bbb0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
1bbc0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1bbd0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1bbe0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 23 69 66 6e  ge *pPage;..#ifn
1bbf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bc00 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 72  SHARED_CACHE.  r
1bc10 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
1bc20 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
1bc30 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28  (pCur, 1);.  if(
1bc40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bc50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1bc60 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1bc70 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70  >skip>0 ){.    p
1bc80 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1bc90 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1bca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bcb0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1bcc0 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  skip = 0;.#endif
1bcd0 20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   ..  assert( pRe
1bce0 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  s!=0 );.  pPage 
1bcf0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1bd00 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1bd10 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1bd20 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1bd30 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1bd40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1bd50 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1bd60 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1bd70 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  t( pCur->idx<pPa
1bd80 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
1bd90 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70  pCur->idx++;.  p
1bda0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1bdb0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
1bdc0 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
1bdd0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
1bde0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bdf0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1be00 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1be10 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1be20 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1be30 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
1be40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1be50 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
1be60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1be70 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
1be80 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1be90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1bea0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  do{.      if( is
1beb0 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
1bec0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
1bed0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
1bee0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1bef0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1bf00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bf10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1bf20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
1bf30 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
1bf40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1bf50 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
1bf60 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65  pCur->idx>=pPage
1bf70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
1bf80 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
1bf90 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  ( pPage->leafDat
1bfa0 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  a ){.      rc = 
1bfb0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1bfc0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1bfd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1bfe0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bff0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1c000 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
1c010 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
1c020 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
1c030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c040 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
1c050 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1c060 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c070 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
1c080 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
1c090 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
1c0a0 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
1c0b0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1c0c0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1c0d0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1c0e0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1c0f0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1c100 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
1c110 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1c120 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1c130 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1c140 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1c150 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1c160 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c170 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
1c180 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1c190 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1c1a0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65   Pgno pgno;.  Me
1c1b0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 23  mPage *pPage;..#
1c1c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c1d0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1c1e0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
1c1f0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
1c200 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20  ion(pCur, 1);.  
1c210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c220 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1c230 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
1c240 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20  ur->skip<0 ){.  
1c250 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1c260 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1c270 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c280 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1c290 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e  r->skip = 0;.#en
1c2a0 64 69 66 0a 0a 20 20 69 66 28 20 43 55 52 53 4f  dif..  if( CURSO
1c2b0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1c2c0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1c2d0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1c2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c2f0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
1c300 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
1c310 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1c320 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
1c330 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b   pCur->idx>=0 );
1c340 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1c350 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1c360 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64  = get4byte( find
1c370 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1c380 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63  ->idx) );.    rc
1c390 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1c3a0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
1c3b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1c3c0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
1c3d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
1c3e0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1c3f0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64   while( pCur->id
1c400 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x==0 ){.      if
1c410 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61  ( isRootPage(pPa
1c420 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ge) ){.        p
1c430 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1c440 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1c450 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1c460 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c480 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
1c490 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1c4a0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
1c4b0 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20  >pPage;.    }.  
1c4c0 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20    pCur->idx--;. 
1c4d0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1c4e0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ize = 0;.    if(
1c4f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1c500 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
1c510 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c520 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1c530 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
1c540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c550 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1c570 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
1c580 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1c590 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
1c5a0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
1c5b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1c5c0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
1c5d0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1c5e0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
1c5f0 64 73 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72  ds, sqlite3pager
1c600 5f 77 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  _write().** has 
1c610 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1c620 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
1c630 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
1c640 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
1c650 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
1c660 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
1c670 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
1c680 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1c690 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  ng.** sqlite3pag
1c6a0 65 72 5f 75 6e 72 65 66 28 29 20 6f 6e 20 74 68  er_unref() on th
1c6b0 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
1c6c0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
1c6d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1c6e0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1c6f0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
1c700 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1c710 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
1c720 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
1c730 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
1c740 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
1c750 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
1c760 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
1c770 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1c780 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
1c790 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
1c7a0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1c7b0 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
1c7c0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1c7d0 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c  0, then a (feebl
1c7e0 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  e) effort is mad
1c7f0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
1c800 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
1c810 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1c820 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
1c830 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
1c840 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
1c850 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
1c860 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
1c870 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
1c880 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
1c890 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
1c8a0 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
1c8b0 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
1c8c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61  *.** If the "exa
1c8d0 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  ct" parameter is
1c8e0 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20   not 0, and the 
1c8f0 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72  page-number near
1c900 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e  by exists .** an
1c910 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
1c920 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
1c930 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
1c940 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54  o be returned. T
1c950 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75  his.** is only u
1c960 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1c970 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65  um databases whe
1c980 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  n allocating a n
1c990 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ew table..*/.sta
1c9a0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1c9b0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1c9c0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
1c9d0 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
1c9e0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
1c9f0 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
1ca00 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
1ca10 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
1ca20 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
1ca30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ca40 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1ca50 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
1ca60 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
1ca70 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
1ca80 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
1ca90 72 65 65 6c 69 73 74 20 2a 2f 0a 0a 20 20 70 50  reelist */..  pP
1caa0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1cab0 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  e1;.  n = get4by
1cac0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1cad0 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  a[36]);.  if( n>
1cae0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
1caf0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
1cb00 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
1cb10 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
1cb20 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 4d   pages. */.    M
1cb30 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
1cb40 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   0;.    Pgno iTr
1cb50 75 6e 6b 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  unk;.    MemPage
1cb60 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
1cb70 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
1cb80 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
1cb90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
1cba0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
1cbb0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
1cbc0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1cbd0 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
1cbe0 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
1cbf0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
1cc00 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
1cc10 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
1cc20 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
1cc30 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
1cc40 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
1cc50 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
1cc60 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
1cc70 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1cc80 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
1cc90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cca0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ccb0 20 20 20 20 69 66 28 20 65 78 61 63 74 20 29 7b      if( exact ){
1ccc0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
1ccd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1cce0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
1ccf0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
1cd00 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
1cd10 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1cd20 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
1cd30 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
1cd40 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1cd50 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
1cd60 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1cd70 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
1cd80 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
1cd90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1cda0 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
1cdb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1cdc0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1cdd0 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
1cde0 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
1cdf0 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
1ce00 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
1ce10 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
1ce20 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
1ce30 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
1ce40 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
1ce50 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1ce60 72 5f 77 72 69 74 65 28 70 50 61 67 65 31 2d 3e  r_write(pPage1->
1ce70 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1ce80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ce90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1cea0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1ceb0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
1cec0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
1ced0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
1cee0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
1cef0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
1cf00 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
1cf10 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
1cf20 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
1cf30 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
1cf40 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
1cf50 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
1cf60 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
1cf70 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
1cf80 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
1cf90 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
1cfa0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
1cfb0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
1cfc0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
1cfd0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1cfe0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1cff0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
1d000 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
1d010 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1d020 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1d030 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1d040 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1d050 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
1d060 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unk);.      if( 
1d070 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1d080 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1d090 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  runk);.        r
1d0a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d0b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
1d0c0 3a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6d 6f  : This should mo
1d0d0 76 65 20 74 6f 20 61 66 74 65 72 20 74 68 65 20  ve to after the 
1d0e0 6c 6f 6f 70 3f 20 2a 2f 0a 20 20 20 20 20 20 72  loop? */.      r
1d0f0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1d100 5f 77 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 61  _write(pTrunk->a
1d110 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
1d120 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
1d130 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1d140 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  k);.        rele
1d150 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
1d160 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nk);.        ret
1d170 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d180 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
1d190 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1d1a0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
1d1b0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
1d1c0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
1d1d0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
1d1e0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
1d1f0 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
1d200 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
1d210 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
1d220 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
1d230 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
1d240 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
1d250 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
1d260 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
1d270 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1d280 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
1d290 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 50 67   );.        *pPg
1d2a0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
1d2b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1d2c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1d2d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1d2e0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
1d2f0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1d300 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1d310 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1d320 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1d330 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1d340 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1d350 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1d360 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d370 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  k>pBt->usableSiz
1d380 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1d390 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
1d3a0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1d3b0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
1d3c0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1d3d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d3e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
1d3f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d400 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1d410 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
1d420 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
1d430 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
1d440 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
1d450 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
1d460 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
1d470 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
1d480 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
1d490 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
1d4a0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1d4b0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
1d4c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d4d0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1d4e0 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
1d4f0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1d500 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
1d510 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1d520 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
1d530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1d540 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1d550 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1d560 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1d570 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1d580 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1d590 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d5a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1d5b0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
1d5c0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1d5d0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1d5e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d5f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d600 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1d610 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
1d620 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1d630 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
1d640 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
1d650 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
1d660 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
1d670 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
1d680 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
1d690 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
1d6a0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
1d6b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d6c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
1d6d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
1d6e0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
1d6f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1d700 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
1d710 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
1d720 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
1d730 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
1d740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d750 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1d770 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1d780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1d790 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
1d7a0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1d7b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d7c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d7d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d7e0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 4e 65  3pager_write(pNe
1d7f0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a  wTrunk->aData);.
1d800 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1d810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d820 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1d830 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
1d840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1d850 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
1d860 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
1d870 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1d880 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  vTrunk);.       
1d890 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d8a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d8b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
1d8c0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
1d8d0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1d8e0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1d8f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
1d900 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
1d910 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1d920 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
1d930 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
1d940 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
1d950 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
1d960 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1d970 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1d980 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1d990 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d9a0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
1d9b0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1d9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1d9d0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1d9e0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
1d9f0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1da00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
1da10 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1da20 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  runk);.        }
1da30 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1da40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1da50 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1da60 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1da70 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1da80 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1da90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1daa0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
1dab0 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
1dac0 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
1dad0 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73          int clos
1dae0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
1daf0 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
1db00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1db10 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
1db20 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
1db30 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
1db40 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
1db50 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1db60 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1db70 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
1db80 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
1db90 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1dba0 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
1dbb0 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
1dbc0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1dbd0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
1dbe0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1dbf0 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
1dc00 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
1dc10 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1dc20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
1dc30 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
1dc40 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
1dc50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dc60 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
1dc70 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
1dc80 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
1dc90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1dca0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dcb0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1dcc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1dcd0 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
1dce0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1dcf0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
1dd00 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
1dd10 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
1dd20 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
1dd30 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1dd40 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1dd50 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74  if( *pPgno>sqlit
1dd60 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
1dd70 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
1dd80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1dd90 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74   Free page off t
1dda0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1ddb0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
1ddc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ddd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1dde0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ddf0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1de00 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
1de10 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
1de20 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
1de30 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
1de40 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
1de50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1de60 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
1de70 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
1de80 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
1de90 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
1dea0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
1deb0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1dec0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
1ded0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
1dee0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1def0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
1df00 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
1df10 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1df20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
1df30 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1df40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1df50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1df70 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1df80 5f 72 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61  _rollback((*ppPa
1df90 67 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge)->aData);.   
1dfa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1dfb0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1dfc0 28 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74  ((*ppPage)->aDat
1dfd0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
1dfe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1dff0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1e000 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
1e010 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
1e020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e030 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
1e040 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
1e050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e060 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e070 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
1e080 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
1e090 4c 69 73 74 20 29 3b 0a 20 20 20 20 72 65 6c 65  List );.    rele
1e0a0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
1e0b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1e0c0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
1e0d0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1e0e0 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
1e0f0 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
1e100 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
1e110 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a  he file */.    *
1e120 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 70  pPgno = sqlite3p
1e130 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
1e140 42 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b  Bt->pPager) + 1;
1e150 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e160 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e170 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1e180 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
1e190 41 50 5f 49 53 50 41 47 45 28 70 42 74 2d 3e 75  AP_ISPAGE(pBt->u
1e1a0 73 61 62 6c 65 53 69 7a 65 2c 20 2a 70 50 67 6e  sableSize, *pPgn
1e1b0 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  o) ){.      /* I
1e1c0 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
1e1d0 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
1e1e0 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
1e1f0 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
1e200 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
1e210 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
1e220 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
1e230 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
1e240 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
1e250 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
1e260 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
1e270 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
1e280 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1e290 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e2a0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1e2b0 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
1e2c0 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
1e2d0 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70  map page)\n", *p
1e2e0 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73  Pgno));.      as
1e2f0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1e300 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e310 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a  pBt) );.      (*
1e320 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a  pPgno)++;.    }.
1e330 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
1e340 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1e350 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e360 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  t) );.    rc = g
1e370 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1e380 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 20  no, ppPage);.   
1e390 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e3a0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
1e3b0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1e3c0 28 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74  ((*ppPage)->aDat
1e3d0 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  a);.    if( rc!=
1e3e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e3f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
1e400 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
1e410 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e420 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
1e430 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
1e440 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
1e450 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1e460 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e470 70 42 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  pBt) );.  return
1e480 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1e490 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20  d a page of the 
1e4a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1e4b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
1e4c0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  *.** sqlite3page
1e4d0 72 5f 75 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  r_unref() is NOT
1e4e0 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
1e4f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e500 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
1e510 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
1e520 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1e530 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
1e540 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1e550 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
1e560 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
1e570 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
1e580 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
1e590 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1e5a0 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61  >pgno>1 );.  pPa
1e5b0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
1e5c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1e5d0 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
1e5e0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
1e5f0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
1e600 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
1e610 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
1e620 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
1e630 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1e640 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1e650 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e660 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34  n rc;.  n = get4
1e670 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1e680 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
1e690 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1e6a0 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a  ata[36], n+1);..
1e6b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e6c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e6d0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1e6e0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
1e6f0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
1e700 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
1e710 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
1e720 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1e730 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
1e740 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ee..  */.  if( p
1e750 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1e760 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
1e770 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d  pPut(pBt, pPage-
1e780 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52  >pgno, PTRMAP_FR
1e790 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  EEPAGE, 0);.    
1e7a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e7b0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1e7c0 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1e7d0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1e7e0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1e7f0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1e800 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1e810 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1e820 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e830 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65  rn rc;.    memse
1e840 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
1e850 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62  0, 8);.    put4b
1e860 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e870 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
1e880 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28  gno);.    TRACE(
1e890 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1e8a0 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d  first\n", pPage-
1e8b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
1e8c0 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66  {.    /* Other f
1e8d0 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64  ree pages alread
1e8e0 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76  y exist.  Retriv
1e8f0 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  e the first trun
1e900 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66  k page.    ** of
1e910 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
1e920 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d  d find out how m
1e930 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61  any leaves it ha
1e940 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  s. */.    MemPag
1e950 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72  e *pTrunk;.    r
1e960 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
1e970 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1e980 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26  1->aData[32]), &
1e990 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 69 66 28  pTrunk);.    if(
1e9a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e9b0 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74  .    k = get4byt
1e9c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1e9d0 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e  [4]);.    if( k>
1e9e0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
1e9f0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
1ea00 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20  /* The trunk is 
1ea10 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20  full.  Turn the 
1ea20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
1ea30 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20   into a new.    
1ea40 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
1ea50 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20  with no leaves. 
1ea60 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1ea70 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1ea80 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1ea90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1eaa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1eab0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1eac0 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70  aData, pTrunk->p
1ead0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 75 74 34  gno);.      put4
1eae0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1eaf0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ta[4], 0);.     
1eb00 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1eb10 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50  1->aData[32], pP
1eb20 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1eb30 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1eb40 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
1eb50 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
1eb60 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
1eb70 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
1eb80 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  o, pTrunk->pgno)
1eb90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1eba0 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
1ebb0 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20  ewly freed page 
1ebc0 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65  as a leaf on the
1ebd0 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a   current trunk *
1ebe0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1ebf0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1ec00 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a  pTrunk->aData);.
1ec10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1ec20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ec30 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
1ec40 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29  ->aData[4], k+1)
1ec50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1ec60 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1ec70 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70  8+k*4], pPage->p
1ec80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  gno);.      sqli
1ec90 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
1eca0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ite(pBt->pPager,
1ecb0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1ecc0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
1ecd0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
1ece0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
1ecf0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
1ed00 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
1ed10 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
1ed20 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
1ed30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ed40 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
1ed50 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
1ed60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ed70 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
1ed80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1ed90 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
1eda0 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
1edb0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
1edc0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1edd0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1ede0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1edf0 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
1ee00 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 72    int rc;..  par
1ee10 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1ee20 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1ee30 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
1ee40 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
1ee50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ee60 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
1ee70 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
1ee80 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1ee90 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
1eea0 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
1eeb0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1eec0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 77 68  Overflow]);.  wh
1eed0 69 6c 65 28 20 6f 76 66 6c 50 67 6e 6f 21 3d 30  ile( ovflPgno!=0
1eee0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
1eef0 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20  *pOvfl;.    if( 
1ef00 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33  ovflPgno>sqlite3
1ef10 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
1ef20 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1ef30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ef40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ef50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1ef60 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76   getPage(pBt, ov
1ef70 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 29 3b  flPgno, &pOvfl);
1ef80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ef90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
1efa0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
1efb0 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29 3b 0a  (pOvfl->aData);.
1efc0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
1efd0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
1efe0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1eff0 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29 3b 0a  (pOvfl->aData);.
1f000 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f010 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
1f020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f030 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1f040 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
1f050 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
1f060 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
1f070 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
1f080 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
1f090 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
1f0a0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
1f0b0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
1f0c0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
1f0d0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
1f0e0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
1f0f0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
1f100 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1f110 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
1f120 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
1f130 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1f140 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
1f150 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1f160 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
1f170 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
1f180 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
1f190 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
1f1a0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
1f1b0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
1f1c0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
1f1d0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
1f1e0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
1f1f0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
1f200 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
1f210 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
1f220 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
1f230 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1f240 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
1f250 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f270 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1f280 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
1f290 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1f2a0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
1f2b0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
1f2c0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
1f2d0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
1f2e0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
1f2f0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
1f300 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1f310 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
1f320 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
1f330 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
1f340 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1f350 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
1f360 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
1f370 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
1f380 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
1f390 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
1f3a0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
1f3b0 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
1f3c0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
1f3d0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
1f3e0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
1f3f0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
1f400 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
1f410 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
1f420 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f430 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
1f440 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
1f450 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
1f460 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1f470 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
1f480 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
1f490 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
1f4a0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1f4b0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
1f4c0 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
1f4d0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1f4e0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
1f4f0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
1f500 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
1f510 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f520 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  nData = 0;.  }. 
1f530 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
1f540 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
1f550 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
1f560 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43 65 6c  Key);.  parseCel
1f570 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1f580 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
1f590 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
1f5a0 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
1f5b0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
1f5c0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
1f5d0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
1f5e0 3d 6e 44 61 74 61 20 29 3b 0a 20 20 0a 20 20 2f  =nData );.  .  /
1f5f0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
1f600 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
1f610 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20 69  oad = nData;.  i
1f620 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1f630 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
1f640 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
1f650 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
1f660 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
1f670 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
1f680 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
1f690 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
1f6a0 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
1f6b0 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
1f6c0 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
1f6d0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
1f6e0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
1f6f0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
1f700 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
1f710 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
1f720 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
1f730 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
1f740 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
1f750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f760 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f770 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
1f780 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
1f790 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
1f7a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1f7b0 74 72 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64  try page */.#end
1f7c0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
1f7d0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1f7e0 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
1f7f0 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
1f800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f810 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f820 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1f830 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
1f840 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
1f850 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
1f860 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
1f870 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
1f880 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
1f890 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
1f8a0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
1f8b0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
1f8c0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
1f8d0 77 2e 20 54 68 65 20 65 6e 74 72 79 20 66 6f 72  w. The entry for
1f8e0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
1f8f0 6c 6f 77 20 70 61 67 65 20 77 69 6c 6c 20 62 65  low page will be
1f900 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20  .      ** added 
1f910 6c 61 74 65 72 2c 20 62 79 20 74 68 65 20 69 6e  later, by the in
1f920 73 65 72 74 43 65 6c 6c 28 29 20 72 6f 75 74 69  sertCell() routi
1f930 6e 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ne..      */.   
1f940 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1f950 56 61 63 75 75 6d 20 26 26 20 70 67 6e 6f 50 74  Vacuum && pgnoPt
1f960 72 6d 61 70 21 3d 30 20 26 26 20 72 63 3d 3d 53  rmap!=0 && rc==S
1f970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f980 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
1f990 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
1f9a0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
1f9b0 57 32 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b  W2, pgnoPtrmap);
1f9c0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f9d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1f9e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1f9f0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
1fa00 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 65 61  .        /* clea
1fa10 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
1fa20 6c 6c 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll); */.        
1fa30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1fa40 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1fa50 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
1fa60 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
1fa70 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
1fa80 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
1fa90 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
1faa0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
1fab0 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
1fac0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
1fad0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
1fae0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
1faf0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
1fb00 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
1fb10 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
1fb20 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
1fb30 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
1fb40 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
1fb50 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20  = spaceLeft;.   
1fb60 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
1fb70 3d 20 6e 53 72 63 3b 0a 20 20 20 20 6d 65 6d 63  = nSrc;.    memc
1fb80 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
1fb90 63 2c 20 6e 29 3b 0a 20 20 20 20 6e 50 61 79 6c  c, n);.    nPayl
1fba0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
1fbb0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
1fbc0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
1fbd0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
1fbe0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
1fbf0 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
1fc00 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
1fc10 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
1fc20 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
1fc30 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
1fc40 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
1fc50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fc60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
1fc70 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ge the MemPage.p
1fc80 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
1fc90 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73 65  n the page whose
1fca0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69   number is.** gi
1fcb0 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
1fcc0 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68  d argument so th
1fcd0 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  at MemPage.pPare
1fce0 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  nt holds the.** 
1fcf0 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74  pointer in the t
1fd00 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  hird argument..*
1fd10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
1fd20 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61 72  arentPage(BtShar
1fd30 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
1fd40 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  no, MemPage *pNe
1fd50 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64 78  wParent, int idx
1fd60 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
1fd70 68 69 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  his;.  unsigned 
1fd80 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 0a 20 20  char *aData;..  
1fd90 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65  if( pgno==0 ) re
1fda0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fdb0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
1fdc0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 44  Pager!=0 );.  aD
1fdd0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 70 61 67  ata = sqlite3pag
1fde0 65 72 5f 6c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  er_lookup(pBt->p
1fdf0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1fe00 69 66 28 20 61 44 61 74 61 20 29 7b 0a 20 20 20  if( aData ){.   
1fe10 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67   pThis = (MemPag
1fe20 65 2a 29 26 61 44 61 74 61 5b 70 42 74 2d 3e 70  e*)&aData[pBt->p
1fe30 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 61 73  ageSize];.    as
1fe40 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61  sert( pThis->aDa
1fe50 74 61 3d 3d 61 44 61 74 61 20 29 3b 0a 20 20 20  ta==aData );.   
1fe60 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e   if( pThis->isIn
1fe70 69 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  it ){.      if( 
1fe80 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d  pThis->pParent!=
1fe90 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20  pNewParent ){.  
1fea0 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
1feb0 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74  >pParent ) sqlit
1fec0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 54  e3pager_unref(pT
1fed0 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 61 44  his->pParent->aD
1fee0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ata);.        pT
1fef0 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  his->pParent = p
1ff00 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
1ff10 20 20 20 69 66 28 20 70 4e 65 77 50 61 72 65 6e     if( pNewParen
1ff20 74 20 29 20 73 71 6c 69 74 65 33 70 61 67 65 72  t ) sqlite3pager
1ff30 5f 72 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d  _ref(pNewParent-
1ff40 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  >aData);.      }
1ff50 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64  .      pThis->id
1ff60 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20  xParent = idx;. 
1ff70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ff80 70 61 67 65 72 5f 75 6e 72 65 66 28 61 44 61 74  pager_unref(aDat
1ff90 61 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  a);.  }..#ifndef
1ffa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1ffb0 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
1ffc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1ffd0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d  .    return ptrm
1ffe0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c  apPut(pBt, pgno,
1fff0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
20000 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  NewParent->pgno)
20010 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
20020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20030 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  .}..../*.** Chan
20040 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  ge the pParent p
20050 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63 68  ointer of all ch
20060 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65 20  ildren of pPage 
20070 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a  to point back.**
20080 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   to pPage..**.**
20090 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
200a0 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c 64   for every child
200b0 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f 6b   of pPage, invok
200c0 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 29  e reparentPage()
200d0 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  .** to make sure
200e0 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c 64   that each child
200f0 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61 67   knows that pPag
20100 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  e is its parent.
20110 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20120 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
20130 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70 79  after you memcpy
20140 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74 6f  () one page into
20150 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a  .** another..*/.
20160 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72  static int repar
20170 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65  entChildPages(Me
20180 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
20190 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61 72   int i;.  BtShar
201a0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
201b0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
201c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
201d0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
201e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
201f0 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  K;..  for(i=0; i
20200 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
20210 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
20220 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
20230 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
20240 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
20250 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 70 61  .      rc = repa
20260 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65  rentPage(pBt, ge
20270 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
20280 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
20290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
202a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
202b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
202c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
202d0 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
202e0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
202f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
20300 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
20310 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 70  t+8]), .       p
20320 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 50  Page, i);.    pP
20330 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
20340 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
20350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  rc;.}../*.** Rem
20360 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
20370 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
20380 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
20390 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
203a0 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
203b0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
203c0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
203d0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
203e0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
203f0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
20400 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
20410 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
20420 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
20430 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
20440 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
20450 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
20460 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
20470 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
20480 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
20490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
204a0 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
204b0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
204c0 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74  , int sz){.  int
204d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
204e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
204f0 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
20500 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
20510 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
20520 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
20530 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
20540 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
20550 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
20560 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
20570 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
20580 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
20590 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
205a0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
205b0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
205c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
205d0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
205e0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
205f0 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t( sqlite3pager_
20600 69 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  iswriteable(pPag
20610 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 64  e->aData) );.  d
20620 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
20630 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
20640 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
20650 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
20660 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
20670 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63  r);.  assert( pc
20680 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50  >10 && pc+sz<=pP
20690 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
206a0 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70  Size );.  freeSp
206b0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
206c0 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b  z);.  for(i=idx+
206d0 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
206e0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
206f0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
20700 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
20710 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
20720 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
20730 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
20740 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
20750 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
20760 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
20770 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61  Free += 2;.  pPa
20780 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
20790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
207a0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
207b0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
207c0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
207d0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
207e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
207f0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
20800 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
20810 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
20820 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
20830 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
20840 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
20850 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
20860 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
20870 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
20880 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
20890 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
208a0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
208b0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
208c0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
208d0 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
208e0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
208f0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
20900 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
20910 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
20920 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
20930 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
20940 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
20950 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
20960 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
20970 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
20980 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
20990 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
209a0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
209b0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
209c0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
209d0 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
209e0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
209f0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
20a00 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
20a10 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
20a20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
20a30 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
20a40 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
20a50 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
20a60 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
20a70 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
20a80 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
20a90 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
20aa0 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
20ab0 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
20ac0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
20ad0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
20ae0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
20af0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
20b00 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
20b10 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
20b20 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
20b30 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
20b40 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
20b50 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
20b60 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
20b70 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
20b80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
20b90 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
20ba0 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
20bb0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
20bc0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
20bd0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
20be0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
20bf0 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
20c00 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
20c10 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
20c20 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
20c30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
20c40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
20c50 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
20c60 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
20c70 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
20c80 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
20c90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20ca0 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
20cb0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
20cc0 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
20cd0 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
20ce0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
20cf0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
20d00 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
20d10 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
20d20 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
20d30 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
20d40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
20d50 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
20d60 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
20d70 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
20d80 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
20d90 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
20da0 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
20db0 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
20dc0 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
20dd0 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
20de0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
20df0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
20e00 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
20e10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
20e20 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
20e30 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
20e40 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
20e50 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
20e60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
20e70 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
20e80 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
20e90 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
20ea0 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
20eb0 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
20ec0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
20ed0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
20ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
20ef0 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
20f00 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61  eable(pPage->aDa
20f10 74 61 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ta) );.  if( pPa
20f20 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
20f30 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
20f40 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
20f50 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
20f60 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
20f70 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
20f80 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
20f90 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
20fa0 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
20fb0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
20fc0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69      assert( j<si
20fd0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
20fe0 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
20ff0 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20  >aOvfl[0]) );.  
21000 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
21010 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
21020 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
21030 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20  l[j].idx = i;.  
21040 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
21050 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
21060 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
21070 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
21080 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
21090 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
210a0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
210b0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
210c0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
210d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
210e0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
210f0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
21100 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
21110 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
21120 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
21130 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 69   - sz ){.      i
21140 6e 74 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65  nt rc = defragme
21150 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
21160 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21170 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
21180 72 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20  rc;.      top = 
21190 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
211a0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
211b0 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
211c0 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
211d0 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
211e0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
211f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
21200 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
21210 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
21220 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
21230 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
21240 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
21250 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
21260 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
21270 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
21280 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
21290 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
212a0 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
212b0 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
212c0 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
212d0 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
212e0 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
212f0 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
21300 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
21310 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
21320 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
21330 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
21340 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
21350 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
21360 3b 0a 20 20 20 20 70 61 67 65 49 6e 74 65 67 72  ;.    pageIntegr
21370 69 74 79 28 70 50 61 67 65 29 3b 0a 23 69 66 6e  ity(pPage);.#ifn
21380 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21390 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
213a0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
213b0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
213c0 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
213d0 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
213e0 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
213f0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
21400 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
21410 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
21420 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
21430 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
21440 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
21450 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
21460 66 6f 3b 0a 20 20 20 20 20 20 70 61 72 73 65 43  fo;.      parseC
21470 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
21480 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
21490 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
214a0 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
214b0 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
214c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
214d0 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f         Pgno pgno
214e0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
214f0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
21500 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
21510 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61 70   int rc = ptrmap
21520 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
21530 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
21540 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
21550 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
21560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21570 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
21580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
21590 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
215a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
215b0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
215c0 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
215d0 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
215e0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
215f0 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
21600 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
21610 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
21620 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
21630 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
21640 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
21650 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
21660 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
21670 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
21680 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
21690 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
216a0 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
216b0 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
216c0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
216d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
216e0 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
216f0 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65 20 20 20  .  int *aSize   
21700 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
21710 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
21720 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
21730 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21740 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
21750 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54  talSize;    /* T
21760 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  otal size of all
21770 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20   cells */.  int 
21780 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
21790 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68   Index of page h
217a0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
217b0 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20  ellptr;      /* 
217c0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
217d0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
217e0 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
217f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
21800 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
21810 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
21820 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
21830 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
21840 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21850 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
21860 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20  ;.  totalSize = 
21870 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
21880 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
21890 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53   totalSize += aS
218a0 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  ize[i];.  }.  as
218b0 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b  sert( totalSize+
218c0 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  2*nCell<=pPage->
218d0 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72  nFree );.  asser
218e0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
218f0 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20  =0 );.  cellptr 
21900 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
21910 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
21920 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
21930 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
21940 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65  fset;.  put2byte
21950 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
21960 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65  Cell);.  if( nCe
21970 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f  ll ){.    cellbo
21980 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  dy = allocateSpa
21990 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53  ce(pPage, totalS
219a0 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ize);.    assert
219b0 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a  ( cellbody>0 );.
219c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
219d0 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43  e->nFree >= 2*nC
219e0 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ell );.    pPage
219f0 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65  ->nFree -= 2*nCe
21a00 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ll;.    for(i=0;
21a10 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
21a20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
21a30 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63  data[cellptr], c
21a40 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20  ellbody);.      
21a50 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
21a60 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
21a70 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20  ], aSize[i]);.  
21a80 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32      cellptr += 2
21a90 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79  ;.      cellbody
21aa0 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
21ab0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21ac0 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d  cellbody==pPage-
21ad0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
21ae0 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d   );.  }.  pPage-
21af0 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a  >nCell = nCell;.
21b00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
21b10 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
21b20 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
21b30 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
21b40 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
21b50 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
21b60 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
21b70 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
21b80 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
21b90 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
21ba0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
21bb0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
21bc0 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
21bd0 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
21be0 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
21bf0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
21c00 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
21c10 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
21c20 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
21c30 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
21c40 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
21c50 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
21c60 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
21c70 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
21c80 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
21c90 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
21ca0 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
21cb0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
21cc0 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
21cd0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
21ce0 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
21cf0 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
21d00 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
21d10 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
21d20 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
21d30 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
21d40 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
21d50 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
21d60 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
21d70 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
21d80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
21d90 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
21da0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
21db0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
21dc0 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
21dd0 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
21de0 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
21df0 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  ce */../* Forwar
21e00 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
21e10 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
21e20 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29  e(MemPage*, int)
21e30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
21e40 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
21e50 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
21e60 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
21e70 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
21e80 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
21e90 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
21ea0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
21eb0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
21ec0 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
21ed0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
21ee0 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
21ef0 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
21f00 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
21f10 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
21f20 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
21f30 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
21f40 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
21f50 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
21f60 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
21f70 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
21f80 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
21f90 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
21fa0 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
21fb0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
21fc0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
21fd0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
21fe0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
21ff0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
22000 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
22010 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
22020 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
22030 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
22040 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
22050 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
22060 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
22070 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
22080 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
22090 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
220a0 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
220b0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
220c0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
220d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
220e0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
220f0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
22100 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
22110 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
22120 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
22130 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
22140 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
22150 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
22160 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
22170 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
22180 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  age, MemPage *pP
22190 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  arent){.  int rc
221a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
221b0 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  w;.  Pgno pgnoNe
221c0 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  w;.  u8 *pCell;.
221d0 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20 20    int szCell;.  
221e0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
221f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22200 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
22210 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70  nt parentIdx = p
22220 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20  Parent->nCell;  
22230 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20   /* pParent new 
22240 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64  divider cell ind
22250 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ex */.  int pare
22260 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
22270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
22280 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72  e of new divider
22290 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61   cell */.  u8 pa
222a0 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20  rentCell[64];   
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
222c0 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  Space for the ne
222d0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
222e0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
222f0 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73   a new page. Ins
22300 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ert the overflow
22310 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
22320 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54  .  ** into it. T
22330 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f  hen remove the o
22340 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
22350 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  m pPage..  */.  
22360 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67  rc = allocatePag
22370 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
22380 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  gnoNew, 0, 0);. 
22390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
223a0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
223b0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c   rc;.  }.  pCell
223c0 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b   = pPage->aOvfl[
223d0 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65  0].pCell;.  szCe
223e0 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
223f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
22400 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
22410 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
22420 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67  );.  assemblePag
22430 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
22440 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70  l, &szCell);.  p
22450 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
22460 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  = 0;..  /* Set t
22470 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65  he parent of the
22480 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
22490 20 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74   page to pParent
224a0 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61  . */.  pNew->pPa
224b0 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a  rent = pParent;.
224c0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
224d0 65 66 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  ef(pParent->aDat
224e0 61 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20  a);..  /* pPage 
224f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
22500 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
22510 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20  pParent. Change 
22520 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61  this.  ** so tha
22530 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
22540 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67  d is the new pag
22550 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76  e allocated abov
22560 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65  e and.  ** pPage
22570 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
22580 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
22590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
225a0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
225b0 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
225c0 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
225d0 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
225e0 6c 2d 31 29 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l-1), &info);.  
225f0 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
22600 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
22610 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
22620 79 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  y, 0, 0, &parent
22630 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
22640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
22660 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e  .  assert( paren
22670 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63  tSize<64 );.  rc
22680 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
22690 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
226a0 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
226b0 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
226c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
226d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
226e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74  rn rc;.  }.  put
226f0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
22700 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
22710 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
22720 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62  ->pgno);.  put4b
22730 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
22740 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
22750 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
22760 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ew);..#ifndef SQ
22770 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22780 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69  CUUM.  /* If thi
22790 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
227a0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
227b0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
227c0 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65   map.  ** with e
227d0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
227e0 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
227f0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
22800 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  e .  ** cell on 
22810 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
22820 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
22830 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
22840 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
22850 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
22860 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
22870 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
22880 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  nt->pgno);.    i
22890 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
228a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
228b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
228c0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
228d0 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20  l(pNew, 0);.    
228e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
228f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
22900 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
22910 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c  #endif..  /* Rel
22920 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
22930 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
22940 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74  ge and balance t
22950 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a  he parent page,.
22960 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
22970 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
22980 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74  serted caused it
22990 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
229a0 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ull..  */.  rele
229b0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
229c0 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28   return balance(
229d0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23  pParent, 0);.}.#
229e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
229f0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
22a00 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
22a10 49 53 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  ISAUTOVACUUM mac
22a20 72 6f 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ro is used withi
22a30 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  n balance_nonroo
22a40 74 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  t() to determine
22a50 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
22a60 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
22a70 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e 6f 74 2e  o-vacuum or not.
22a80 20 42 65 63 61 75 73 65 20 69 74 20 69 73 20 75   Because it is u
22a90 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61 6e  sed.** within an
22aa0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
22ab0 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   is an argument 
22ac0 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61 63 72 6f  to another macro
22ad0 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d 61 6c 6c   .** (sqliteMall
22ae0 6f 63 52 61 77 29 2c 20 69 74 20 69 73 20 6e 6f  ocRaw), it is no
22af0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
22b00 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f  e conditional co
22b10 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53 6f  mpilation..** So
22b20 2c 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  , this macro is 
22b30 64 65 66 69 6e 65 64 20 69 6e 73 74 65 61 64 2e  defined instead.
22b40 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22b50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22b60 55 4d 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54  UM.#define ISAUT
22b70 4f 56 41 43 55 55 4d 20 28 70 42 74 2d 3e 61 75  OVACUUM (pBt->au
22b80 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c 73 65 0a  toVacuum).#else.
22b90 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56 41  #define ISAUTOVA
22ba0 43 55 55 4d 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  CUUM 0.#endif../
22bb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22bc0 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
22bd0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61  Cells on pPage a
22be0 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69  nd up to NN*2 si
22bf0 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61  blings.** of pPa
22c00 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  ge so that all p
22c10 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
22c20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
22c30 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a  of free space..*
22c40 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62  * Usually NN sib
22c50 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20  lings on either 
22c60 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73  side of pPage is
22c70 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
22c80 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67  ancing,.** thoug
22c90 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  h more siblings 
22ca0 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
22cb0 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67  one side if pPag
22cc0 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  e is the first.*
22cd0 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  * or last child 
22ce0 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  of its parent.  
22cf0 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77  If pPage has few
22d00 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62  er than 2*NN sib
22d10 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68  lings.** (someth
22d20 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
22d30 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61  ly happen if pPa
22d40 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
22d50 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69  age or a .** chi
22d60 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e  ld of root) then
22d70 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
22d80 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70  iblings particip
22d90 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
22da0 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
22db0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
22dc0 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68  gs of pPage migh
22dd0 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
22de0 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
22df0 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20  ne or.** two in 
22e00 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
22e10 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
22e20 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
22e30 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
22e40 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
22e50 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
22e60 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65  d to be nearly e
22e70 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69  mpty. If pPage i
22e80 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s .** the root p
22e90 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  age, then the de
22ea0 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
22eb0 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
22ec0 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73  ed.** or decreas
22ed0 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65  ed by one, as ne
22ee0 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70  cessary, to keep
22ef0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
22f00 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65  rom being.** ove
22f10 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74  rfull or complet
22f20 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ely empty..**.**
22f30 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
22f40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
22f50 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
22f60 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  the Cells on pPa
22f70 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
22f80 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
22f90 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ed in pPage->aDa
22fa0 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20  ta[].  This can 
22fb0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
22fc0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
22fd0 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20  l.  Part of the 
22fe0 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
22ff0 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b  ine is to.** mak
23000 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73  e sure all Cells
23010 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20   for pPage once 
23020 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61  again fit in pPa
23030 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a  ge->aData[]..**.
23040 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
23050 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
23060 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  e siblings of pP
23070 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  age, the parent 
23080 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  of pPage.** migh
23090 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  t become overful
230a0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
230b0 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   If that happens
230c0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
230d0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
230e0 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
230f0 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  the parent..**.*
23100 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
23110 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
23120 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
23130 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
23140 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
23150 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f  upted state.  So
23160 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
23170 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
23180 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
23190 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
231a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
231b0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d  ance_nonroot(Mem
231c0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
231d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
231e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
231f0 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  The parent of pP
23200 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
23210 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
23220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23230 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
23240 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
23250 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23260 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
23270 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
23280 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
23290 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
232a0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
232b0 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
232c0 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
232d0 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
23300 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
23310 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23330 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
23340 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
23350 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20  .  int nDiv;    
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
23380 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f  ls in apDiv[] */
23390 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
233c0 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70     /* Index of p
233f0 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d  Page in pParent-
23400 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
23410 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
23420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
23430 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
23440 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
23450 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  l[] */.  int rc;
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
23480 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
23490 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t leafCorrection
234a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
234b0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
234c0 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
234d0 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
23500 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
23510 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
23520 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
23530 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
23540 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
23550 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
23560 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
23570 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
23580 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
23590 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
235a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
235b0 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
235c0 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
235d0 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
235e0 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
235f0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20  .  int iSpace = 
23600 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23610 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
23620 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d  byte of aSpace[]
23630 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
23640 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
23650 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
23660 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
23670 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
23680 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  oOld[NB];       
23690 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
236a0 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
236b0 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  ge in apOld[] */
236c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
236d0 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
236e0 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
236f0 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
23700 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
23710 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
23720 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
23730 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
23740 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
23750 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ing */.  Pgno pg
23760 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  noNew[NB+2];    
23770 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
23780 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
23790 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  age in apNew[] *
237a0 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
237b0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
237c0 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
237d0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
237e0 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
237f0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
23800 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
23810 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
23820 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
23830 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23850 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
23860 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
23870 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
23880 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
23890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
238a0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
238b0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
238c0 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
238d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
238e0 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
238f0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
23900 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b   */.  u8 *aCopy[
23910 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
23920 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23930 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20  holding data of 
23940 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38  apCopy[] */.  u8
23950 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20 20   *aSpace;       
23960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
23970 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69  ace to hold copi
23980 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
23990 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ells */.#ifndef 
239a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
239b0 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72  VACUUM.  u8 *aFr
239c0 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  om = 0;.#endif..
239d0 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20    /* .  ** Find 
239e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
239f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23a00 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
23a10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23a20 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
23a30 62 6c 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ble(pPage->aData
23a40 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  ) );.  pBt = pPa
23a50 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65  ge->pBt;.  pPare
23a60 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
23a70 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
23a80 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20  Parent );.  if( 
23a90 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
23aa0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
23ab0 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  ite(pParent->aDa
23ac0 74 61 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ta)) ){.    retu
23ad0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41  rn rc;.  }.  TRA
23ae0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
23af0 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
23b00 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
23b10 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
23b20 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64  ->pgno));..#ifnd
23b30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
23b40 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a  UICKBALANCE.  /*
23b50 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20  .  ** A special 
23b60 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20  case:  If a new 
23b70 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62  entry has just b
23b80 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
23b90 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28  o a.  ** table (
23ba0 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65  that is, a btree
23bb0 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65   with integer ke
23bc0 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20  ys and all data 
23bd0 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20  at the leaves). 
23be0 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20   ** and the new 
23bf0 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67  entry is the rig
23c00 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e  ht-most entry in
23c10 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61   the tree (it ha
23c20 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65  s the.  ** large
23c30 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65  st key) then use
23c40 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c   the special bal
23c50 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75  ance_quick() rou
23c60 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61  tine for.  ** ba
23c70 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63  lancing.  balanc
23c80 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63  e_quick() is muc
23c90 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73  h faster and res
23ca0 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65  ults in a tighte
23cb0 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f  r.  ** packing o
23cc0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f  f data in the co
23cd0 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  mmon case..  */.
23ce0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
23cf0 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  f &&.      pPage
23d00 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20  ->intKey &&.    
23d10 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74    pPage->leafDat
23d20 61 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  a &&.      pPage
23d30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26  ->nOverflow==1 &
23d40 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61  &.      pPage->a
23d50 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
23d60 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20  ge->nCell &&.   
23d70 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
23d80 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20  t->pgno!=1 &&.  
23d90 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
23da0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
23db0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
23dc0 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  8])==pPage->pgno
23dd0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  .  ){.    /*.   
23de0 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   ** TODO: Check 
23df0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20  the siblings to 
23e00 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67  the left of pPag
23e10 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  e. It may be tha
23e20 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72  t.    ** they ar
23e30 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e  e not full and n
23e40 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65  o new page is re
23e50 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
23e60 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63     return balanc
23e70 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70  e_quick(pPage, p
23e80 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  Parent);.  }.#en
23e90 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
23ea0 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
23eb0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
23ec0 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
23ed0 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
23ee0 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
23ef0 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
23f00 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
23f10 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
23f20 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
23f30 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
23f40 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
23f50 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
23f60 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
23f70 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
23f80 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20  idxShift ){.    
23f90 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70  Pgno pgno;.    p
23fa0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
23fb0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
23fc0 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67 65  gno==sqlite3page
23fd0 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70 50 61  r_pagenumber(pPa
23fe0 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20  ge->aData) );.  
23ff0 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
24000 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
24010 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
24020 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
24030 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
24040 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
24050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24060 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
24070 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
24080 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
24090 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
240a0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
240b0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
240c0 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
240d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
240e0 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
240f0 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
24100 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
24110 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
24120 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
24130 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
24140 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
24150 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
24160 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
24170 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
24180 30 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  0;.  sqlite3page
24190 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61  r_ref(pParent->a
241a0 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Data);..  /*.  *
241b0 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
241c0 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
241d0 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
241e0 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
241f0 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
24200 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
24210 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
24220 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
24230 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
24240 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
24250 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
24260 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
24270 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
24280 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
24290 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
242a0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
242b0 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
242c0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
242d0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
242e0 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
242f0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
24300 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
24310 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
24320 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
24330 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
24340 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
24350 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
24360 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
24370 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
24380 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
24390 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
243a0 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
243b0 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
243c0 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
243d0 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
243e0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61  nCell ){.      a
243f0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
24400 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a  ll(pParent, k);.
24410 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20        nDiv++;.  
24420 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
24430 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  rent->leaf );.  
24440 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
24450 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
24460 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
24470 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  f( k==pParent->n
24480 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67  Cell ){.      pg
24490 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
244a0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
244b0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
244c0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
244d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
244e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
244f0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
24500 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69  e(pBt, pgnoOld[i
24510 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50  ], &apOld[i], pP
24520 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  arent);.    if( 
24530 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
24540 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61  e_cleanup;.    a
24550 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65  pOld[i]->idxPare
24560 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f  nt = k;.    apCo
24570 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
24580 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
24590 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
245a0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
245b0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
245c0 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
245d0 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
245e0 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
245f0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 20 69   multiple of 2 i
24600 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
24610 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
24620 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
24630 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
24640 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b 0a 0a  Cells + 1)&~1;..
24650 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
24660 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
24670 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
24680 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
24690 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
246a0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
246b0 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
246e0 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
246f0 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e 74  Cells*sizeof(int
24700 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
24710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
24720 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
24730 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
24740 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20 20 20  mPage))*NB      
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
24770 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
24780 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20 20 20  *(5+NB)         
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a     /* aSpace */.
247b0 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
247c0 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
247d0 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20 20   : 0)           
247e0 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20         /* aFrom 
247f0 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61 70  */.  );.  if( ap
24800 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
24810 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
24820 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
24830 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
24840 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
24850 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
24860 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
24870 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
24880 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
24890 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20  ert( ((aCopy[0] 
248a0 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
248b0 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
248c0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
248d0 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28  quired */.  for(
248e0 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b  i=1; i<NB; i++){
248f0 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20  .    aCopy[i] = 
24900 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d  &aCopy[i-1][pBt-
24910 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
24920 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
24930 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  )];.    assert( 
24940 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38  ((aCopy[i] - (u8
24950 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
24960 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
24970 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
24980 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
24990 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d  e = &aCopy[NB-1]
249a0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
249b0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
249c0 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72  Page))];.  asser
249d0 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28 75  t( ((aSpace - (u
249e0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
249f0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
24a00 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
24a10 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ed */.#ifndef SQ
24a20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
24a30 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
24a40 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
24a50 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63    aFrom = &aSpac
24a60 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a  e[5*pBt->pageSiz
24a70 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e];.  }.#endif. 
24a80 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
24a90 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
24aa0 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
24ab0 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
24ac0 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
24ad0 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
24ae0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
24af0 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
24b00 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
24b10 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
24b20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
24b30 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
24b40 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
24b50 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
24b60 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
24b70 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
24b80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
24b90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
24ba0 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
24bb0 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
24bc0 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70 61  aCopy[i][pBt->pa
24bd0 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e  geSize];.    p->
24be0 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
24bf0 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
24c00 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
24c10 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
24c20 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
24c30 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28  geSize + sizeof(
24c40 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 2f  MemPage));.    /
24c50 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 61  * The memcpy() a
24c60 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74 68 65  bove changes the
24c70 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44 61   value of p->aDa
24c80 74 61 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ta so we have to
24c90 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74 20 61  .    ** set it a
24ca0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  gain. */.    p->
24cb0 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
24cc0 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
24cd0 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  ];.  }..  /*.  *
24ce0 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
24cf0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
24d00 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
24d10 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
24d20 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
24d30 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
24d40 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
24d50 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
24d60 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
24d70 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
24d80 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d  ed form aSpace[]
24d90 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
24da0 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
24db0 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
24dc0 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
24dd0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
24de0 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
24df0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
24e00 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
24e10 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
24e20 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
24e30 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
24e40 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
24e50 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
24e60 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74   aSpace[].  In t
24e70 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
24e80 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
24e90 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
24ea0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
24eb0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
24ec0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
24ed0 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
24ee0 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
24ef0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
24f00 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
24f10 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
24f20 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
24f30 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
24f40 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
24f50 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
24f60 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
24f70 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
24f80 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
24f90 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
24fa0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
24fb0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
24fc0 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
24fd0 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
24fe0 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
24ff0 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
25000 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
25010 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
25020 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b   && pPage->leaf;
25030 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
25040 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
25050 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
25060 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
25070 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
25080 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
25090 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
250a0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
250b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
250c0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
250d0 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
250e0 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
250f0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
25100 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
25110 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
25120 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
25130 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e  ll[nCell]);.#ifn
25140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25150 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
25160 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25170 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
25180 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
25190 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b  From[nCell] = i;
251a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
251b0 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
251c0 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
251d0 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
251e0 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
251f0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
25200 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
25210 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
25220 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
25230 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
25240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25250 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
25260 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
25270 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
25280 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
25290 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
252a0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
252b0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
252c0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
252d0 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
252e0 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
252f0 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
25300 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
25310 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
25320 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
25330 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
25340 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
25350 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
25360 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
25370 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
25380 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
25390 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
253a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
253b0 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
253c0 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
253d0 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
253e0 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
253f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
25400 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
25410 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
25420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25430 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
25440 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
25450 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
25460 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
25470 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
25480 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
25490 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
254a0 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
254b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
254c0 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
254d0 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
254e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
254f0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
25500 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
25510 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
25520 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
25530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25540 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25550 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
25560 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25570 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
25580 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
25590 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
255a0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
255b0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
255c0 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
255d0 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
255e0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
255f0 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
25600 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
25610 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
25620 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
25630 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
25640 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
25650 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
25660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
25670 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
25680 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
25690 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
256a0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
256b0 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
256c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
256d0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
256e0 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
256f0 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
25700 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
25710 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
25720 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
25730 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
25740 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
25750 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43      }.        nC
25760 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ell++;.      }. 
25770 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
25780 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   ** Figure out t
25790 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
257a0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  es needed to hol
257b0 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c  d all nCell cell
257c0 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68  s..  ** Store th
257d0 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22  is number in "k"
257e0 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20  .  Also compute 
257f0 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  szNew[] which is
25800 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20   the total.  ** 
25810 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
25820 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61  s on the i-th pa
25830 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20  ge and cntNew[] 
25840 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64  which is the ind
25850 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c  ex.  ** in apCel
25860 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  l[] of the cell 
25870 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67  that divides pag
25880 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b  e i from page i+
25890 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77  1.  .  ** cntNew
258a0 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c  [k] should equal
258b0 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a   nCell..  **.  *
258c0 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65  * Values compute
258d0 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a  d by this block:
258e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
258f0 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61       k: The tota
25900 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  l number of sibl
25910 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20  ing pages.  **  
25920 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63    szNew[i]: Spac
25930 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69  ed used on the i
25940 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
25950 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b  ..  **   cntNew[
25960 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43  i]: Index in apC
25970 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
25980 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  [] for the first
25990 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20   cell to.  **   
259a0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
259b0 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68  ight of the i-th
259c0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
259d0 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a   ** usableSpace:
259e0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
259f0 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61   of space availa
25a00 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c  ble on each sibl
25a10 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a  ing..  ** .  */.
25a20 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20    usableSpace = 
25a30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
25a40 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65  - 12 + leafCorre
25a50 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62  ction;.  for(sub
25a60 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e  total=k=i=0; i<n
25a70 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
25a80 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65  assert( i<nMaxCe
25a90 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f  lls );.    subto
25aa0 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d  tal += szCell[i]
25ab0 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75   + 2;.    if( su
25ac0 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53  btotal > usableS
25ad0 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a  pace ){.      sz
25ae0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
25af0 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
25b00 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
25b10 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   i;.      if( le
25b20 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d  afData ){ i--; }
25b30 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20  .      subtotal 
25b40 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a  = 0;.      k++;.
25b50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
25b60 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
25b70 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
25b80 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
25b90 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
25ba0 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
25bb0 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
25bc0 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
25bd0 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
25be0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
25bf0 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
25c00 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
25c10 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
25c20 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
25c30 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
25c40 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
25c50 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
25c60 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
25c70 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
25c80 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
25c90 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
25ca0 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
25cb0 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
25cc0 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
25cd0 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
25ce0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
25cf0 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
25d00 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
25d10 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
25d20 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
25d30 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
25d40 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
25d50 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
25d60 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
25d70 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
25d80 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
25d90 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
25da0 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
25db0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
25dc0 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
25dd0 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
25de0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
25df0 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
25e00 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
25e10 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
25e20 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
25e30 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
25e40 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
25e50 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
25e60 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
25e70 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
25e80 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
25e90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25ea0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
25eb0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
25ec0 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
25ed0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
25ee0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
25ef0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
25f00 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
25f10 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
25f20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
25f30 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
25f40 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
25f50 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
25f60 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
25f70 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
25f80 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
25f90 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
25fa0 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
25fb0 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
25fc0 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
25fd0 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
25fe0 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
25ff0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
26000 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
26010 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
26020 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
26030 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
26040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
26050 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
26060 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
26070 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77  tnew[0])>0) or w
26080 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61  e are the.  ** a
26090 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
260a0 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
260b0 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
260c0 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
260d0 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
260e0 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
260f0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
26100 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
26110 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
26120 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
26130 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
26140 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
26150 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41   );..  /*.  ** A
26160 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
26170 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
26180 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
26190 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ible..  */.  ass
261a0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
261b0 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67  >1 );.  pageFlag
261c0 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  s = pPage->aData
261d0 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
261e0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
261f0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
26200 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
26210 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
26220 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
26230 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
26240 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b  i] = pgnoOld[i];
26250 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
26260 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
26270 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
26280 74 65 28 70 4e 65 77 2d 3e 61 44 61 74 61 29 3b  te(pNew->aData);
26290 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
262a0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
262b0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
262c0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
262d0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70  catePage(pBt, &p
262e0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
262f0 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
26300 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
26310 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
26320 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
26330 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
26340 20 20 20 20 7d 0a 20 20 20 20 6e 4e 65 77 2b 2b      }.    nNew++
26350 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
26360 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
26370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
26380 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
26390 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
263a0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
263b0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
263c0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
263d0 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
263e0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
263f0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
26400 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
26410 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
26420 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
26430 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
26440 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
26450 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
26460 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
26470 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
26480 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
26490 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
264a0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
264b0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
264c0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
264d0 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
264e0 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
264f0 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
26500 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
26510 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
26520 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
26530 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
26540 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
26550 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
26560 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
26570 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
26580 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
26590 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
265a0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
265b0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
265c0 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
265d0 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
265e0 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
265f0 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
26600 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
26610 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
26620 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
26630 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
26640 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
26650 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
26660 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
26670 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
26680 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f   int minV = pgno
26690 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  New[i];.    int 
266a0 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
266b0 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
266c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67  +){.      if( pg
266d0 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e  noNew[j]<(unsign
266e0 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
266f0 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
26700 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f       minV = pgno
26710 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  New[j];.      }.
26720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
26730 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
26740 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
26750 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
26760 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
26770 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
26780 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
26790 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69  [i] = pgnoNew[mi
267a0 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
267b0 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
267c0 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
267d0 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20  [minI] = t;.    
267e0 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
267f0 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
26800 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
26810 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
26820 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
26830 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
26840 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
26850 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20  pgnoOld[0], .   
26860 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f   nOld>=2 ? pgnoO
26870 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ld[1] : 0,.    n
26880 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=3 ? pgnoOld
26890 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e  [2] : 0,.    pgn
268a0 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30  oNew[0], szNew[0
268b0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
268c0 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c   pgnoNew[1] : 0,
268d0 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
268e0 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
268f0 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32  w>=3 ? pgnoNew[2
26900 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  ] : 0, nNew>=3 ?
26910 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
26920 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e     nNew>=4 ? pgn
26930 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[3] : 0, nNe
26940 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
26950 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
26960 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20   ? pgnoNew[4] : 
26970 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
26980 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
26990 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
269a0 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
269b0 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
269c0 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
269d0 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
269e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
269f0 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
26a00 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
26a10 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
26a20 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
26a30 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
26a40 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
26a50 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
26a60 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
26a70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
26a80 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
26a90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26aa0 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e  New->pgno==pgnoN
26ab0 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73  ew[i] );.    ass
26ac0 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
26ad0 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
26ae0 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
26af0 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
26b00 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
26b10 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
26b20 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
26b30 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
26b40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
26b50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
26b60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26b70 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  M.    /* If this
26b80 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
26b90 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
26ba0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
26bb0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
26bc0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
26bd0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68   the siblings th
26be0 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67  at were rearrang
26bf0 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65  ed. These can be
26c00 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68  : left.    ** ch
26c10 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c  ildren of cells,
26c20 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
26c30 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72   of the page, or
26c40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
26c50 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74      ** pointed t
26c60 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20  o by cells..    
26c70 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
26c80 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26c90 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63      for(k=j; k<c
26ca0 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a  ntNew[i]; k++){.
26cb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26cc0 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  k<nMaxCells );. 
26cd0 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d         if( aFrom
26ce0 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [k]==0xFF || apC
26cf0 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70  opy[aFrom[k]]->p
26d00 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
26d10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
26d20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
26d30 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20  pNew, k-j);.    
26d40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26d60 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
26d70 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
26d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26d90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
26da0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d  .#endif..    j =
26db0 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
26dc0 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
26dd0 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
26de0 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
26df0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
26e00 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
26e10 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
26e20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
26e30 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
26e40 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77  /.    if( i<nNew
26e50 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b  -1 && j<nCell ){
26e60 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
26e70 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
26e80 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
26e90 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
26ea0 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
26eb0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
26ec0 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
26ed0 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
26ee0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
26ef0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
26f00 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
26f10 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
26f20 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
26f30 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
26f40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26f50 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
26f60 7b 0a 09 2f 2a 20 49 66 20 74 68 65 20 74 72 65  {../* If the tre
26f70 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
26f80 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
26f90 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
26fa0 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
26fb0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
26fc0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
26fd0 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
26fe0 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
26ff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
27000 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
27010 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
27020 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
27030 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
27040 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
27050 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
27060 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
27070 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
27080 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
27090 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
270a0 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
270b0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
270c0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
270d0 70 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b  pCell = &aSpace[
270e0 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20  iSpace];.       
270f0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
27100 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69  ent, pCell, 0, i
27110 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
27120 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 53  &sz);.        iS
27130 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
27140 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
27150 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
27160 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 70  e*5 );.        p
27170 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
27180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
27190 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
271a0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
271b0 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
271c0 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
271d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
271e0 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
271f0 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
27200 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
27210 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
27220 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c  nt, nxDiv, pCell
27230 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b  , sz, pTemp, 4);
27240 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27250 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27260 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27270 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
27280 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
27290 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c  (pParent,nxDiv),
272a0 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69   pNew->pgno);.#i
272b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
272c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
272d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
272e0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
272f0 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f  database, and no
27300 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  t a leaf-data tr
27310 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ee,.      ** the
27320 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  n update the poi
27330 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e  nter map with an
27340 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
27350 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
27360 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63     ** that the c
27370 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65  ell just inserte
27380 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20  d points to (if 
27390 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
273a0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
273b0 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61  toVacuum && !lea
273c0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
273d0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
273e0 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  vfl(pParent, nxD
273f0 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
27400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27410 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
27420 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
27430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27440 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
27450 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69   j++;.      nxDi
27460 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  v++;.    }.  }. 
27470 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c   assert( j==nCel
27480 6c 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  l );.  if( (page
27490 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
274a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
274b0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
274c0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70  ]->aData[8], &ap
274d0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
274e0 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a  ata[8], 4);.  }.
274f0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
27500 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
27510 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
27520 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
27530 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
27540 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
27550 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
27560 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
27570 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
27580 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
27590 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
275a0 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
275b0 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
275c0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
275d0 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
275e0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
275f0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
27600 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
27610 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
27620 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
27630 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
27640 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
27650 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
27660 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
27670 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20  *.  ** Reparent 
27680 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20  children of all 
27690 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cells..  */.  fo
276a0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
276b0 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  ++){.    rc = re
276c0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
276d0 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  (apNew[i]);.    
276e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
276f0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
27700 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
27710 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
27720 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29  ldPages(pParent)
27730 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27740 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
27750 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20  ance_cleanup;.. 
27760 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
27770 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
27780 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
27790 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
277a0 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
277b0 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
277c0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
277d0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
277e0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
277f0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
27800 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
27810 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
27820 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
27830 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
27840 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
27850 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65  /* assert( pPage
27860 2d 3e 69 73 49 6e 69 74 20 29 3b 20 2f 2f 20 4e  ->isInit ); // N
27870 6f 21 20 70 50 61 67 65 20 6d 69 67 68 74 20 68  o! pPage might h
27880 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74  ave been added t
27890 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  o freelist */.  
278a0 2f 2a 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  /* pageIntegrity
278b0 28 70 50 61 67 65 29 3b 20 20 20 20 2f 2f 20 4e  (pPage);    // N
278c0 6f 21 20 70 50 61 67 65 20 6d 69 67 68 74 20 68  o! pPage might h
278d0 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74  ave been added t
278e0 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f 20 0a 20  o freelist */ . 
278f0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
27900 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20  arent, 0);.  .  
27910 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
27920 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
27930 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
27940 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
27950 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
27960 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
27970 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
27980 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
27990 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
279a0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
279b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
279c0 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pNew[i]);.  }.  
279d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
279e0 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ent);.  TRACE(("
279f0 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
27a00 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25  d with %d: old=%
27a10 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
27a20 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
27a30 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c  pPage->pgno, nOl
27a40 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
27a50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27a60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
27a70 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
27a80 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
27a90 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
27aa0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
27ab0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
27ac0 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e  lls.  This is an
27ad0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
27ae0 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a  make the tree.**
27af0 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e   shallower by on
27b00 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  e level..*/.stat
27b10 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73  ic int balance_s
27b20 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65  hallower(MemPage
27b30 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
27b40 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
27b50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27b60 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20  only child page 
27b70 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67  of pPage */.  Pg
27b80 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
27b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
27ba0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43  ge number for pC
27bb0 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  hild */.  int rc
27bc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
27bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27be0 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72   code from subpr
27bf0 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74  ocedures */.  Bt
27c00 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27c20 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20   The main BTree 
27c30 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
27c40 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  nt mxCellPerPage
27c50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
27c60 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
27c70 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20   cells per page 
27c80 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
27c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ca0 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66    /* All cells f
27cb0 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20  rom pages being 
27cc0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
27cd0 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  t *szCell;      
27ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
27cf0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
27d00 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65  cells */..  asse
27d10 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
27d20 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
27d30 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
27d40 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  =0 );.  pBt = pP
27d50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65  age->pBt;.  mxCe
27d60 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43  llPerPage = MX_C
27d70 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65  ELL(pBt);.  apCe
27d80 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
27d90 63 52 61 77 28 20 6d 78 43 65 6c 6c 50 65 72 50  cRaw( mxCellPerP
27da0 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29  age*(sizeof(u8*)
27db0 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20 29 3b  +sizeof(int)) );
27dc0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
27dd0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27de0 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c  _NOMEM;.  szCell
27df0 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c   = (int*)&apCell
27e00 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b  [mxCellPerPage];
27e10 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
27e20 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  af ){.    /* The
27e30 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
27e40 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20  tely empty */.  
27e50 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
27e60 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25  E: empty table %
27e70 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
27e80 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o));.  }else{.  
27e90 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
27ea0 67 65 20 69 73 20 65 6d 70 74 79 20 62 75 74 20  ge is empty but 
27eb0 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20  has one child.  
27ec0 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20  Transfer the.   
27ed0 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
27ee0 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68  from that one ch
27ef0 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f  ild into the roo
27f00 74 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20  t page if it .  
27f10 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20    ** will fit.  
27f20 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  This reduces the
27f30 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
27f40 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ee by one..    *
27f50 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
27f60 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61 67  root page is pag
27f70 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73  e 1, it has less
27f80 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
27f90 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73   than.    ** its
27fa0 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74   child (due to t
27fb0 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64  he 100 byte head
27fc0 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  er that occurs a
27fd0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
27fe0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61      ** of the da
27ff0 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20  tabase fle), so 
28000 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  it might not be 
28010 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  able to hold all
28020 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
28030 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72  information curr
28040 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ently contained 
28050 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49  in the child.  I
28060 66 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20  f this is the . 
28070 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e     ** case, then
28080 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74   do not do the t
28090 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20  ransfer.  Leave 
280a0 70 61 67 65 20 31 20 65 6d 70 74 79 20 65 78 63  page 1 empty exc
280b0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ept.    ** for t
280c0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
280d0 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61   to the child pa
280e0 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70  ge.  The child p
280f0 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20  age becomes.    
28100 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  ** the virtual r
28110 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
28120 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f  .    */.    pgno
28130 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
28140 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
28150 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28160 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
28170 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a   pgnoChild>0 );.
28180 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
28190 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33 70 61  Child<=sqlite3pa
281a0 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
281b0 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  age->pBt->pPager
281c0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ) );.    rc = ge
281d0 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74  tPage(pPage->pBt
281e0 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43  , pgnoChild, &pC
281f0 68 69 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72  hild);.    if( r
28200 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
28210 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
28220 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
28230 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
28240 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68 69   = initPage(pChi
28250 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20  ld, pPage);.    
28260 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28270 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
28280 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
28290 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
282a0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
282b0 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
282c0 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
282d0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
282e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
282f0 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
28300 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
28310 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
28320 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
28330 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
28340 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
28350 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
28360 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
28370 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
28380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
28390 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
283a0 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
283b0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
283c0 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
283d0 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
283e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
283f0 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
28400 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
28410 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
28420 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
28430 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
28440 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
28450 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
28460 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
28470 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28480 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
28490 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
284a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65   .            ge
284b0 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e  t4byte(&pChild->
284c0 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64  aData[pChild->hd
284d0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
284e0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
284f0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
28500 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28510 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
28520 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
28530 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
28540 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28550 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
28560 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
28570 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
28580 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
28590 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
285a0 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
285b0 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
285c0 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
285d0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
285e0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
285f0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
28600 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
28610 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
28620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28630 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
28640 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
28650 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
28660 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
28670 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
28680 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  it = 0;.      pP
28690 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
286a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 69  ;.      rc = ini
286b0 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
286c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
286d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
286e0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
286f0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52  Child);.      TR
28700 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74  ACE(("BALANCE: t
28710 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64  ransfer child %d
28720 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22   into root %d\n"
28730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28740 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50  pChild->pgno, pP
28750 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
28760 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61   }.    rc = repa
28770 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
28780 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Page);.    asser
28790 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
287a0 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  low==0 );.#ifnde
287b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
287c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
287d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
287e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
287f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
28800 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
28810 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72  i++){ .        r
28820 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
28830 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
28840 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28860 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61      goto end_sha
28870 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
28880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28890 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
288a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
288b0 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  OK ) goto end_sh
288c0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
288d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
288e0 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f  Child);.  }.end_
288f0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a  shallow_balance:
28900 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70  .  sqliteFree(ap
28910 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
28920 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
28930 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
28940 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68  verfull.**.** Wh
28950 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  en this happens,
28960 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   Create a new ch
28970 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70  ild page and cop
28980 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  y the.** content
28990 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
289a0 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
289b0 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
289c0 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70  t.** page an emp
289d0 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67  ty page with rig
289e0 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67  htChild pointing
289f0 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63   to the new.** c
28a00 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c  hild.   Finally,
28a10 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e   call balance_in
28a20 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20  ternal() on the 
28a30 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20  new child.** to 
28a40 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69  cause it to spli
28a50 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
28a60 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
28a70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
28a80 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
28a90 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28aa0 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
28ab0 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
28ac0 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
28ad0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
28ae0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
28af0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
28b00 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61  Child;     /* Pa
28b10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
28b20 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
28b30 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
28b40 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
28b50 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
28b60 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
28b70 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
28b80 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
28b90 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
28ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
28bb0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
28bc0 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
28bd0 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
28be0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
28bf0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
28c00 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
28c10 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
28c20 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
28c30 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
28c40 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
28c50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
28c60 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
28c70 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
28c80 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
28c90 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
28ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28cb0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
28cc0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
28cd0 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d 20 61 6c  ->pBt;.  rc = al
28ce0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
28cf0 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68  &pChild, &pgnoCh
28d00 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ild, pPage->pgno
28d10 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
28d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
28d30 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
28d40 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
28d50 43 68 69 6c 64 2d 3e 61 44 61 74 61 29 20 29 3b  Child->aData) );
28d60 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
28d70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
28d80 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
28d90 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
28da0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
28db0 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
28dc0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
28dd0 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69  ;.  cdata = pChi
28de0 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d  ld->aData;.  mem
28df0 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61  cpy(cdata, &data
28e00 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65  [hdr], pPage->ce
28e10 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
28e20 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20  ->nCell-hdr);.  
28e30 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72  memcpy(&cdata[br
28e40 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
28e50 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b  usableSize-brk);
28e60 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
28e70 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  d->isInit==0 );.
28e80 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28    rc = initPage(
28e90 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
28ea0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28eb0 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
28ec0 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  t;.  memcpy(pChi
28ed0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
28ee0 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
28ef0 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
28f00 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
28f10 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
28f20 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
28f30 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66  >nOverflow;.  if
28f40 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
28f50 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c  low ){.    pChil
28f60 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  d->nFree = 0;.  
28f70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  }.  assert( pChi
28f80 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65  ld->nCell==pPage
28f90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72  ->nCell );.  zer
28fa0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
28fb0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
28fc0 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
28fd0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
28fe0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
28ff0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
29000 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ild);.  TRACE(("
29010 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
29020 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
29030 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
29040 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23  Child->pgno));.#
29050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29060 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
29070 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
29080 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uum ){.    int i
29090 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
290a0 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64  pPut(pBt, pChild
290b0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
290c0 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e  TREE, pPage->pgn
290d0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
290e0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
290f0 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72  per_out;.    for
29100 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
29110 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
29120 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29130 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29  tOvfl(pChild, i)
29140 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29160 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29180 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
29190 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
291a0 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63  pChild);..balanc
291b0 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72  edeeper_out:.  r
291c0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
291d0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
291e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65  .}../*.** Decide
291f0 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61   if the page pPa
29200 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ge needs to be b
29210 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c  alanced.  If bal
29220 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71  ancing is.** req
29230 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20  uired, call the 
29240 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
29250 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a  ncing routine..*
29260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
29270 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  ance(MemPage *pP
29280 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29  age, int insert)
29290 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
292a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
292b0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
292c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
292d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
292e0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
292f0 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
29300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29320 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
29330 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
29340 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
29350 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
29360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
29370 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29380 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
29390 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67  (!insert && pPag
293a0 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
293b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
293c0 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
293d0 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
293e0 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ot(pPage);.    }
293f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
29410 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61  routine checks a
29420 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ll cursors that 
29430 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70  point to table p
29440 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61  gnoRoot..** If a
29450 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73  ny of those curs
29460 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 70  ors other than p
29470 45 78 63 6c 75 64 65 20 77 65 72 65 20 6f 70 65  Exclude were ope
29480 6e 65 64 20 77 69 74 68 20 0a 2a 2a 20 77 72 46  ned with .** wrF
29490 6c 61 67 3d 3d 30 20 74 68 65 6e 20 74 68 69 73  lag==0 then this
294a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
294b0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 20   SQLITE_LOCKED. 
294c0 20 49 66 20 61 6c 6c 0a 2a 2a 20 63 75 72 73 6f   If all.** curso
294d0 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
294e0 20 70 67 6e 6f 52 6f 6f 74 20 77 65 72 65 20 6f   pgnoRoot were o
294f0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
29500 67 3d 3d 31 0a 2a 2a 20 74 68 65 6e 20 74 68 69  g==1.** then thi
29510 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
29520 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
29530 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  ** In addition t
29540 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72  o checking for r
29550 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65  ead-locks (where
29560 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a   a read-lock .**
29570 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f 72 20   means a cursor 
29580 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
29590 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f 75 74  ag==0) this rout
295a0 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a  ine also moves.*
295b0 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 74  * all cursors ot
295c0 68 65 72 20 74 68 61 6e 20 70 45 78 63 6c 75 64  her than pExclud
295d0 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  e so that they a
295e0 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  re pointing to t
295f0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c  he .** first Cel
29600 6c 20 6f 6e 20 72 6f 6f 74 20 70 61 67 65 2e 20  l on root page. 
29610 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
29620 72 79 20 62 65 63 61 75 73 65 20 61 6e 20 69 6e  ry because an in
29630 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65  sert .** or dele
29640 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  te might change 
29650 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  the number of ce
29660 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20 6f 72  lls on a page or
29670 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67   delete.** a pag
29680 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64 20 77  e entirely and w
29690 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
296a0 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72 73 6f   leave any curso
296b0 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  rs .** pointing 
296c0 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20  to non-existant 
296d0 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a  pages or cells..
296e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
296f0 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 53  eckReadLocks(BtS
29700 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
29710 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72   pgnoRoot, BtCur
29720 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a  sor *pExclude){.
29730 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
29740 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
29750 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
29760 78 74 29 7b 0a 20 20 20 20 75 33 32 20 66 6c 61  xt){.    u32 fla
29770 67 73 20 3d 20 28 70 2d 3e 70 42 74 72 65 65 2d  gs = (p->pBtree-
29780 3e 70 53 71 6c 69 74 65 20 3f 20 70 2d 3e 70 42  >pSqlite ? p->pB
29790 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 66  tree->pSqlite->f
297a0 6c 61 67 73 20 3a 20 30 29 3b 0a 20 20 20 20 69  lags : 0);.    i
297b0 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d  f( p->pgnoRoot!=
297c0 70 67 6e 6f 52 6f 6f 74 20 7c 7c 20 70 3d 3d 70  pgnoRoot || p==p
297d0 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e  Exclude ) contin
297e0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77  ue;.    if( p->w
297f0 72 46 6c 61 67 3d 3d 30 20 26 26 20 66 6c 61 67  rFlag==0 && flag
29800 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
29810 6f 6d 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69  ommitted ) conti
29820 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
29830 77 72 46 6c 61 67 3d 3d 30 20 29 20 72 65 74 75  wrFlag==0 ) retu
29840 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
29850 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 61  ;.    if( p->pPa
29860 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e  ge->pgno!=p->pgn
29870 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d  oRoot ){.      m
29880 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20  oveToRoot(p);.  
29890 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
298a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
298b0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
298c0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
298d0 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
298e0 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
298f0 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
29900 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
29910 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
29920 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
29930 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
29940 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
29950 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
29960 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
29970 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
29980 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
29990 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
299a0 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
299b0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
299c0 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
299d0 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
299e0 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
299f0 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
29a00 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
29a10 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
29a20 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
29a30 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
29a40 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
29a50 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
29a60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
29a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29a80 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
29a90 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
29aa0 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
29ab0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
29ac0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
29ad0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
29ae0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
29af0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
29b00 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
29b10 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f     /* The data o
29b20 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
29b30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
29b40 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
29b50 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61  t szNew;.  MemPa
29b60 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 53  ge *pPage;.  BtS
29b70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
29b80 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a  r->pBtree->pBt;.
29b90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
29ba0 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
29bb0 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
29bc0 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ll = 0;..  if( p
29bd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
29be0 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n!=TRANS_WRITE )
29bf0 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
29c00 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
29c10 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
29c20 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  n insert */.    
29c30 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
29c40 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
29c50 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
29c60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
29c70 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
29c80 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43  nly );.  if( !pC
29c90 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  ur->wrFlag ){.  
29ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29cb0 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f  PERM;   /* Curso
29cc0 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77  r not open for w
29cd0 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
29ce0 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
29cf0 6b 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ks(pBt, pCur->pg
29d00 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b  noRoot, pCur) ){
29d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29d20 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
29d30 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
29d40 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
29d50 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20  d lock */.  }.. 
29d60 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
29d70 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
29d80 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
29d90 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a   on this table *
29da0 2f 0a 20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  /.  restoreOrCle
29db0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
29dc0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 69 66 28  (pCur, 0);.  if(
29dd0 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21   .    SQLITE_OK!
29de0 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
29df0 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
29e00 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
29e10 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f  ) ||.    SQLITE_
29e20 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
29e30 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75  3BtreeMoveto(pCu
29e40 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 26  r, pKey, nKey, &
29e50 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  loc)).  ){.    r
29e60 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
29e70 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
29e80 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
29e90 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
29ea0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
29eb0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
29ec0 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61  f || !pPage->lea
29ed0 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45  fData );.  TRACE
29ee0 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
29ef0 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
29f00 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
29f10 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
29f20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
29f30 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
29f40 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
29f50 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
29f60 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
29f70 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
29f80 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
29f90 74 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  t );.  rc = sqli
29fa0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
29fb0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
29fc0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
29fd0 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  rc;.  newCell = 
29fe0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
29ff0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2a000 74 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 43  t) );.  if( newC
2a010 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
2a020 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a030 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
2a040 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20  pPage, newCell, 
2a050 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74  pKey, nKey, pDat
2a060 61 2c 20 6e 44 61 74 61 2c 20 26 73 7a 4e 65 77  a, nData, &szNew
2a070 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2a080 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2a090 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
2a0a0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2a0b0 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
2a0c0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
2a0d0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2a0e0 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ) );.  if( loc==
2a0f0 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49  0 && CURSOR_VALI
2a100 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2a110 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f 6c 64  ){.    int szOld
2a120 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2a130 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
2a140 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
2a150 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c 64 43  Cell );.    oldC
2a160 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2a170 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2a180 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
2a190 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2a1a0 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
2a1b0 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
2a1c0 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
2a1d0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2a1e0 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
2a1f0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2a200 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2a210 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a220 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2a230 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2a240 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f  , pCur->idx, szO
2a250 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ld);.  }else if(
2a260 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
2a270 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2a280 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
2a290 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  eaf );.    pCur-
2a2a0 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72  >idx++;.    pCur
2a2b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2a2c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2a2d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2a2e0 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
2a2f0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2a300 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65  e, pCur->idx, ne
2a310 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
2a320 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
2a330 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2a340 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63  end_insert;.  rc
2a350 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2a360 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74  , 1);.  /* sqlit
2a370 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28  e3BtreePageDump(
2a380 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d  pCur->pBt, pCur-
2a390 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a  >pgnoRoot, 1); *
2a3a0 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28 73 74  /.  /* fflush(st
2a3b0 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20  dout); */.  if( 
2a3c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a3d0 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2a3e0 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69  pCur);.  }.end_i
2a3f0 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74 65 46  nsert:.  sqliteF
2a400 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20  ree(newCell);.  
2a410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a420 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
2a430 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
2a440 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
2a450 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
2a460 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2a470 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2a480 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
2a490 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
2a4a0 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
2a4b0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2a4c0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
2a4d0 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Page;.  unsigned
2a4e0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2a4f0 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
2a500 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
2a510 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a520 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2a530 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  t;..  assert( pP
2a540 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2a550 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2a560 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2a570 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2a580 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2a590 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64  saction before d
2a5a0 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f  oing a delete */
2a5b0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
2a5c0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2a5d0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2a5e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2a5f0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2a600 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2a610 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70  ( pCur->idx >= p
2a620 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2a630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a640 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20  _ERROR;  /* The 
2a650 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
2a660 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69  inting to anythi
2a670 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2a680 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
2a690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a6a0 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69  TE_PERM;   /* Di
2a6b0 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20  d not open this 
2a6c0 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69  cursor for writi
2a6d0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2a6e0 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2a6f0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2a700 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20  ot, pCur) ){.   
2a710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2a720 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
2a730 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
2a740 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
2a750 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ck */.  }..  /* 
2a760 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  Restore the curr
2a770 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2a780 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20  ion (a no-op if 
2a790 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2a7a0 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f  t in .  ** CURSO
2a7b0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
2a7c0 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68  ate) and save th
2a7d0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2a7e0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2a7f0 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74   .  ** open on t
2a800 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54  he same table. T
2a810 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
2a820 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e  pager_write() on
2a830 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74   the page.  ** t
2a840 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69  hat the entry wi
2a850 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72  ll be deleted fr
2a860 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  om..  */.  if( .
2a870 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72      (rc = restor
2a880 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
2a890 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 29  sition(pCur, 1))
2a8a0 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2a8b0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2a8c0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2a8d0 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c  oot, pCur))!=0 |
2a8e0 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69  |.    (rc = sqli
2a8f0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
2a900 50 61 67 65 2d 3e 61 44 61 74 61 29 29 21 3d 30  Page->aData))!=0
2a910 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2a920 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   rc;.  }..  /* L
2a930 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77  ocate the cell w
2a940 69 74 68 69 6e 20 69 74 27 73 20 70 61 67 65 20  ithin it's page 
2a950 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20  and leave pCell 
2a960 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a  pointing to the.
2a970 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63    ** data. The c
2a980 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20  learCell() call 
2a990 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c  frees any overfl
2a9a0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
2a9b0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
2a9c0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c  * cell. The cell
2a9d0 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c   itself is still
2a9e0 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20   intact..  */.  
2a9f0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2aa00 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2aa10 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
2aa20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2aa30 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2aa40 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
2aa50 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2aa60 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2aa70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2aa80 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
2aa90 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2aaa0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e  /*.    ** The en
2aab0 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74  try we are about
2aac0 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
2aad0 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77  t a leaf so if w
2aae0 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  e do not.    ** 
2aaf0 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20  do something we 
2ab00 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c  will leave a hol
2ab10 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  e on an internal
2ab20 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65   page..    ** We
2ab30 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68   have to fill th
2ab40 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67  e hole by moving
2ab50 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20   in a cell from 
2ab60 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20  a leaf.  The.   
2ab70 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66   ** next Cell af
2ab80 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62  ter the one to b
2ab90 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61  e deleted is gua
2aba0 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
2abb0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62   and.    ** to b
2abc0 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63  e a leaf so we c
2abd0 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a  an use it..    *
2abe0 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c  /.    BtCursor l
2abf0 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69  eafCur;.    unsi
2ac00 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74  gned char *pNext
2ac10 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e 65 78 74  ;.    int szNext
2ac20 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 69 6c  ;  /* The compil
2ac30 65 72 20 77 61 72 6e 69 6e 67 20 69 73 20 77 72  er warning is wr
2ac40 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69 73 20 61  ong: szNext is a
2ac50 6c 77 61 79 73 20 0a 20 20 20 20 20 20 20 20 20  lways .         
2ac60 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69          ** initi
2ac70 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73  alized before us
2ac80 65 2e 20 20 41 64 64 69 6e 67 20 61 6e 20 65 78  e.  Adding an ex
2ac90 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
2aca0 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
2acb0 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c 65 6e 63      ** to silenc
2acc0 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 73  e the compiler s
2acd0 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65 20 63 6f  lows down the co
2ace0 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  de. */.    int n
2acf0 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69  otUsed;.    unsi
2ad00 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43  gned char *tempC
2ad10 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ell = 0;.    ass
2ad20 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61  ert( !pPage->lea
2ad30 66 44 61 74 61 20 29 3b 0a 20 20 20 20 67 65 74  fData );.    get
2ad40 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2ad50 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2ad60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ad70 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2ad80 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2ad90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ada0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
2adb0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
2adc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2add0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ade0 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
2adf0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2ae00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ae10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
2ae20 67 65 72 5f 77 72 69 74 65 28 6c 65 61 66 43 75  ger_write(leafCu
2ae30 72 2e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  r.pPage->aData);
2ae40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ae50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ae60 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44 45        TRACE(("DE
2ae70 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
2ae80 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66  elete internal f
2ae90 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66  rom %d replace f
2aea0 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
2aeb0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
2aec0 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
2aed0 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50  pgno, leafCur.pP
2aee0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2aef0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2af00 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65  e, pCur->idx, ce
2af10 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2af20 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20   pCell));.      
2af30 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c  pNext = findCell
2af40 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2af50 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20 20  leafCur.idx);.  
2af60 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c      szNext = cel
2af70 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75 72  lSizePtr(leafCur
2af80 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a  .pPage, pNext);.
2af90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 58        assert( MX
2afa0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e  _CELL_SIZE(pBt)>
2afb0 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20  =szNext+4 );.   
2afc0 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71     tempCell = sq
2afd0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d  liteMallocRaw( M
2afe0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2aff0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65   );.      if( te
2b000 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  mpCell==0 ){.   
2b010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b020 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
2b030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b050 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
2b060 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b070 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20  ->idx, pNext-4, 
2b080 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65  szNext+4, tempCe
2b090 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
2b0a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b0b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74  _OK ){.      put
2b0c0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2b0d0 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  owCell(pPage, pC
2b0e0 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68  ur->idx), pgnoCh
2b0f0 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ild);.      rc =
2b100 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2b110 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
2b120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b130 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  ){.      dropCel
2b140 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2b150 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a   leafCur.idx, sz
2b160 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Next);.      rc 
2b170 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75  = balance(leafCu
2b180 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  r.pPage, 0);.   
2b190 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
2b1a0 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20  e(tempCell);.   
2b1b0 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73   releaseTempCurs
2b1c0 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  or(&leafCur);.  
2b1d0 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45  }else{.    TRACE
2b1e0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2b1f0 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20  =%d delete from 
2b200 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2b210 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2b220 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  t, pPage->pgno))
2b230 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2b240 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b250 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2b260 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2b270 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2b280 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  age, 0);.  }.  i
2b290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b2a0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2b2b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
2b2c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b2d0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2b2e0 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
2b2f0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
2b300 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
2b310 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
2b320 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2b330 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
2b340 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
2b350 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
2b360 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
2b370 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
2b380 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
2b390 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
2b3a0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
2b3b0 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
2b3c0 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
2b3d0 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
2b3e0 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
2b3f0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
2b400 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
2b410 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
2b420 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
2b430 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
2b440 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
2b450 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
2b460 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74 20   indices.*/.int 
2b470 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
2b480 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
2b490 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
2b4a0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
2b4b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2b4c0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
2b4d0 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
2b4e0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
2b4f0 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  c;.  if( pBt->in
2b500 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2b510 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2b520 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2b530 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73  transaction firs
2b540 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
2b550 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2b560 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2b570 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2b580 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2b590 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2b5a0 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65  .  /* It is ille
2b5b0 67 61 6c 20 74 6f 20 63 72 65 61 74 65 20 61 20  gal to create a 
2b5c0 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
2b5d0 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
2b5e0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
2b5f0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
2b600 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
2b610 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
2b620 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
2b630 64 20 74 6f 20 6d 6f 76 65 20 61 20 64 61 74 61  d to move a data
2b640 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d 61 6b  base page to mak
2b650 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
2b660 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20  ew root-page..  
2b670 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75  ** If an open cu
2b680 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74  rsor was using t
2b690 68 65 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65  he page a proble
2b6a0 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 20  m would occur.. 
2b6b0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
2b6c0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65  Cursor ){.    re
2b6d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2b6e0 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  ED;.  }..#ifdef 
2b6f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2b700 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
2b710 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
2b720 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
2b730 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  t, 1, 0);.  if( 
2b740 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b750 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
2b760 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2b770 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65     Pgno pgnoMove
2b780 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61  ;      /* Move a
2b790 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61   page here to ma
2b7a0 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2b7b0 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20  root-page */.   
2b7c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d   MemPage *pPageM
2b7d0 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ove; /* The page
2b7e0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a   to move to. */.
2b7f0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
2b800 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
2b810 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
2b820 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
2b830 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
2b840 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
2b850 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
2b860 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
2b870 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
2b880 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
2b890 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
2b8a0 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
2b8b0 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
2b8c0 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
2b8d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2b8e0 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
2b8f0 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2b900 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b910 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2b920 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20    pgnoRoot++;.. 
2b930 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
2b940 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  ot-page may not 
2b950 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  be allocated on 
2b960 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
2b970 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ge, or the.    *
2b980 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70  * PENDING_BYTE p
2b990 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2b9a0 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  if( pgnoRoot==PT
2b9b0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2d  RMAP_PAGENO(pBt-
2b9c0 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 70 67 6e  >usableSize, pgn
2b9d0 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20  oRoot) ||.      
2b9e0 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44    pgnoRoot==PEND
2b9f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ba00 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  t) ){.      pgno
2ba10 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Root++;.    }.  
2ba20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f    assert( pgnoRo
2ba30 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a  ot>=3 );..    /*
2ba40 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65   Allocate a page
2ba50 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  . The page that 
2ba60 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65  currently reside
2ba70 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69  s at pgnoRoot wi
2ba80 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76  ll.    ** be mov
2ba90 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  ed to the alloca
2baa0 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73  ted page (unless
2bab0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2bac0 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20  age happens.    
2bad0 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20  ** to reside at 
2bae0 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a  pgnoRoot)..    *
2baf0 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  /.    rc = alloc
2bb00 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 50  atePage(pBt, &pP
2bb10 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f  ageMove, &pgnoMo
2bb20 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ve, pgnoRoot, 1)
2bb30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2bb40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bb50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bb60 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d  }..    if( pgnoM
2bb70 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b  ove!=pgnoRoot ){
2bb80 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2bb90 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2bba0 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2bbb0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2bbc0 76 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ve);.      rc = 
2bbd0 67 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  getPage(pBt, pgn
2bbe0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 29 3b 0a  oRoot, &pRoot);.
2bbf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2bc00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bc10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bc20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2bc30 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2bc40 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65  pgnoRoot, &eType
2bc50 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
2bc60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2bc70 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d  TE_OK || eType==
2bc80 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
2bc90 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
2bca0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
2bcb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2bcc0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2bcd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bce0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2bcf0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
2bd00 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
2bd10 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
2bd20 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2bd30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2bd40 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
2bd50 65 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 3b  e(pRoot->aData);
2bd60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2bd70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bd80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2bd90 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2bda0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2bdb0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65   }.      rc = re
2bdc0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
2bdd0 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50  pRoot, eType, iP
2bde0 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65  trPage, pgnoMove
2bdf0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2be00 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2be10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2be20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2be30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2be40 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65   }.      rc = ge
2be50 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2be60 6f 6f 74 2c 20 26 70 52 6f 6f 74 29 3b 0a 20 20  oot, &pRoot);.  
2be70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2be80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2be90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bea0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2beb0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
2bec0 65 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29 3b  e(pRoot->aData);
2bed0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2bee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bef0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2bf00 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2bf10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2bf20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2bf30 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67      pRoot = pPag
2bf40 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20  eMove;.    } .. 
2bf50 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2bf60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64   pointer-map and
2bf70 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20   meta-data with 
2bf80 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2bf90 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  e number. */.   
2bfa0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2bfb0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50  pBt, pgnoRoot, P
2bfc0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2bfd0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2bfe0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2bff0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2c000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2c010 20 7d 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 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2c030 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f  ta(p, 4, pgnoRoo
2c040 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2c050 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2c060 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2c070 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2c080 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
2c090 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61   rc = allocatePa
2c0a0 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2c0b0 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2c0c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2c0d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2c0e0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
2c0f0 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72  qlite3pager_iswr
2c100 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 61  iteable(pRoot->a
2c110 44 61 74 61 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Data) );.  zeroP
2c120 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
2c130 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2c140 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
2c150 65 66 28 70 52 6f 6f 74 2d 3e 61 44 61 74 61 29  ef(pRoot->aData)
2c160 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
2c170 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
2c180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2c1a0 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
2c1b0 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
2c1c0 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
2c1d0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
2c1e0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
2c1f0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
2c200 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
2c210 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
2c220 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
2c230 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
2c240 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
2c250 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
2c260 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
2c270 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
2c280 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d  o clear */.  Mem
2c290 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
2c2a0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2c2b0 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65  e.  NULL for the
2c2c0 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66   root */.  int f
2c2d0 72 65 65 50 61 67 65 46 6c 61 67 20 20 20 20 20  reePageFlag     
2c2e0 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70   /* Deallocate p
2c2f0 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  age if true */.)
2c300 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2c310 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
2c320 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2c330 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
2c340 69 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73  i;..  if( pgno>s
2c350 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
2c360 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2c370 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
2c380 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c390 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
2c3a0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2c3b0 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
2c3c0 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
2c3d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2c3e0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2c3f0 6f 75 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  out;.  rc = sqli
2c400 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
2c410 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
2c420 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2c430 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2c440 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
2c450 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
2c460 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
2c470 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2c480 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
2c490 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2c4a0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2c4b0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2c4c0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
2c4d0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
2c4e0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
2c4f0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2c500 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2c510 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2c520 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2c530 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
2c540 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2c550 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2c560 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
2c570 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2c580 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2c590 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2c5a0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2c5b0 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50  a[8]), pPage->pP
2c5c0 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69  arent, 1);.    i
2c5d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2c5e0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2c5f0 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ut;.  }.  if( fr
2c600 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
2c610 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2c620 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pPage);.  }else{
2c630 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2c640 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
2c650 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
2c660 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
2c670 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
2c680 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2c690 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2c6a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2c6b0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2c6c0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
2c6d0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
2c6e0 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
2c6f0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2c700 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
2c710 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
2c720 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
2c730 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
2c740 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2c750 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
2c760 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
2c770 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2c780 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2c790 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2c7a0 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2c7b0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
2c7c0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
2c7d0 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
2c7e0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
2c7f0 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
2c800 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
2c810 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2c820 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2c830 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e  nt iTable){.  in
2c840 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
2c850 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72   *pCur;.  BtShar
2c860 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c870 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2c880 3d 20 70 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20  = p->pSqlite;.  
2c890 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2c8a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2c8b0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2c8c0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2c8d0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2c8e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
2c8f0 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 6e   /* If this conn
2c900 65 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 69 6e  ection is not in
2c910 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2c920 64 20 6d 6f 64 65 20 61 6e 64 20 63 75 72 72 65  d mode and curre
2c930 6e 74 6c 79 20 68 61 73 0a 20 20 2a 2a 20 61 20  ntly has.  ** a 
2c940 72 65 61 64 2d 63 75 72 73 6f 72 20 6f 70 65 6e  read-cursor open
2c950 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   on the table be
2c960 69 6e 67 20 63 6c 65 61 72 65 64 2c 20 72 65 74  ing cleared, ret
2c970 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2c980 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  D..  */.  if( 0=
2c990 3d 64 62 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66  =db || 0==(db->f
2c9a0 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c9b0 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 29 7b 0a  Uncommitted) ){.
2c9c0 20 20 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74      for(pCur=pBt
2c9d0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
2c9e0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
2c9f0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  t){.      if( pC
2ca00 75 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 26 26  ur->pBtree==p &&
2ca10 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2ca20 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b  =(Pgno)iTable ){
2ca30 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
2ca40 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
2ca50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ca60 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2ca70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca80 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
2ca90 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2caa0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65  }.  }..  /* Save
2cab0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66   the position of
2cac0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
2cad0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
2cae0 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2caf0 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2cb00 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54  lCursors(pBt, iT
2cb10 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  able, 0)) ){.   
2cb20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2cb30 0a 20 20 72 65 74 75 72 6e 20 63 6c 65 61 72 44  .  return clearD
2cb40 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2cb50 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30   (Pgno)iTable, 0
2cb60 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  , 0);.}../*.** E
2cb70 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  rase all informa
2cb80 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20  tion in a table 
2cb90 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74  and add the root
2cba0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
2cbb0 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74  .** the freelist
2cbc0 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72  .  Except, the r
2cbd0 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63  oot of the princ
2cbe0 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20  iple table (the 
2cbf0 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31  one on.** page 1
2cc00 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64  ) is never added
2cc10 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2cc20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2cc30 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
2cc40 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
2cc50 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
2cc60 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f  ny open.** curso
2cc70 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
2cc80 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
2cc90 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
2cca0 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20  and the page at 
2ccb0 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68  iTable is not th
2ccc0 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70  e last.** root p
2ccd0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2cce0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
2ccf0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2cd00 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  e .** in the dat
2cd10 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f  abase file is mo
2cd20 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f  ved into the slo
2cd30 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
2cd40 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65  ied by.** iTable
2cd50 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73   and that last s
2cd60 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
2cd70 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73  upied by the las
2cd80 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  t root page.** i
2cd90 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
2cda0 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20  reelist instead 
2cdb0 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74  of iTable.  In t
2cdc0 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20  his say, all.** 
2cdd0 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b  root pages are k
2cde0 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ept at the begin
2cdf0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
2ce00 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
2ce10 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79  .** is necessary
2ce20 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20   for AUTOVACUUM 
2ce30 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20  to work right.  
2ce40 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
2ce50 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  to the .** page 
2ce60 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64  number that used
2ce70 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20   to be the last 
2ce80 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
2ce90 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20   file before.** 
2cea0 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f  the move.  If no
2ceb0 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64   page gets moved
2cec0 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65  , *piMoved is se
2ced0 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c  t to 0..** The l
2cee0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ast root page is
2cef0 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74   recorded in met
2cf00 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c  a[3] and the val
2cf10 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d  ue of.** meta[3]
2cf20 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74   is updated by t
2cf30 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a  his procedure..*
2cf40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2cf50 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65  eeDropTable(Btre
2cf60 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2cf70 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
2cf80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2cf90 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2cfa0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2cfb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 69 66   = p->pBt;..  if
2cfc0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
2cfd0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2cfe0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2cff0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2d000 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2d010 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
2d020 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2d030 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20  to drop a table 
2d040 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
2d050 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
2d060 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
2d070 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
2d080 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
2d090 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
2d0a0 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
2d0b0 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  ove another root
2d0c0 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20  -page to fill a 
2d0d0 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
2d0e0 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f  deleted.  ** roo
2d0f0 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70  t page. If an op
2d100 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
2d110 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20  ing this page a 
2d120 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20  problem would . 
2d130 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a   ** occur..  */.
2d140 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
2d150 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
2d160 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2d170 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 50    }..  rc = getP
2d180 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
2d190 54 61 62 6c 65 2c 20 26 70 50 61 67 65 29 3b 0a  Table, &pPage);.
2d1a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d1b0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
2d1c0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2d1d0 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a  ble(p, iTable);.
2d1e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d1f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2d200 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
2d210 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
2d220 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
2d230 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
2d240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2d250 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
2d260 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2d270 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2d280 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
2d290 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2d2a0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2d2b0 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
2d2c0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
2d2d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2d2e0 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
2d2f0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
2d300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d310 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2d320 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2d330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d340 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2d350 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
2d360 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
2d370 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
2d380 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2d390 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
2d3a0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2d3b0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
2d3c0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
2d3d0 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
2d3e0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2d3f0 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
2d400 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2d410 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2d420 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2d430 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d440 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2d450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2d470 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2d480 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2d490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2d4a0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
2d4b0 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
2d4c0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2d4d0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2d4e0 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2d4f0 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
2d500 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
2d510 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
2d520 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
2d530 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
2d540 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
2d550 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d560 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
2d570 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d580 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2d590 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2d5a0 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
2d5b0 6f 2c 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20 20  o, &pMove);.    
2d5c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d5d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d5e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d600 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2d610 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54  e(pBt, pMove, PT
2d620 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
2d630 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , iTable);.     
2d640 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d650 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2d660 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2d680 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2d690 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2d6a0 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  getPage(pBt, max
2d6b0 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
2d6c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d6d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d6e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d6f0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2d700 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2d710 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2d720 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d730 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2d740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d760 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
2d780 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
2d790 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
2d7a0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
2d7b0 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
2d7c0 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
2d7d0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
2d7e0 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
2d7f0 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
2d800 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
2d810 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
2d820 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
2d830 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
2d840 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
2d850 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
2d860 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
2d870 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
2d880 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
2d890 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2d8a0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
2d8b0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
2d8c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2d8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2d8e0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2d8f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
2d900 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
2d910 5f 50 41 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61  _PAGENO(pBt->usa
2d920 62 6c 65 53 69 7a 65 2c 20 6d 61 78 52 6f 6f 74  bleSize, maxRoot
2d930 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Pgno) ){.       
2d940 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
2d950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2d960 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e  sert( maxRootPgn
2d970 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
2d980 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20  PAGE(pBt) );..  
2d990 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d9a0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
2d9b0 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  p, 4, maxRootPgn
2d9c0 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
2d9d0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2d9e0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2d9f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2da00 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
2da10 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
2da20 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65  * If sqlite3Btre
2da30 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63  eDropTable was c
2da40 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e  alled on page 1.
2da50 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   */.    zeroPage
2da60 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b  (pPage, PTF_INTK
2da70 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20  EY|PTF_LEAF );. 
2da80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2da90 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
2daa0 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a  urn rc;  .}.../*
2dab0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74  .** Read the met
2dac0 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  a-information ou
2dad0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
2dae0 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  file.  Meta[0].*
2daf0 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
2db00 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75  of free pages cu
2db10 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64  rrently in the d
2db20 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31  atabase.  Meta[1
2db30 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74  ].** through met
2db40 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61  a[15] are availa
2db50 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68  ble for use by h
2db60 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d  igher layers.  M
2db70 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61  eta[0].** is rea
2db80 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65  d-only, the othe
2db90 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  rs are read/writ
2dba0 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63  e..** .** The sc
2dbb0 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65  hema layer numbe
2dbc0 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64  rs meta values d
2dbd0 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20  ifferently.  At 
2dbe0 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61  the schema.** la
2dbf0 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74  yer (and the Set
2dc00 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43  Cookie and ReadC
2dc10 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74  ookie opcodes) t
2dc20 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2dc30 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f  free pages is no
2dc40 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43  t visible.  So C
2dc50 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20  ookie[0] is the 
2dc60 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e  same as Meta[1].
2dc70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2dc80 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65  treeGetMeta(Btre
2dc90 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
2dca0 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 69 6e  32 *pMeta){.  in
2dcb0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
2dcc0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74   char *pP1;.  Bt
2dcd0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2dce0 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  >pBt;..  /* Read
2dcf0 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20  ing a meta-data 
2dd00 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61  value requires a
2dd10 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
2dd20 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a  ge 1 (and hence.
2dd30 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
2dd40 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65  master table. We
2dd50 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20   grab this lock 
2dd60 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2dd70 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f  ether or.  ** no
2dd80 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61  t the SQLITE_Rea
2dd90 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
2dda0 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61  g is set (the ta
2ddb0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2ddc0 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65  ge.  ** 1 is tre
2ddd0 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61  ated as a specia
2dde0 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54  l case by queryT
2ddf0 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c  ableLock() and l
2de00 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a  ockTable())..  *
2de10 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61  /.  rc = queryTa
2de20 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
2de30 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
2de40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2de50 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2de60 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
2de70 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
2de80 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2de90 65 33 70 61 67 65 72 5f 67 65 74 28 70 42 74 2d  e3pager_get(pBt-
2dea0 3e 70 50 61 67 65 72 2c 20 31 2c 20 28 76 6f 69  >pPager, 1, (voi
2deb0 64 2a 2a 29 26 70 50 31 29 3b 0a 20 20 69 66 28  d**)&pP1);.  if(
2dec0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ded0 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34  .  *pMeta = get4
2dee0 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
2def0 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65  dx*4]);.  sqlite
2df00 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 31  3pager_unref(pP1
2df10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f  );..  /* If auto
2df20 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61  vacuumed is disa
2df30 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2df40 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72  ld but we are tr
2df50 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63  ying to .  ** ac
2df60 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75  cess an autovacu
2df70 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  umed database, t
2df80 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74  hen make the dat
2df90 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20  abase readonly. 
2dfa0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
2dfb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2dfc0 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34  UUM.  if( idx==4
2dfd0 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70   && *pMeta>0 ) p
2dfe0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
2dff0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  ;.#endif..  /* G
2e000 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  rab the read-loc
2e010 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  k on page 1. */.
2e020 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
2e030 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
2e040 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2e050 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
2e060 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
2e070 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
2e080 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
2e090 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
2e0a0 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
2e0b0 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
2e0c0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2e0d0 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
2e0e0 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
2e0f0 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
2e100 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2e110 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e120 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
2e130 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
2e140 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2e150 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2e160 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2e170 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2e180 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2e190 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2e1a0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
2e1b0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
2e1c0 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31  age1!=0 );.  pP1
2e1d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
2e1e0 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
2e1f0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
2e200 28 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20  (pP1);.  if( rc 
2e210 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
2e220 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
2e230 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
2e240 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e250 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2e260 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
2e270 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
2e280 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
2e290 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2e2a0 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
2e2b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
2e2c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e2d0 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
2e2e0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
2e2f0 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
2e300 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2e310 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
2e320 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
2e330 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ** restoreOrClea
2e340 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2e350 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d  ) here..  */.  M
2e360 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2e370 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72  pCur->pPage;.  r
2e380 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50  eturn pPage ? pP
2e390 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2e3a0 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30  ->hdrOffset] : 0
2e3b0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2e3c0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
2e3d0 72 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d 62  rint a disassemb
2e3e0 6c 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ly of the given 
2e3f0 70 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72 64  page on standard
2e400 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72   output.  This r
2e410 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75 73 65  outine.** is use
2e420 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
2e430 61 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  and testing only
2e440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e450 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74  btreePageDump(Bt
2e460 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
2e470 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72   pgno, int recur
2e480 73 69 76 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70  sive, MemPage *p
2e490 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  Parent){.  int r
2e4a0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2e4b0 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  age;.  int i, j,
2e4c0 20 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   c;.  int nFree;
2e4d0 0a 20 20 75 31 36 20 69 64 78 3b 0a 20 20 69 6e  .  u16 idx;.  in
2e4e0 74 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e 43 65  t hdr;.  int nCe
2e4f0 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  ll;.  int isInit
2e500 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2e510 72 20 2a 64 61 74 61 3b 0a 20 20 63 68 61 72 20  r *data;.  char 
2e520 72 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75 6e 73  range[20];.  uns
2e530 69 67 6e 65 64 20 63 68 61 72 20 70 61 79 6c 6f  igned char paylo
2e540 61 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20 3d 20  ad[20];..  rc = 
2e550 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  getPage(pBt, (Pg
2e560 6e 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  no)pgno, &pPage)
2e570 3b 0a 20 20 69 73 49 6e 69 74 20 3d 20 70 50 61  ;.  isInit = pPa
2e580 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66  ge->isInit;.  if
2e590 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
2e5a0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 69 74 50 61  =0 ){.    initPa
2e5b0 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ge(pPage, pParen
2e5c0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
2e5d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2e5e0 63 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70  c;.  }.  hdr = p
2e5f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2e600 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2e610 3e 61 44 61 74 61 3b 0a 20 20 63 20 3d 20 64 61  >aData;.  c = da
2e620 74 61 5b 68 64 72 5d 3b 0a 20 20 70 50 61 67 65  ta[hdr];.  pPage
2e630 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 63 20 26 20  ->intKey = (c & 
2e640 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2e650 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
2e660 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
2e670 20 3d 20 28 63 20 26 20 50 54 46 5f 5a 45 52 4f   = (c & PTF_ZERO
2e680 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
2e690 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 28 63  e->leafData = (c
2e6a0 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41 29   & PTF_LEAFDATA)
2e6b0 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  !=0;.  pPage->le
2e6c0 61 66 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45  af = (c & PTF_LE
2e6d0 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  AF)!=0;.  pPage-
2e6e0 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61  >hasData = !(pPa
2e6f0 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20  ge->zeroData || 
2e700 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  (!pPage->leaf &&
2e710 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
2e720 29 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65  ));.  nCell = ge
2e730 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2e740 2b 33 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  +3]);.  sqlite3D
2e750 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
2e760 20 25 64 3a 20 20 66 6c 61 67 73 3d 30 78 25 30   %d:  flags=0x%0
2e770 32 78 20 20 66 72 61 67 3d 25 64 20 20 20 70 61  2x  frag=%d   pa
2e780 72 65 6e 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f  rent=%d\n", pgno
2e790 2c 0a 20 20 20 20 64 61 74 61 5b 68 64 72 5d 2c  ,.    data[hdr],
2e7a0 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20   data[hdr+7], . 
2e7b0 20 20 20 28 70 50 61 67 65 2d 3e 69 73 49 6e 69     (pPage->isIni
2e7c0 74 20 26 26 20 70 50 61 67 65 2d 3e 70 50 61 72  t && pPage->pPar
2e7d0 65 6e 74 29 20 3f 20 70 50 61 67 65 2d 3e 70 50  ent) ? pPage->pP
2e7e0 61 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29  arent->pgno : 0)
2e7f0 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 20  ;.  assert( hdr 
2e800 3d 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  == (pgno==1 ? 10
2e810 30 20 3a 20 30 29 20 29 3b 0a 20 20 69 64 78 20  0 : 0) );.  idx 
2e820 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 70 50 61  = hdr + 12 - pPa
2e830 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f  ge->leaf*4;.  fo
2e840 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
2e850 69 2b 2b 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  i++){.    CellIn
2e860 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e  fo info;.    Pgn
2e870 6f 20 63 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73  o child;.    uns
2e880 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2e890 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
2e8a0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
2e8b0 20 20 61 64 64 72 20 3d 20 67 65 74 32 62 79 74    addr = get2byt
2e8c0 65 28 26 64 61 74 61 5b 69 64 78 20 2b 20 32 2a  e(&data[idx + 2*
2e8d0 69 5d 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  i]);.    pCell =
2e8e0 20 26 64 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20   &data[addr];.  
2e8f0 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
2e900 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2e910 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e  fo);.    sz = in
2e920 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70  fo.nSize;.    sp
2e930 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64 2e  rintf(range,"%d.
2e940 2e 25 64 22 2c 20 61 64 64 72 2c 20 61 64 64 72  .%d", addr, addr
2e950 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  +sz-1);.    if( 
2e960 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e970 20 20 20 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a       child = 0;.
2e980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e990 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2e9a0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  e(pCell);.    }.
2e9b0 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
2e9c0 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
2e9d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
2e9e0 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
2e9f0 20 20 20 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66     if( sz>sizeof
2ea00 28 70 61 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a  (payload)-1 ) sz
2ea10 20 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61   = sizeof(payloa
2ea20 64 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d)-1;.    memcpy
2ea30 28 70 61 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c  (payload, &pCell
2ea40 5b 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20  [info.nHeader], 
2ea50 73 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  sz);.    for(j=0
2ea60 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20  ; j<sz; j++){.  
2ea70 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 5b      if( payload[
2ea80 6a 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f  j]<0x20 || paylo
2ea90 61 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70 61 79  ad[j]>0x7f ) pay
2eaa0 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20  load[j] = '.';. 
2eab0 20 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64     }.    payload
2eac0 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  [sz] = 0;.    sq
2ead0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2eae0 28 0a 20 20 20 20 20 20 22 63 65 6c 6c 20 25 32  (.      "cell %2
2eaf0 64 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d  d: i=%-10s chld=
2eb00 25 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e  %-4d nk=%-4lld n
2eb10 64 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25  d=%-4d payload=%
2eb20 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c 20 72  s\n",.      i, r
2eb30 61 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66  ange, child, inf
2eb40 6f 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61  o.nKey, info.nDa
2eb50 74 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20 20 20  ta, payload.    
2eb60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
2eb70 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2eb80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2eb90 6e 74 66 28 22 72 69 67 68 74 5f 63 68 69 6c 64  ntf("right_child
2eba0 3a 20 25 64 5c 6e 22 2c 20 67 65 74 34 62 79 74  : %d\n", get4byt
2ebb0 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 29  e(&data[hdr+8]))
2ebc0 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20  ;.  }.  nFree = 
2ebd0 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69 64  0;.  i = 0;.  id
2ebe0 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
2ebf0 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68  ta[hdr+1]);.  wh
2ec00 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64  ile( idx>0 && id
2ec10 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  x<pPage->pBt->us
2ec20 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2ec30 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74  int sz = get2byt
2ec40 65 28 26 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b  e(&data[idx+2]);
2ec50 0a 20 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e  .    sprintf(ran
2ec60 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20 69 64 78  ge,"%d..%d", idx
2ec70 2c 20 69 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20  , idx+sz-1);.   
2ec80 20 6e 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20   nFree += sz;.  
2ec90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2eca0 69 6e 74 66 28 22 66 72 65 65 62 6c 6f 63 6b 20  intf("freeblock 
2ecb0 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a  %2d: i=%-10s siz
2ecc0 65 3d 25 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c  e=%-4d total=%d\
2ecd0 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 20 72 61  n",.       i, ra
2ece0 6e 67 65 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b  nge, sz, nFree);
2ecf0 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62  .    idx = get2b
2ed00 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 29 3b  yte(&data[idx]);
2ed10 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
2ed20 69 66 28 20 69 64 78 21 3d 30 20 29 7b 0a 20 20  if( idx!=0 ){.  
2ed30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2ed40 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 6e 65 78  intf("ERROR: nex
2ed50 74 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65  t freeblock inde
2ed60 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20  x out of range: 
2ed70 25 64 5c 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d  %d\n", idx);.  }
2ed80 0a 20 20 69 66 28 20 72 65 63 75 72 73 69 76 65  .  if( recursive
2ed90 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2eda0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2edb0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2edc0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2edd0 68 61 72 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e  har *pCell = fin
2ede0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
2edf0 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 67 65  .      btreePage
2ee00 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79  Dump(pBt, get4by
2ee10 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50  te(pCell), 1, pP
2ee20 61 67 65 29 3b 0a 20 20 20 20 20 20 69 64 78 20  age);.      idx 
2ee30 3d 20 67 65 74 32 62 79 74 65 28 70 43 65 6c 6c  = get2byte(pCell
2ee40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  );.    }.    btr
2ee50 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20  eePageDump(pBt, 
2ee60 67 65 74 34 62 79 74 65 28 26 64 61 74 61 5b 68  get4byte(&data[h
2ee70 64 72 2b 38 5d 29 2c 20 31 2c 20 70 50 61 67 65  dr+8]), 1, pPage
2ee80 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
2ee90 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b  isInit = isInit;
2eea0 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
2eeb0 75 6e 72 65 66 28 64 61 74 61 29 3b 0a 20 20 66  unref(data);.  f
2eec0 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
2eed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2eee0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
2eef0 42 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74  BtreePageDump(Bt
2ef00 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 67 6e 6f  ree *p, int pgno
2ef10 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 29  , int recursive)
2ef20 7b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  {.  return btree
2ef30 50 61 67 65 44 75 6d 70 28 70 2d 3e 70 42 74 2c  PageDump(p->pBt,
2ef40 20 70 67 6e 6f 2c 20 72 65 63 75 72 73 69 76 65   pgno, recursive
2ef50 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , 0);.}.#endif..
2ef60 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2ef70 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
2ef80 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
2ef90 29 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65  )./*.** Fill aRe
2efa0 73 75 6c 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f  sult[] with info
2efb0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2efc0 65 20 65 6e 74 72 79 20 61 6e 64 20 70 61 67 65  e entry and page
2efd0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 63 75 72   that the.** cur
2efe0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2eff0 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65  to..** .**   aRe
2f000 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65 20 70  sult[0] =  The p
2f010 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  age number.**   
2f020 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68  aResult[1] =  Th
2f030 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a  e entry number.*
2f040 2a 20 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d  *   aResult[2] =
2f050 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f    Total number o
2f060 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69  f entries on thi
2f070 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73  s page.**   aRes
2f080 75 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73  ult[3] =  Cell s
2f090 69 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f  ize (local paylo
2f0a0 61 64 20 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20  ad + header).** 
2f0b0 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20    aResult[4] =  
2f0c0 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
2f0d0 79 74 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ytes on this pag
2f0e0 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 35  e.**   aResult[5
2f0f0 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66  ] =  Number of f
2f100 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68  ree blocks on th
2f110 65 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73  e page.**   aRes
2f120 75 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20  ult[6] =  Total 
2f130 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f  payload size (lo
2f140 63 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a  cal + overflow).
2f150 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20  **   aResult[7] 
2f160 3d 20 20 48 65 61 64 65 72 20 73 69 7a 65 20 69  =  Header size i
2f170 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 61 52 65  n bytes.**   aRe
2f180 73 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c  sult[8] =  Local
2f190 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a   payload size.**
2f1a0 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20     aResult[9] = 
2f1b0 20 50 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   Parent page num
2f1c0 62 65 72 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ber.**.** This r
2f1d0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2f1e0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
2f1f0 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2f200 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2f210 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 42 74 43  eeCursorInfo(BtC
2f220 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2f230 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e 74 20 75   *aResult, int u
2f240 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20 63 6e 74  pCnt){.  int cnt
2f250 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  , idx;.  MemPage
2f260 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2f270 70 50 61 67 65 3b 0a 20 20 42 74 43 75 72 73 6f  pPage;.  BtCurso
2f280 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20 69 6e 74  r tmpCur;..  int
2f290 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
2f2a0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2f2b0 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
2f2c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f2d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2f2e0 63 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 49 6e  c;.  }..  pageIn
2f2f0 74 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a  tegrity(pPage);.
2f300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2f310 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 65 74  >isInit );.  get
2f320 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2f330 20 26 74 6d 70 43 75 72 29 3b 0a 20 20 77 68 69   &tmpCur);.  whi
2f340 6c 65 28 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20  le( upCnt-- ){. 
2f350 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2f360 26 74 6d 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  &tmpCur);.  }.  
2f370 70 50 61 67 65 20 3d 20 74 6d 70 43 75 72 2e 70  pPage = tmpCur.p
2f380 50 61 67 65 3b 0a 20 20 70 61 67 65 49 6e 74 65  Page;.  pageInte
2f390 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20  grity(pPage);.  
2f3a0 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c  aResult[0] = sql
2f3b0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
2f3c0 6d 62 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74  mber(pPage->aDat
2f3d0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52  a);.  assert( aR
2f3e0 65 73 75 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d  esult[0]==pPage-
2f3f0 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75  >pgno );.  aResu
2f400 6c 74 5b 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[1] = tmpCur.i
2f410 64 78 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d  dx;.  aResult[2]
2f420 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
2f430 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e 69 64  .  if( tmpCur.id
2f440 78 3e 3d 30 20 26 26 20 74 6d 70 43 75 72 2e 69  x>=0 && tmpCur.i
2f450 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2f460 29 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  ){.    getCellIn
2f470 66 6f 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 20  fo(&tmpCur);.   
2f480 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d   aResult[3] = tm
2f490 70 43 75 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b  pCur.info.nSize;
2f4a0 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20  .    aResult[6] 
2f4b0 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44  = tmpCur.info.nD
2f4c0 61 74 61 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  ata;.    aResult
2f4d0 5b 37 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [7] = tmpCur.inf
2f4e0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 20 20 61  o.nHeader;.    a
2f4f0 52 65 73 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43  Result[8] = tmpC
2f500 75 72 2e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  ur.info.nLocal;.
2f510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65    }else{.    aRe
2f520 73 75 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20  sult[3] = 0;.   
2f530 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b   aResult[6] = 0;
2f540 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20  .    aResult[7] 
2f550 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  = 0;.    aResult
2f560 5b 38 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  [8] = 0;.  }.  a
2f570 52 65 73 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67  Result[4] = pPag
2f580 65 2d 3e 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20  e->nFree;.  cnt 
2f590 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  = 0;.  idx = get
2f5a0 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  2byte(&pPage->aD
2f5b0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2f5c0 66 73 65 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c  fset+1]);.  whil
2f5d0 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c  e( idx>0 && idx<
2f5e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2f5f0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e  leSize ){.    cn
2f600 74 2b 2b 3b 0a 20 20 20 20 69 64 78 20 3d 20 67  t++;.    idx = g
2f610 65 74 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et2byte(&pPage->
2f620 61 44 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d  aData[idx]);.  }
2f630 0a 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20  .  aResult[5] = 
2f640 63 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65  cnt;.  if( pPage
2f650 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20  ->pParent==0 || 
2f660 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
2f670 29 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74  ) ){.    aResult
2f680 5b 39 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  [9] = 0;.  }else
2f690 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d  {.    aResult[9]
2f6a0 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
2f6b0 74 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  t->pgno;.  }.  r
2f6c0 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
2f6d0 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74  (&tmpCur);.  ret
2f6e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f6f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2f700 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20  eturn the pager 
2f710 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2f720 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72  a BTree.  This r
2f730 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2f740 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
2f750 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
2f760 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69  ..*/.Pager *sqli
2f770 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
2f780 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
2f790 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  n p->pBt->pPager
2f7a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f7b0 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73  structure is pas
2f7c0 73 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75  sed around throu
2f7d0 67 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74  gh all the sanit
2f7e0 79 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69  y checking routi
2f7f0 6e 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  nes.** in order 
2f800 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  to keep track of
2f810 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61   some global sta
2f820 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  te information..
2f830 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2f840 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e  t IntegrityCk In
2f850 74 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63  tegrityCk;.struc
2f860 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a  t IntegrityCk {.
2f870 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2f880 20 20 20 20 2f 2a 20 54 68 65 20 74 72 65 65 20      /* The tree 
2f890 62 65 69 6e 67 20 63 68 65 63 6b 65 64 20 6f 75  being checked ou
2f8a0 74 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  t */.  Pager *pP
2f8b0 61 67 65 72 3b 20 2f 2a 20 54 68 65 20 61 73 73  ager; /* The ass
2f8c0 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 20 20  ociated pager.  
2f8d0 41 6c 73 6f 20 61 63 63 65 73 73 69 62 6c 65 20  Also accessible 
2f8e0 62 79 20 70 42 74 2d 3e 70 50 61 67 65 72 20 2a  by pBt->pPager *
2f8f0 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2f900 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f910 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
2f920 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  abase */.  int *
2f930 61 6e 52 65 66 3b 20 20 20 20 2f 2a 20 4e 75 6d  anRef;    /* Num
2f940 62 65 72 20 6f 66 20 74 69 6d 65 73 20 65 61 63  ber of times eac
2f950 68 20 70 61 67 65 20 69 73 20 72 65 66 65 72 65  h page is refere
2f960 6e 63 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  nced */.  char *
2f970 7a 45 72 72 4d 73 67 3b 20 2f 2a 20 41 6e 20 65  zErrMsg; /* An e
2f980 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 4e  rror message.  N
2f990 55 4c 4c 20 6f 66 20 6e 6f 20 65 72 72 6f 72 73  ULL of no errors
2f9a0 20 73 65 65 6e 2e 20 2a 2f 0a 7d 3b 0a 0a 23 69   seen. */.};..#i
2f9b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f9c0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2f9d0 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
2f9e0 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
2f9f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
2fa00 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2fa10 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
2fa20 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
2fa30 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
2fa40 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
2fa50 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2fa60 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
2fa70 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2fa80 2a 7a 4d 73 67 32 3b 0a 20 20 76 61 5f 73 74 61  *zMsg2;.  va_sta
2fa90 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2faa0 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74  .  zMsg2 = sqlit
2fab0 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d  e3VMPrintf(zForm
2fac0 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2fad0 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73  d(ap);.  if( zMs
2fae0 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20  g1==0 ) zMsg1 = 
2faf0 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  "";.  if( pCheck
2fb00 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
2fb10 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43   char *zOld = pC
2fb20 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  heck->zErrMsg;. 
2fb30 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d     pCheck->zErrM
2fb40 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  sg = 0;.    sqli
2fb50 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43  te3SetString(&pC
2fb60 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a  heck->zErrMsg, z
2fb70 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31  Old, "\n", zMsg1
2fb80 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29  , zMsg2, (char*)
2fb90 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
2fba0 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73  ee(zOld);.  }els
2fbb0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
2fbc0 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
2fbd0 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c  >zErrMsg, zMsg1,
2fbe0 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
2fbf0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
2fc00 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65  ree(zMsg2);.}.#e
2fc10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2fc20 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
2fc30 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
2fc40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
2fc50 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
2fc60 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72  * Add 1 to the r
2fc70 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
2fc80 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20  or page iPage.  
2fc90 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73  If this is the s
2fca0 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e  econd.** referen
2fcb0 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20  ce to the page, 
2fcc0 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  add an error mes
2fcd0 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e  sage to pCheck->
2fce0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75  zErrMsg..** Retu
2fcf0 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72  rn 1 if there ar
2fd00 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66  e 2 ore more ref
2fd10 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2fd20 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20  age and 0 if.** 
2fd30 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
2fd40 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  irst reference t
2fd50 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  o the page..**.*
2fd60 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61  * Also check tha
2fd70 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
2fd80 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a  r is in bounds..
2fd90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
2fda0 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79  eckRef(Integrity
2fdb0 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20  Ck *pCheck, int 
2fdc0 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
2fdd0 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
2fde0 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
2fdf0 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
2fe00 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20  Check->nPage || 
2fe10 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63  iPage<0 ){.    c
2fe20 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2fe30 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2fe40 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75  "invalid page nu
2fe50 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29  mber %d", iPage)
2fe60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
2fe70 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b    }.  if( pCheck
2fe80 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d  ->anRef[iPage]==
2fe90 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  1 ){.    checkAp
2fea0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2feb0 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72  zContext, "2nd r
2fec0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2fed0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
2fee0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2fef0 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63    return  (pChec
2ff00 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b  k->anRef[iPage]+
2ff10 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  +)>1;.}..#ifndef
2ff20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ff30 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68  OVACUUM./*.** Ch
2ff40 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74  eck that the ent
2ff50 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
2ff60 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69  r-map for page i
2ff70 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a  Child maps to .*
2ff80 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20  * page iParent, 
2ff90 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72  pointer type ptr
2ffa0 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70  Type. If not, ap
2ffb0 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65  pend an error me
2ffc0 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65  ssage.** to pChe
2ffd0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
2ffe0 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a  id checkPtrmap(.
2fff0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
30000 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65  Check,   /* Inte
30010 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74  grity check cont
30020 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ext */.  Pgno iC
30030 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  hild,           
30040 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75  /* Child page nu
30050 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79  mber */.  u8 eTy
30060 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
30070 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
30080 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f  nter map type */
30090 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c  .  Pgno iParent,
300a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
300b0 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
300c0 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  p parent page nu
300d0 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
300e0 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
300f0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63   /* Context desc
30100 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f  ription (used fo
30110 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a  r error msg) */.
30120 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
30130 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20  8 ePtrmapType;. 
30140 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72   Pgno iPtrmapPar
30150 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72  ent;..  rc = ptr
30160 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  mapGet(pCheck->p
30170 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74  Bt, iChild, &ePt
30180 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d  rmapType, &iPtrm
30190 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  apParent);.  if(
301a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
301b0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
301c0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
301d0 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74  ntext, "Failed t
301e0 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65  o read ptrmap ke
301f0 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a  y=%d", iChild);.
30200 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
30210 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79  .  if( ePtrmapTy
30220 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74  pe!=eType || iPt
30230 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72  rmapParent!=iPar
30240 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ent ){.    check
30250 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30260 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
30270 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20     "Bad ptr map 
30280 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70  entry key=%d exp
30290 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f  ected=(%d,%d) go
302a0 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20  t=(%d,%d)", .   
302b0 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65     iChild, eType
302c0 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d  , iParent, ePtrm
302d0 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50  apType, iPtrmapP
302e0 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  arent);.  }.}.#e
302f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
30300 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
30310 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
30320 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  or of an overflo
30330 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20  w page list..** 
30340 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
30350 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
30360 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e  on the list is N
30370 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30380 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e   checkList(.  In
30390 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
303a0 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  k,  /* Integrity
303b0 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78   checking contex
303c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65  t */.  int isFre
303d0 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eList,       /* 
303e0 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c  True for a freel
303f0 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ist.  False for 
30400 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
30410 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  st */.  int iPag
30420 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
30430 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
30440 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74   first page in t
30450 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  he list */.  int
30460 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
30470 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
30480 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
30490 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
304a0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
304b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
304c0 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
304d0 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ges */.){.  int 
304e0 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65  i;.  int expecte
304f0 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69  d = N;.  int iFi
30500 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77  rst = iPage;.  w
30510 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 29 7b  hile( N-- > 0 ){
30520 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
30530 61 72 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69  ar *pOvfl;.    i
30540 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20  f( iPage<1 ){.  
30550 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30560 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30570 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25  ext,.         "%
30580 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69  d of %d pages mi
30590 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66  ssing from overf
305a0 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e  low list startin
305b0 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20  g at %d",.      
305c0 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65      N+1, expecte
305d0 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  d, iFirst);.    
305e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
305f0 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28     if( checkRef(
30600 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
30610 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b  Context) ) break
30620 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
30630 33 70 61 67 65 72 5f 67 65 74 28 70 43 68 65 63  3pager_get(pChec
30640 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f  k->pPager, (Pgno
30650 29 69 50 61 67 65 2c 20 28 76 6f 69 64 2a 2a 29  )iPage, (void**)
30660 26 70 4f 76 66 6c 29 20 29 7b 0a 20 20 20 20 20  &pOvfl) ){.     
30670 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30680 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30690 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74  , "failed to get
306a0 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
306b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
306c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
306d0 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20  FreeList ){.    
306e0 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79    int n = get4by
306f0 74 65 28 26 70 4f 76 66 6c 5b 34 5d 29 3b 0a 23  te(&pOvfl[4]);.#
30700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30710 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30720 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
30730 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
30740 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
30750 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
30760 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
30770 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
30780 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
30790 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  dif.      if( n>
307a0 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61  pCheck->pBt->usa
307b0 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20  bleSize/4-8 ){. 
307c0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
307d0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
307e0 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
307f0 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61     "freelist lea
30800 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20  f count too big 
30810 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  on page %d", iPa
30820 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d  ge);.        N--
30830 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30840 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
30850 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
30860 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
30870 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
30880 70 4f 76 66 6c 5b 38 2b 69 2a 34 5d 29 3b 0a 23  pOvfl[8+i*4]);.#
30890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
308a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
308b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65          if( pChe
308c0 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
308d0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
308e0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
308f0 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
30900 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
30910 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
30920 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
30930 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68  dif.          ch
30940 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
30950 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65  FreePage, zConte
30960 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xt);.        }. 
30970 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20         N -= n;. 
30980 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
30990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
309a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
309b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
309c0 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
309d0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
309e0 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69  cuum and iPage i
309f0 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20  s not the last. 
30a00 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
30a10 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69  this overflow li
30a20 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  st, check that t
30a30 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
30a40 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  ntry for.      *
30a50 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
30a60 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61  page matches iPa
30a70 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ge..      */.   
30a80 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
30a90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
30aa0 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & N>0 ){.       
30ab0 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f   i = get4byte(pO
30ac0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 63 68  vfl);.        ch
30ad0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
30ae0 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  , i, PTRMAP_OVER
30af0 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW2, iPage, zC
30b00 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
30b10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
30b20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
30b30 74 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73  te(pOvfl);.    s
30b40 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
30b50 66 28 70 4f 76 66 6c 29 3b 0a 20 20 7d 0a 7d 0a  f(pOvfl);.  }.}.
30b60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
30b70 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
30b80 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
30b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
30ba0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
30bb0 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73  .** Do various s
30bc0 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20  anity checks on 
30bd0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66  a single page of
30be0 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e   a tree.  Return
30bf0 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70  .** the tree dep
30c00 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20  th.  Root pages 
30c10 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e  return 0.  Paren
30c20 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ts of root pages
30c30 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e  .** return 1, an
30c40 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a  d so forth..** .
30c50 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20  ** These checks 
30c60 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  are done:.**.** 
30c70 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75       1.  Make su
30c80 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e  re that cells an
30c90 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20  d freeblocks do 
30ca0 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20  not overlap.**  
30cb0 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62          but comb
30cc0 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ine to completel
30cd0 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65  y cover the page
30ce0 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61  ..**  NO  2.  Ma
30cf0 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79  ke sure cell key
30d00 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a  s are in order..
30d10 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65  **  NO  3.  Make
30d20 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
30d30 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
30d40 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e  al to zLowerBoun
30d50 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d  d..**  NO  4.  M
30d60 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
30d70 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
30d80 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70  or equal to zUpp
30d90 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20  erBound..**     
30da0 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69   5.  Check the i
30db0 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72  ntegrity of over
30dc0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20  flow pages..**  
30dd0 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76      6.  Recursiv
30de0 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72  ely call checkTr
30df0 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68  eePage on all ch
30e00 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20  ildren..**      
30e10 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  7.  Verify that 
30e20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c  the depth of all
30e30 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65   children is the
30e40 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38   same..**      8
30e50 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
30e60 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61  s page is at lea
30e70 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65  st 33% full or e
30e80 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  lse it is.**    
30e90 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f        the root o
30ea0 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73  f the tree..*/.s
30eb0 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54  tatic int checkT
30ec0 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67  reePage(.  Integ
30ed0 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
30ee0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
30ef0 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  the sanity check
30f00 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
30f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30f20 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
30f30 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20  e page to check 
30f40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
30f50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
30f60 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63  rent page */.  c
30f70 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74  har *zParentCont
30f80 65 78 74 2c 20 2f 2a 20 50 61 72 65 6e 74 20 63  ext, /* Parent c
30f90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72  ontext */.  char
30fa0 20 2a 7a 4c 6f 77 65 72 42 6f 75 6e 64 2c 20 20   *zLowerBound,  
30fb0 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 73 68    /* All keys sh
30fc0 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65 72 20  ould be greater 
30fd0 74 68 61 6e 20 74 68 69 73 2c 20 69 66 20 6e 6f  than this, if no
30fe0 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  t NULL */.  int 
30ff0 6e 4c 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20  nLower,         
31000 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
31010 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4c 6f  haracters in zLo
31020 77 65 72 42 6f 75 6e 64 20 2a 2f 0a 20 20 63 68  werBound */.  ch
31030 61 72 20 2a 7a 55 70 70 65 72 42 6f 75 6e 64 2c  ar *zUpperBound,
31040 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20      /* All keys 
31050 73 68 6f 75 6c 64 20 62 65 20 6c 65 73 73 20 74  should be less t
31060 68 61 6e 20 74 68 69 73 2c 20 69 66 20 6e 6f 74  han this, if not
31070 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 6e   NULL */.  int n
31080 55 70 70 65 72 20 20 20 20 20 20 20 20 20 20 20  Upper           
31090 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
310a0 61 72 61 63 74 65 72 73 20 69 6e 20 7a 55 70 70  aracters in zUpp
310b0 65 72 42 6f 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20  erBound */.){.  
310c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
310d0 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
310e0 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
310f0 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
31100 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
31110 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
31120 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
31130 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
31140 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
31150 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
31160 72 20 2a 68 69 74 3b 0a 0a 20 20 73 70 72 69 6e  r *hit;..  sprin
31170 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61  tf(zContext, "Pa
31180 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29  ge %d: ", iPage)
31190 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
311a0 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
311b0 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20  ts.  */.  pBt = 
311c0 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75  pCheck->pBt;.  u
311d0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
311e0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
311f0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
31200 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68  turn 0;.  if( ch
31210 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
31220 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e  Page, zParentCon
31230 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30  text) ) return 0
31240 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 67 65  ;.  if( (rc = ge
31250 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
31260 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 29 29  )iPage, &pPage))
31270 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
31280 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31290 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
312a0 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65     "unable to ge
312b0 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f  t the page. erro
312c0 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b  r code=%d", rc);
312d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
312e0 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69   }.  if( (rc = i
312f0 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
31300 50 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20  Parent))!=0 ){. 
31310 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31320 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31330 78 74 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20  xt, "initPage() 
31340 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f  returns error co
31350 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de %d", rc);.   
31360 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
31370 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
31380 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
31390 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63  ck out all the c
313a0 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70  ells..  */.  dep
313b0 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  th = 0;.  for(i=
313c0 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
313d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
313e0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
313f0 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  sz;.    CellInfo
31400 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43   info;..    /* C
31410 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65  heck payload ove
31420 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
31430 2a 2f 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  */.    sprintf(z
31440 43 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72 65  Context, "On tre
31450 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25  e page %d cell %
31460 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b  d: ", iPage, i);
31470 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
31480 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a  dCell(pPage,i);.
31490 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
314a0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
314b0 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20  info);.    sz = 
314c0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
314d0 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
314e0 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e  ey ) sz += info.
314f0 6e 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a  nKey;.    if( sz
31500 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
31510 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
31520 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  = (sz - info.nLo
31530 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65  cal + usableSize
31540 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a   - 5)/(usableSiz
31550 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67  e - 4);.      Pg
31560 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
31570 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
31580 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
31590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
315a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
315b0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
315c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
315d0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
315e0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c  pCheck, pgnoOvfl
315f0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
31600 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  W1, iPage, zCont
31610 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
31620 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b  ndif.      check
31630 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20  List(pCheck, 0, 
31640 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c  pgnoOvfl, nPage,
31650 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31660 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
31670 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63  sanity of left c
31680 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a  hild page..    *
31690 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
316a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
316b0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
316c0 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  pCell);.#ifndef 
316d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
316e0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
316f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31700 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31710 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31720 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
31730 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  EE, iPage, zCont
31740 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
31750 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20  ndif.      d2 = 
31760 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
31770 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c  heck,pgno,pPage,
31780 7a 43 6f 6e 74 65 78 74 2c 30 2c 30 2c 30 2c 30  zContext,0,0,0,0
31790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30  );.      if( i>0
317a0 20 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b   && d2!=depth ){
317b0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
317c0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
317d0 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64  zContext, "Child
317e0 20 70 61 67 65 20 64 65 70 74 68 20 64 69 66 66   page depth diff
317f0 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers");.      }. 
31800 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b       depth = d2;
31810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
31820 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
31830 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
31840 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
31850 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
31860 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 70 72  set+8]);.    spr
31870 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22  intf(zContext, "
31880 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69  On page %d at ri
31890 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50  ght child: ", iP
318a0 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
318b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
318c0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
318d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
318e0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
318f0 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
31900 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
31910 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  age, 0);.    }.#
31920 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
31930 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20  reePage(pCheck, 
31940 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f  pgno, pPage, zCo
31950 6e 74 65 78 74 2c 30 2c 30 2c 30 2c 30 29 3b 0a  ntext,0,0,0,0);.
31960 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b    }. .  /* Check
31970 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f   for complete co
31980 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61  verage of the pa
31990 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d  ge.  */.  data =
319a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
319b0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
319c0 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d  rOffset;.  hit =
319d0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75   sqliteMalloc( u
319e0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
319f0 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65  f( hit ){.    me
31a00 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74  mset(hit, 1, get
31a10 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
31a20 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  5]));.    nCell 
31a30 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
31a40 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65  [hdr+3]);.    ce
31a50 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20  llStart = hdr + 
31a60 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
31a70 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  af;.    for(i=0;
31a80 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
31a90 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67        int pc = g
31aa0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
31ab0 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20  llStart+i*2]);. 
31ac0 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
31ad0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
31ae0 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
31af0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
31b00 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31    if( (pc+size-1
31b10 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
31b20 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   pc<0 ){.       
31b30 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31b40 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
31b50 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
31b60 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
31b70 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
31b80 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
31b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31ba0 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69       for(j=pc+si
31bb0 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d  ze-1; j>=pc; j--
31bc0 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
31bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
31be0 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62  r(cnt=0, i=get2b
31bf0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
31c00 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62  ); i>0 && i<usab
31c10 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30  leSize && cnt<10
31c20 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20  000; .          
31c30 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69   cnt++){.      i
31c40 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
31c50 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a  te(&data[i+2]);.
31c60 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
31c70 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31     if( (i+size-1
31c80 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
31c90 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
31ca0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31cb0 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20  Check, 0,  .    
31cc0 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
31cd0 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
31ce0 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
31cf0 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
31d00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31d10 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a       for(j=i+siz
31d20 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20  e-1; j>=i; j--) 
31d30 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
31d40 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32  }.      i = get2
31d50 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a  byte(&data[i]);.
31d60 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
31d70 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53  cnt=0; i<usableS
31d80 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ize; i++){.     
31d90 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29   if( hit[i]==0 )
31da0 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b  {.        cnt++;
31db0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
31dc0 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20   hit[i]>1 ){.   
31dd0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
31de0 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20  Msg(pCheck, 0,. 
31df0 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70           "Multip
31e00 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65  le uses for byte
31e10 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c   %d of page %d",
31e20 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20   i, iPage);.    
31e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31e40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
31e50 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37   cnt!=data[hdr+7
31e60 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ] ){.      check
31e70 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31e80 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
31e90 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63  "Fragmented spac
31ea0 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70  e is %d byte rep
31eb0 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70  orted as %d on p
31ec0 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20  age %d",.       
31ed0 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72     cnt, data[hdr
31ee0 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  +7], iPage);.   
31ef0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46   }.  }.  sqliteF
31f00 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c  ree(hit);..  rel
31f10 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31f20 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b  .  return depth+
31f30 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
31f40 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
31f50 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
31f60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31f70 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
31f80 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
31f90 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d  utine does a com
31fa0 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74  plete check of t
31fb0 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66  he given BTree f
31fc0 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73  ile.  aRoot[] is
31fd0 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
31fe0 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65  pages numbers we
31ff0 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d  re each page num
32000 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ber is the root 
32010 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62  page of.** a tab
32020 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68  le.  nRoot is th
32030 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
32040 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a  ies in aRoot..**
32050 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
32060 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68  g checks out, th
32070 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
32080 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d  ns NULL.  If som
32090 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69  ething is.** ami
320a0 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ss, an error mes
320b0 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
320c0 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
320d0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
320e0 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e  ().** and a poin
320f0 74 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f  ter to that erro
32100 72 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74  r message is ret
32110 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c  urned.  The call
32120 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
32130 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
32140 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65  or freeing the e
32150 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
32160 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  n it is done..*/
32170 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74  .char *sqlite3Bt
32180 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
32190 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
321a0 2a 61 52 6f 6f 74 2c 20 69 6e 74 20 6e 52 6f 6f  *aRoot, int nRoo
321b0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
321c0 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67  nt nRef;.  Integ
321d0 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20  rityCk sCheck;. 
321e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
321f0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52 65 66   p->pBt;..  nRef
32200 20 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72   = *sqlite3pager
32210 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61 67  _stats(pBt->pPag
32220 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
32230 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
32240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32250 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
32260 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74  StrDup("Unable t
32270 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
32280 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
32290 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73  abase");.  }.  s
322a0 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b  Check.pBt = pBt;
322b0 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72  .  sCheck.pPager
322c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
322d0 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
322e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
322f0 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70  gecount(sCheck.p
32300 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 73 43  Pager);.  if( sC
32310 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
32320 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
32330 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
32340 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
32350 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
32360 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
32370 77 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65  w( (sCheck.nPage
32380 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
32390 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20  k.anRef[0]) );. 
323a0 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52   if( !sCheck.anR
323b0 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  ef ){.    unlock
323c0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
323d0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t);.    return s
323e0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 55  qlite3MPrintf("U
323f0 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  nable to malloc 
32400 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20  %d bytes", .    
32410 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67      (sCheck.nPag
32420 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
32430 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20  ck.anRef[0]));. 
32440 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
32450 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69  =sCheck.nPage; i
32460 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65  ++){ sCheck.anRe
32470 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20  f[i] = 0; }.  i 
32480 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
32490 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20  AGE(pBt);.  if( 
324a0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
324b0 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e  ){.    sCheck.an
324c0 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Ref[i] = 1;.  }.
324d0 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67    sCheck.zErrMsg
324e0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   = 0;..  /* Chec
324f0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
32500 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  of the freelist.
32510 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74    */.  checkList
32520 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74  (&sCheck, 1, get
32530 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
32540 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a  e1->aData[32]),.
32550 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
32560 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
32570 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22  1->aData[36]), "
32580 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22  Main freelist: "
32590 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61  );..  /* Check a
325a0 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20  ll the tables.. 
325b0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
325c0 3c 6e 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20  <nRoot; i++){.  
325d0 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d    if( aRoot[i]==
325e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  0 ) continue;.#i
325f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32600 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32610 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
32620 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d  cuum && aRoot[i]
32630 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  >1 ){.      chec
32640 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c  kPtrmap(&sCheck,
32650 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41   aRoot[i], PTRMA
32660 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30  P_ROOTPAGE, 0, 0
32670 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
32680 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
32690 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  e(&sCheck, aRoot
326a0 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66  [i], 0, "List of
326b0 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 2c 20   tree roots: ", 
326c0 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20  0,0,0,0);.  }.. 
326d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76   /* Make sure ev
326e0 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
326f0 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63  file is referenc
32700 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ed.  */.  for(i=
32710 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  1; i<=sCheck.nPa
32720 67 65 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66  ge; i++){.#ifdef
32730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32740 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
32750 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
32760 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  =0 ){.      chec
32770 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
32780 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
32790 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
327a0 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  i);.    }.#else.
327b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
327c0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
327d0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b  auto-vacuum, mak
327e0 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73  e sure no tables
327f0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
32800 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f  references to po
32810 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
32820 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32830 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
32840 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
32850 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
32860 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2c 20 69 29  ->usableSize, i)
32870 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
32880 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
32890 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
328a0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
328b0 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
328c0 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
328d0 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
328e0 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
328f0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
32900 47 45 4e 4f 28 70 42 74 2d 3e 75 73 61 62 6c 65  GENO(pBt->usable
32910 53 69 7a 65 2c 20 69 29 3d 3d 69 20 26 26 20 70  Size, i)==i && p
32920 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
32930 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32940 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32950 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70   0, "Pointer map
32960 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65   page %d is refe
32970 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20  renced", i);.   
32980 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
32990 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
329a0 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20  is analysis did 
329b0 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e  not leave any un
329c0 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f  ref() pages.  */
329d0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
329e0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69  Unused(pBt);.  i
329f0 66 28 20 6e 52 65 66 20 21 3d 20 2a 73 71 6c 69  f( nRef != *sqli
32a00 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 70  te3pager_stats(p
32a10 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
32a20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32a30 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20  g(&sCheck, 0, . 
32a40 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e       "Outstandin
32a50 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65  g page count goe
32a60 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20  s from %d to %d 
32a70 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c  during this anal
32a80 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65  ysis",.      nRe
32a90 66 2c 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  f, *sqlite3pager
32aa0 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61 67  _stats(pBt->pPag
32ab0 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
32ac0 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
32ad0 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
32ae0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  ..  */.  sqliteF
32af0 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  ree(sCheck.anRef
32b00 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65  );.  return sChe
32b10 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65  ck.zErrMsg;.}.#e
32b20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32b30 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32b40 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ECK */../*.** Re
32b50 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
32b60 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e  thname of the un
32b70 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
32b80 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
32b90 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
32ba0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42  reeGetFilename(B
32bb0 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
32bc0 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
32bd0 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
32be0 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66  n sqlite3pager_f
32bf0 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  ilename(p->pBt->
32c00 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
32c10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74  * Return the pat
32c20 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72  hname of the dir
32c30 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
32c40 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
32c50 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
32c60 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
32c70 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74  reeGetDirname(Bt
32c80 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
32c90 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
32ca0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
32cb0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69   sqlite3pager_di
32cc0 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  rname(p->pBt->pP
32cd0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
32ce0 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e  Return the pathn
32cf0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
32d00 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73  al file for this
32d10 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 72   database. The r
32d20 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f  eturn.** value o
32d30 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
32d40 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61 72  s the same regar
32d50 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
32d60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32d70 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
32d80 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f  eated or not..*/
32d90 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
32da0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
32db0 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  nalname(Btree *p
32dc0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
32dd0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
32de0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
32df0 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e  e3pager_journaln
32e00 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
32e10 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  er);.}..#ifndef 
32e20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
32e30 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  UM./*.** Copy th
32e40 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
32e50 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e  nt of pBtFrom in
32e60 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61  to pBtTo.  A tra
32e70 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
32e80 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62   be active for b
32e90 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  oth files..**.**
32ea0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c   The size of fil
32eb0 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65  e pBtFrom may be
32ec0 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73   reduced by this
32ed0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
32ee0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
32ef0 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
32f00 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f  action on pBtFro
32f10 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  m is rolled back
32f20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
32f30 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  BtreeCopyFile(Bt
32f40 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
32f50 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
32f60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32f70 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20   Pgno i, nPage, 
32f80 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a  nToPage, iSkip;.
32f90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32fa0 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20  To = pTo->pBt;. 
32fb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72   BtShared *pBtFr
32fc0 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  om = pFrom->pBt;
32fd0 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
32fe0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
32ff0 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
33000 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
33010 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33020 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
33030 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
33040 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53  ursor ) return S
33050 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54  QLITE_BUSY;.  nT
33060 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 70  oPage = sqlite3p
33070 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
33080 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20  BtTo->pPager);. 
33090 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
330a0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
330b0 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
330c0 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
330d0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
330e0 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  tTo);.  for(i=1;
330f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33100 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29  & i<=nPage; i++)
33110 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67  {.    void *pPag
33120 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 53  e;.    if( i==iS
33130 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  kip ) continue;.
33140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33150 70 61 67 65 72 5f 67 65 74 28 70 42 74 46 72 6f  pager_get(pBtFro
33160 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  m->pPager, i, &p
33170 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33180 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  c ) break;.    r
33190 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
331a0 5f 6f 76 65 72 77 72 69 74 65 28 70 42 74 54 6f  _overwrite(pBtTo
331b0 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 70 50 61  ->pPager, i, pPa
331c0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
331d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
331e0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
331f0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  pPage);.  }.  fo
33200 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d  r(i=nPage+1; rc=
33210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
33220 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  =nToPage; i++){.
33230 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b      void *pPage;
33240 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69  .    if( i==iSki
33250 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
33260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
33270 67 65 72 5f 67 65 74 28 70 42 74 54 6f 2d 3e 70  ger_get(pBtTo->p
33280 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65  Pager, i, &pPage
33290 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
332a0 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
332b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
332c0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 73  te(pPage);.    s
332d0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
332e0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71  f(pPage);.    sq
332f0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
33300 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  write(pBtTo->pPa
33310 67 65 72 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 69  ger, i);.  }.  i
33320 66 28 20 21 72 63 20 26 26 20 6e 50 61 67 65 3c  f( !rc && nPage<
33330 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 72  nToPage ){.    r
33340 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
33350 5f 74 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d  _truncate(pBtTo-
33360 3e 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  >pPager, nPage);
33370 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
33380 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
33390 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a  eRollback(pTo);.
333a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
333b0 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53    .}.#endif /* S
333c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
333d0 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  M */../*.** Retu
333e0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
333f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
33400 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
33410 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
33420 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  rans(Btree *p){.
33430 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
33440 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
33450 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a  S_WRITE));.}../*
33460 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
33470 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65  ero if a stateme
33480 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
33490 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
334a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
334b0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
334c0 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42  .  return (p->pB
334d0 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53  t && p->pBt->inS
334e0 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  tmt);.}../*.** T
334f0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
33500 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
33510 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
33520 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
33530 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
33540 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
33550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33560 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
33570 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
33580 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
33590 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
335a0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
335b0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
335c0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
335d0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
335e0 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
335f0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
33600 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
33610 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
33620 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
33630 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
33640 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
33650 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
33660 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
33670 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
33680 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
33690 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
336a0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
336b0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
336c0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
336d0 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
336e0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
336f0 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
33700 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
33710 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
33720 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
33730 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
33740 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
33750 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
33760 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 42  lite3BtreeSync(B
33770 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
33780 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
33790 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
337a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
337b0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
337c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 23 69 66 6e  t = p->pBt;.#ifn
337d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
337e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 50  AUTOVACUUM.    P
337f0 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  gno nTrunc = 0;.
33800 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
33810 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
33820 20 69 6e 74 20 72 63 20 3d 20 61 75 74 6f 56 61   int rc = autoVa
33830 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20  cuumCommit(pBt, 
33840 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20  &nTrunc); .     
33850 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33860 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
33870 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
33880 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
33890 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nc(pBt->pPager, 
338a0 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
338b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
338c0 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  urn sqlite3pager
338d0 5f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  _sync(pBt->pPage
338e0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
338f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
33900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
33910 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
33920 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
33930 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65   to a blob of me
33940 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
33950 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  with.** a single
33960 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54   shared-btree. T
33970 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65  he memory is use
33980 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65  d by client code
33990 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a 2a   for it's own.**
339a0 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65   purposes (for e
339b0 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65  xample, to store
339c0 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63   a high-level sc
339d0 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20  hema associated 
339e0 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61  with .** the sha
339f0 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20  red-btree). The 
33a00 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61  btree layer mana
33a10 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ges reference co
33a20 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a  unting issues..*
33a30 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
33a40 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ime this is call
33a50 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62  ed on a shared-b
33a60 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74  tree, nBytes byt
33a70 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
33a80 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a  are allocated, z
33a90 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72  eroed, and retur
33aa0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
33ab0 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73  r. For each subs
33ac0 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20  equent .** call 
33ad0 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d  the nBytes param
33ae0 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
33af0 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
33b00 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a   the same blob.*
33b10 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75  * of memory retu
33b20 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73  rned. .**.** Jus
33b30 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61  t before the sha
33b40 72 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f  red-btree is clo
33b50 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
33b60 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
33b70 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65  .** xFree argume
33b80 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f  nt when the memo
33b90 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61  ry allocation wa
33ba0 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65  s made is invoke
33bb0 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f  d on the .** blo
33bc0 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d  b of allocated m
33bd0 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63  emory. This func
33be0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
33bf0 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65 65 28  call sqliteFree(
33c00 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d 6f  ).** on the memo
33c10 72 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c 61  ry, the btree la
33c20 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a  yer does that..*
33c30 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  /.void *sqlite3B
33c40 74 72 65 65 53 63 68 65 6d 61 28 42 74 72 65 65  treeSchema(Btree
33c50 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c   *p, int nBytes,
33c60 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76 6f   void(*xFree)(vo
33c70 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61 72  id *)){.  BtShar
33c80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
33c90 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53  ;.  if( !pBt->pS
33ca0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74  chema ){.    pBt
33cb0 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ->pSchema = sqli
33cc0 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29  teMalloc(nBytes)
33cd0 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65  ;.    pBt->xFree
33ce0 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a  Schema = xFree;.
33cf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 74    }.  return pBt
33d00 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a  ->pSchema;.}../*
33d10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
33d20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20  if another user 
33d30 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72  of the same shar
33d40 65 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20  ed btree as the 
33d50 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64  argument.** hand
33d60 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  le holds an excl
33d70 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
33d80 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
33d90 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
33da0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
33db0 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29  Locked(Btree *p)
33dc0 7b 0a 20 20 72 65 74 75 72 6e 20 28 71 75 65 72  {.  return (quer
33dd0 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  yTableLock(p, MA
33de0 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
33df0 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)!=SQLITE_OK
33e00 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  );.}..int sqlite
33e10 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28  3BtreeLockTable(
33e20 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
33e30 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f  ab, u8 isWriteLo
33e40 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
33e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 6e 64  SQLITE_OK;.#ifnd
33e60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
33e70 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 75 38  HARED_CACHE.  u8
33e80 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57   lockType = (isW
33e90 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c  riteLock?WRITE_L
33ea0 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OCK:READ_LOCK);.
33eb0 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c    rc = queryTabl
33ec0 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c  eLock(p, iTab, l
33ed0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20  ockType);.  if( 
33ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33ef0 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61  .    rc = lockTa
33f00 62 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ble(p, iTab, loc
33f10 6b 54 79 70 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  kType);.  }.#end
33f20 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
33f30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
33f40 6c 6f 77 69 6e 67 20 64 65 62 75 67 67 69 6e 67  lowing debugging
33f50 20 69 6e 74 65 72 66 61 63 65 20 68 61 73 20 74   interface has t
33f60 6f 20 62 65 20 69 6e 20 74 68 69 73 20 66 69 6c  o be in this fil
33f70 65 20 28 72 61 74 68 65 72 0a 2a 2a 20 74 68 61  e (rather.** tha
33f80 6e 20 69 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  n in, for exampl
33f90 65 2c 20 74 65 73 74 31 2e 63 29 20 73 6f 20 74  e, test1.c) so t
33fa0 68 61 74 20 69 74 20 63 61 6e 20 67 65 74 20 61  hat it can get a
33fb0 63 63 65 73 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ccess to.** the 
33fc0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 42 74  definition of Bt
33fd0 53 68 61 72 65 64 2e 0a 2a 2f 0a 23 69 66 20 64  Shared..*/.#if d
33fe0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
33ff0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
34000 54 43 4c 53 48 29 0a 23 69 6e 63 6c 75 64 65 20  TCLSH).#include 
34010 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c 69  <tcl.h>.int sqli
34020 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
34030 5f 72 65 70 6f 72 74 28 0a 20 20 76 6f 69 64 20  _report(.  void 
34040 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
34050 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34060 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
34070 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
34080 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
34090 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  st ThreadData *p
340a0 54 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  Td = sqlite3Thre
340b0 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
340c0 3b 0a 20 20 69 66 28 20 70 54 64 2d 3e 75 73 65  ;.  if( pTd->use
340d0 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20  SharedData ){.  
340e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
340f0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
34100 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
34110 29 3b 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70  );.    for(pBt=p
34120 54 64 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b  Td->pBtree; pBt;
34130 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
34140 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
34150 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  ar *zFile = sqli
34160 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d  te3pager_filenam
34170 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
34180 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
34190 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
341a0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
341b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 46  _NewStringObj(zF
341c0 69 6c 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  ile, -1));.     
341d0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
341e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
341f0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
34200 6e 74 4f 62 6a 28 70 42 74 2d 3e 6e 52 65 66 29  ntObj(pBt->nRef)
34210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
34220 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
34230 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
34240 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
34250 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.