System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c5d4248cdec0b9e54300a45f15bde890fdfdf0c6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 32 33 20 32 30 30 36 2f 30 36  c,v 1.23 2006/06
0190: 2f 30 38 20 30 34 3a 31 39 3a 35 31 20 72 6d 73  /08 04:19:51 rms
01a0: 69 6d 70 73 6f 6e 20 45 78 70 20 24 0a 2a 2a 0a  impson Exp $.**.
01b0: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70  ** This file imp
01c0: 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e  lements a extern
01d0: 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20  al (disk-based) 
01e0: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 42  database using B
01f0: 54 72 65 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 20  Trees..** For a 
0200: 64 65 74 61 69 6c 65 64 20 64 69 73 63 75 73 73  detailed discuss
0210: 69 6f 6e 20 6f 66 20 42 54 72 65 65 73 2c 20 72  ion of BTrees, r
0220: 65 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20  efer to.**.**   
0230: 20 20 44 6f 6e 61 6c 64 20 45 2e 20 4b 6e 75 74    Donald E. Knut
0240: 68 2c 20 54 48 45 20 41 52 54 20 4f 46 20 43 4f  h, THE ART OF CO
0250: 4d 50 55 54 45 52 20 50 52 4f 47 52 41 4d 4d 49  MPUTER PROGRAMMI
0260: 4e 47 2c 20 56 6f 6c 75 6d 65 20 33 3a 0a 2a 2a  NG, Volume 3:.**
0270: 20 20 20 20 20 22 53 6f 72 74 69 6e 67 20 41 6e       "Sorting An
0280: 64 20 53 65 61 72 63 68 69 6e 67 22 2c 20 70 61  d Searching", pa
0290: 67 65 73 20 34 37 33 2d 34 38 30 2e 20 41 64 64  ges 473-480. Add
02a0: 69 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a 2a 20 20  ison-Wesley.**  
02b0: 20 20 20 50 75 62 6c 69 73 68 69 6e 67 20 43 6f     Publishing Co
02c0: 6d 70 61 6e 79 2c 20 52 65 61 64 69 6e 67 2c 20  mpany, Reading, 
02d0: 4d 61 73 73 61 63 68 75 73 65 74 74 73 2e 0a 2a  Massachusetts..*
02e0: 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
02f0: 64 65 61 20 69 73 20 74 68 61 74 20 65 61 63 68  dea is that each
0300: 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
0310: 65 20 63 6f 6e 74 61 69 6e 73 20 4e 20 64 61 74  e contains N dat
0320: 61 62 61 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  abase.** entries
0330: 20 61 6e 64 20 4e 2b 31 20 70 6f 69 6e 74 65 72   and N+1 pointer
0340: 73 20 74 6f 20 73 75 62 70 61 67 65 73 2e 0a 2a  s to subpages..*
0350: 2a 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.**   ---------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 7c 20 20  -------.**   |  
03a0: 50 74 72 28 30 29 20 7c 20 4b 65 79 28 30 29 20  Ptr(0) | Key(0) 
03b0: 7c 20 50 74 72 28 31 29 20 7c 20 4b 65 79 28 31  | Ptr(1) | Key(1
03c0: 29 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79 28 4e 29  ) | ... | Key(N)
03d0: 20 7c 20 50 74 72 28 4e 2b 31 29 20 7c 0a 2a 2a   | Ptr(N+1) |.**
03e0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  ---.**.** All of
0430: 20 74 68 65 20 6b 65 79 73 20 6f 6e 20 74 68 65   the keys on the
0440: 20 70 61 67 65 20 74 68 61 74 20 50 74 72 28 30   page that Ptr(0
0450: 29 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 76 65  ) points to have
0460: 20 76 61 6c 75 65 73 20 6c 65 73 73 0a 2a 2a 20   values less.** 
0470: 74 68 61 6e 20 4b 65 79 28 30 29 2e 20 20 41 6c  than Key(0).  Al
0480: 6c 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e  l of the keys on
0490: 20 70 61 67 65 20 50 74 72 28 31 29 20 61 6e 64   page Ptr(1) and
04a0: 20 69 74 73 20 73 75 62 70 61 67 65 73 20 68 61   its subpages ha
04b0: 76 65 0a 2a 2a 20 76 61 6c 75 65 73 20 67 72 65  ve.** values gre
04c0: 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28 30 29  ater than Key(0)
04d0: 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 4b   and less than K
04e0: 65 79 28 31 29 2e 20 20 41 6c 6c 20 6f 66 20 74  ey(1).  All of t
04f0: 68 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e 20 50 74  he keys.** on Pt
0500: 72 28 4e 2b 31 29 20 61 6e 64 20 69 74 73 20 73  r(N+1) and its s
0510: 75 62 70 61 67 65 73 20 68 61 76 65 20 76 61 6c  ubpages have val
0520: 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ues greater than
0530: 20 4b 65 79 28 4e 29 2e 20 20 41 6e 64 0a 2a 2a   Key(N).  And.**
0540: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
0550: 20 46 69 6e 64 69 6e 67 20 61 20 70 61 72 74 69   Finding a parti
0560: 63 75 6c 61 72 20 6b 65 79 20 72 65 71 75 69 72  cular key requir
0570: 65 73 20 72 65 61 64 69 6e 67 20 4f 28 6c 6f 67  es reading O(log
0580: 28 4d 29 29 20 70 61 67 65 73 20 66 72 6f 6d 20  (M)) pages from 
0590: 74 68 65 20 0a 2a 2a 20 64 69 73 6b 20 77 68 65  the .** disk whe
05a0: 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62  re M is the numb
05b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
05c0: 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
05d0: 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65   In this impleme
05e0: 6e 74 61 74 69 6f 6e 2c 20 61 20 73 69 6e 67 6c  ntation, a singl
05f0: 65 20 66 69 6c 65 20 63 61 6e 20 68 6f 6c 64 20  e file can hold 
0600: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  one or more sepa
0610: 72 61 74 65 20 0a 2a 2a 20 42 54 72 65 65 73 2e  rate .** BTrees.
0620: 20 20 45 61 63 68 20 42 54 72 65 65 20 69 73 20    Each BTree is 
0630: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
0640: 65 20 69 6e 64 65 78 20 6f 66 20 69 74 73 20 72  e index of its r
0650: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 0a 2a  oot page.  The.*
0660: 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 66  * key and data f
0670: 6f 72 20 61 6e 79 20 65 6e 74 72 79 20 61 72 65  or any entry are
0680: 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72   combined to for
0690: 6d 20 74 68 65 20 22 70 61 79 6c 6f 61 64 22 2e  m the "payload".
06a0: 20 20 41 0a 2a 2a 20 66 69 78 65 64 20 61 6d 6f    A.** fixed amo
06b0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 63  unt of payload c
06c0: 61 6e 20 62 65 20 63 61 72 72 69 65 64 20 64 69  an be carried di
06d0: 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 64 61  rectly on the da
06e0: 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 2e 20  tabase.** page. 
06f0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
0700: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
0710: 68 65 20 70 72 65 73 65 74 20 61 6d 6f 75 6e 74  he preset amount
0720: 20 74 68 65 6e 20 73 75 72 70 6c 75 73 0a 2a 2a   then surplus.**
0730: 20 62 79 74 65 73 20 61 72 65 20 73 74 6f 72 65   bytes are store
0740: 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  d on overflow pa
0750: 67 65 73 2e 20 20 54 68 65 20 70 61 79 6c 6f 61  ges.  The payloa
0760: 64 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 0a 2a  d for an entry.*
0770: 2a 20 61 6e 64 20 74 68 65 20 70 72 65 63 65 64  * and the preced
0780: 69 6e 67 20 70 6f 69 6e 74 65 72 20 61 72 65 20  ing pointer are 
0790: 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66 6f 72 6d  combined to form
07a0: 20 61 20 22 43 65 6c 6c 22 2e 20 20 45 61 63 68   a "Cell".  Each
07b0: 20 0a 2a 2a 20 70 61 67 65 20 68 61 73 20 61 20   .** page has a 
07c0: 73 6d 61 6c 6c 20 68 65 61 64 65 72 20 77 68 69  small header whi
07d0: 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ch contains the 
07e0: 50 74 72 28 4e 2b 31 29 20 70 6f 69 6e 74 65 72  Ptr(N+1) pointer
07f0: 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 69 6e   and other.** in
0800: 66 6f 72 6d 61 74 69 6f 6e 20 73 75 63 68 20 61  formation such a
0810: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6b 65  s the size of ke
0820: 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a  y and data..**.*
0830: 2a 20 46 4f 52 4d 41 54 20 44 45 54 41 49 4c 53  * FORMAT DETAILS
0840: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
0850: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
0860: 70 61 67 65 73 2e 20 20 54 68 65 20 66 69 72 73  pages.  The firs
0870: 74 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65 64  t page is called
0880: 20 70 61 67 65 20 31 2c 0a 2a 2a 20 74 68 65 20   page 1,.** the 
0890: 73 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20 32  second is page 2
08a0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
08b0: 20 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   A page number o
08c0: 66 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65 73  f zero indicates
08d0: 0a 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61 67  .** "no such pag
08e0: 65 22 2e 20 20 54 68 65 20 70 61 67 65 20 73 69  e".  The page si
08f0: 7a 65 20 63 61 6e 20 62 65 20 61 6e 79 74 68 69  ze can be anythi
0900: 6e 67 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  ng between 512 a
0910: 6e 64 20 36 35 35 33 36 2e 0a 2a 2a 20 45 61 63  nd 65536..** Eac
0920: 68 20 70 61 67 65 20 63 61 6e 20 62 65 20 65 69  h page can be ei
0930: 74 68 65 72 20 61 20 62 74 72 65 65 20 70 61 67  ther a btree pag
0940: 65 2c 20 61 20 66 72 65 65 6c 69 73 74 20 70 61  e, a freelist pa
0950: 67 65 20 6f 72 20 61 6e 20 6f 76 65 72 66 6c 6f  ge or an overflo
0960: 77 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  w.** page..**.**
0970: 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20   The first page 
0980: 69 73 20 61 6c 77 61 79 73 20 61 20 62 74 72 65  is always a btre
0990: 65 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  e page.  The fir
09a0: 73 74 20 31 30 30 20 62 79 74 65 73 20 6f 66 20  st 100 bytes of 
09b0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61 67  the first.** pag
09c0: 65 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63  e contain a spec
09d0: 69 61 6c 20 68 65 61 64 65 72 20 28 74 68 65 20  ial header (the 
09e0: 22 66 69 6c 65 20 68 65 61 64 65 72 22 29 20 74  "file header") t
09f0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
0a00: 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 66  e file..** The f
0a10: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 66 69 6c  ormat of the fil
0a20: 65 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  e header is as f
0a30: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
0a40: 4f 46 46 53 45 54 20 20 20 53 49 5a 45 20 20 20  OFFSET   SIZE   
0a50: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
0a60: 20 20 20 20 20 30 20 20 20 20 20 20 31 36 20 20       0      16  
0a70: 20 20 20 48 65 61 64 65 72 20 73 74 72 69 6e 67     Header string
0a80: 3a 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74  : "SQLite format
0a90: 20 33 5c 30 30 30 22 0a 2a 2a 20 20 20 20 20 31   3\000".**     1
0aa0: 36 20 20 20 20 20 20 20 32 20 20 20 20 20 50 61  6       2     Pa
0ab0: 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ge size in bytes
0ac0: 2e 20 20 0a 2a 2a 20 20 20 20 20 31 38 20 20 20  .  .**     18   
0ad0: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0ae0: 6f 72 6d 61 74 20 77 72 69 74 65 20 76 65 72 73  ormat write vers
0af0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 31 39 20 20 20  ion.**     19   
0b00: 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20 66      1     File f
0b10: 6f 72 6d 61 74 20 72 65 61 64 20 76 65 72 73 69  ormat read versi
0b20: 6f 6e 0a 2a 2a 20 20 20 20 20 32 30 20 20 20 20  on.**     20    
0b30: 20 20 20 31 20 20 20 20 20 42 79 74 65 73 20 6f     1     Bytes o
0b40: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  f unused space a
0b50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
0b60: 68 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 32 31  h page.**     21
0b70: 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 61 78         1     Max
0b80: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
0b90: 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  d fraction.**   
0ba0: 20 20 32 32 20 20 20 20 20 20 20 31 20 20 20 20    22       1    
0bb0: 20 4d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   Min embedded pa
0bc0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0bd0: 2a 20 20 20 20 20 32 33 20 20 20 20 20 20 20 31  *     23       1
0be0: 20 20 20 20 20 4d 69 6e 20 6c 65 61 66 20 70 61       Min leaf pa
0bf0: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
0c00: 2a 20 20 20 20 20 32 34 20 20 20 20 20 20 20 34  *     24       4
0c10: 20 20 20 20 20 46 69 6c 65 20 63 68 61 6e 67 65       File change
0c20: 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 20 20 20 20   counter.**     
0c30: 32 38 20 20 20 20 20 20 20 34 20 20 20 20 20 52  28       4     R
0c40: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
0c50: 72 65 20 75 73 65 0a 2a 2a 20 20 20 20 20 33 32  re use.**     32
0c60: 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69 72         4     Fir
0c70: 73 74 20 66 72 65 65 6c 69 73 74 20 70 61 67 65  st freelist page
0c80: 0a 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20 20  .**     36      
0c90: 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66   4     Number of
0ca0: 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 20   freelist pages 
0cb0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
0cc0: 20 20 20 34 30 20 20 20 20 20 20 36 30 20 20 20     40      60   
0cd0: 20 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74 61    15 4-byte meta
0ce0: 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20 74   values passed t
0cf0: 6f 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 0a  o higher layers.
0d00: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
0d10: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
0d20: 61 72 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 28  are big-endian (
0d30: 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
0d40: 20 62 79 74 65 20 66 69 72 73 74 29 2e 0a 2a 2a   byte first)..**
0d50: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 63 68 61  .** The file cha
0d60: 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 69  nge counter is i
0d70: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20  ncremented when 
0d80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
0d90: 63 68 61 6e 67 65 64 20 6d 6f 72 65 0a 2a 2a 20  changed more.** 
0da0: 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
0db0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e 64   the same second
0dc0: 2e 20 20 54 68 69 73 20 63 6f 75 6e 74 65 72 2c  .  This counter,
0dd0: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
0de0: 68 65 0a 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  he.** modificati
0df0: 6f 6e 20 74 69 6d 65 20 6f 66 20 74 68 65 20 66  on time of the f
0e00: 69 6c 65 2c 20 61 6c 6c 6f 77 73 20 6f 74 68 65  ile, allows othe
0e10: 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 6b  r processes to k
0e20: 6e 6f 77 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  now.** when the 
0e30: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
0e40: 20 61 6e 64 20 74 68 75 73 20 77 68 65 6e 20 74   and thus when t
0e50: 68 65 79 20 6e 65 65 64 20 74 6f 20 66 6c 75 73  hey need to flus
0e60: 68 20 74 68 65 69 72 0a 2a 2a 20 63 61 63 68 65  h their.** cache
0e70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 20  ..**.** The max 
0e80: 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
0e90: 20 66 72 61 63 74 69 6f 6e 20 69 73 20 74 68 65   fraction is the
0ea0: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74   amount of the t
0eb0: 6f 74 61 6c 20 75 73 61 62 6c 65 0a 2a 2a 20 73  otal usable.** s
0ec0: 70 61 63 65 20 69 6e 20 61 20 70 61 67 65 20 74  pace in a page t
0ed0: 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 73 75  hat can be consu
0ee0: 6d 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20  med by a single 
0ef0: 63 65 6c 6c 20 66 6f 72 20 73 74 61 6e 64 61 72  cell for standar
0f00: 64 0a 2a 2a 20 42 2d 74 72 65 65 20 28 6e 6f 6e  d.** B-tree (non
0f10: 2d 4c 45 41 46 44 41 54 41 29 20 74 61 62 6c 65  -LEAFDATA) table
0f20: 73 2e 20 20 41 20 76 61 6c 75 65 20 6f 66 20 32  s.  A value of 2
0f30: 35 35 20 6d 65 61 6e 73 20 31 30 30 25 2e 20 20  55 means 100%.  
0f40: 54 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 69  The default.** i
0f50: 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6d  s to limit the m
0f60: 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  aximum cell size
0f70: 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
0f80: 74 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66  t 4 cells will f
0f90: 69 74 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67  it.** on one pag
0fa0: 65 2e 20 20 54 68 75 73 20 74 68 65 20 64 65 66  e.  Thus the def
0fb0: 61 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64 65  ault max embedde
0fc0: 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  d payload fracti
0fd0: 6f 6e 20 69 73 20 36 34 2e 0a 2a 2a 0a 2a 2a 20  on is 64..**.** 
0fe0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66  If the payload f
0ff0: 6f 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61 72  or a cell is lar
1000: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ger than the max
1010: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20 65   payload, then e
1020: 78 74 72 61 0a 2a 2a 20 70 61 79 6c 6f 61 64 20  xtra.** payload 
1030: 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 6f 76  is spilled to ov
1040: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 4f  erflow pages.  O
1050: 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
1060: 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
1070: 64 2c 0a 2a 2a 20 61 73 20 6d 61 6e 79 20 62 79  d,.** as many by
1080: 74 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  tes as possible 
1090: 61 72 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74  are moved into t
10a0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
10b0: 73 20 77 69 74 68 6f 75 74 20 6c 65 74 74 69 6e  s without lettin
10c0: 67 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 73 69  g.** the cell si
10d0: 7a 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 74 68  ze drop below th
10e0: 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70  e min embedded p
10f0: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 2e  ayload fraction.
1100: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 20 6c  .**.** The min l
1110: 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
1120: 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 74 68 65  tion is like the
1130: 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70 61   min embedded pa
1140: 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a  yload fraction.*
1150: 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  * except that it
1160: 20 61 70 70 6c 69 65 73 20 74 6f 20 6c 65 61 66   applies to leaf
1170: 20 6e 6f 64 65 73 20 69 6e 20 61 20 4c 45 41 46   nodes in a LEAF
1180: 44 41 54 41 20 74 72 65 65 2e 20 20 54 68 65 20  DATA tree.  The 
1190: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 70 61 79 6c 6f  maximum.** paylo
11a0: 61 64 20 66 72 61 63 74 69 6f 6e 20 66 6f 72 20  ad fraction for 
11b0: 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
11c0: 69 73 20 61 6c 77 61 79 73 20 31 30 30 25 20 28  is always 100% (
11d0: 6f 72 20 32 35 35 29 20 61 6e 64 20 69 74 0a 2a  or 255) and it.*
11e0: 2a 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  * not specified 
11f0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1200: 2a 0a 2a 2a 20 45 61 63 68 20 62 74 72 65 65 20  *.** Each btree 
1210: 70 61 67 65 73 20 69 73 20 64 69 76 69 64 65 64  pages is divided
1220: 20 69 6e 74 6f 20 74 68 72 65 65 20 73 65 63 74   into three sect
1230: 69 6f 6e 73 3a 20 20 54 68 65 20 68 65 61 64 65  ions:  The heade
1240: 72 2c 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 20 70  r, the.** cell p
1250: 6f 69 6e 74 65 72 20 61 72 72 61 79 2c 20 61 6e  ointer array, an
1260: 64 20 74 68 65 20 63 65 6c 6c 20 61 72 65 61 20  d the cell area 
1270: 61 72 65 61 2e 20 20 50 61 67 65 20 31 20 61 6c  area.  Page 1 al
1280: 73 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79 74  so has a 100-byt
1290: 65 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72  e.** file header
12a0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 62 65 66   that occurs bef
12b0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 68 65 61  ore the page hea
12c0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  der..**.**      
12d0: 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |---------------
12e0: 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 66 69 6c  -|.**      | fil
12f0: 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20 20  e header    |   
1300: 31 30 30 20 62 79 74 65 73 2e 20 20 50 61 67 65  100 bytes.  Page
1310: 20 31 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 20   1 only..**     
1320: 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   |--------------
1330: 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 70 61  --|.**      | pa
1340: 67 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20  ge header    |  
1350: 20 38 20 62 79 74 65 73 20 66 6f 72 20 6c 65 61   8 bytes for lea
1360: 76 65 73 2e 20 20 31 32 20 62 79 74 65 73 20 66  ves.  12 bytes f
1370: 6f 72 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  or interior node
1380: 73 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d  s.**      |-----
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20  -----------|.** 
13a0: 20 20 20 20 20 7c 20 63 65 6c 6c 20 70 6f 69 6e       | cell poin
13b0: 74 65 72 20 20 20 7c 20 20 20 7c 20 20 32 20 62  ter   |   |  2 b
13c0: 79 74 65 73 20 70 65 72 20 63 65 6c 6c 2e 20 20  ytes per cell.  
13d0: 53 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2a  Sorted order..**
13e0: 20 20 20 20 20 20 7c 20 61 72 72 61 79 20 20 20        | array   
13f0: 20 20 20 20 20 20 20 7c 20 20 20 7c 20 20 47 72         |   |  Gr
1400: 6f 77 73 20 64 6f 77 6e 77 61 72 64 0a 2a 2a 20  ows downward.** 
1410: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1420: 20 20 20 20 20 20 7c 20 20 20 76 0a 2a 2a 20 20        |   v.**  
1430: 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      |-----------
1440: 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c  -----|.**      |
1450: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 20 20 20   unallocated    
1460: 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 73 70 61 63  |.**      | spac
1470: 65 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20  e          |.** 
1480: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
1490: 2d 2d 2d 2d 2d 2d 7c 20 20 20 5e 20 20 47 72 6f  ------|   ^  Gro
14a0: 77 73 20 75 70 77 61 72 64 73 0a 2a 2a 20 20 20  ws upwards.**   
14b0: 20 20 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65 6e     | cell conten
14c0: 74 20 20 20 7c 20 20 20 7c 20 20 41 72 62 69 74  t   |   |  Arbit
14d0: 72 61 72 79 20 6f 72 64 65 72 20 69 6e 74 65 72  rary order inter
14e0: 73 70 65 72 73 65 64 20 77 69 74 68 20 66 72 65  spersed with fre
14f0: 65 62 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 20  eblocks..**     
1500: 20 7c 20 61 72 65 61 20 20 20 20 20 20 20 20 20   | area         
1510: 20 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72 65    |   |  and fre
1520: 65 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e 74  e space fragment
1530: 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  s..**      |----
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
1550: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 68 65 61  .** The page hea
1560: 64 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  ders looks like 
1570: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 46  this:.**.**   OF
1580: 46 53 45 54 20 20 20 53 49 5a 45 20 20 20 20 20  FSET   SIZE     
1590: 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20  DESCRIPTION.**  
15a0: 20 20 20 20 30 20 20 20 20 20 20 20 31 20 20 20      0       1   
15b0: 20 20 20 46 6c 61 67 73 2e 20 31 3a 20 69 6e 74     Flags. 1: int
15c0: 6b 65 79 2c 20 32 3a 20 7a 65 72 6f 64 61 74 61  key, 2: zerodata
15d0: 2c 20 34 3a 20 6c 65 61 66 64 61 74 61 2c 20 38  , 4: leafdata, 8
15e0: 3a 20 6c 65 61 66 0a 2a 2a 20 20 20 20 20 20 31  : leaf.**      1
15f0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 62 79         2      by
1600: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  te offset to the
1610: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
1620: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
1630: 20 32 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f   2      number o
1640: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73 20  f cells on this 
1650: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 35 20 20  page.**      5  
1660: 20 20 20 20 20 32 20 20 20 20 20 20 66 69 72 73       2      firs
1670: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
1680: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  ll content area.
1690: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
16a0: 31 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66  1      number of
16b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 66 72 65 65   fragmented free
16c0: 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 38   bytes.**      8
16d0: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 52 69         4      Ri
16e0: 67 68 74 20 63 68 69 6c 64 20 28 74 68 65 20 50  ght child (the P
16f0: 74 72 28 4e 2b 31 29 20 76 61 6c 75 65 29 2e 20  tr(N+1) value). 
1700: 20 4f 6d 69 74 74 65 64 20 6f 6e 20 6c 65 61 76   Omitted on leav
1710: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  es..**.** The fl
1720: 61 67 73 20 64 65 66 69 6e 65 20 74 68 65 20 66  ags define the f
1730: 6f 72 6d 61 74 20 6f 66 20 74 68 69 73 20 62 74  ormat of this bt
1740: 72 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 6c  ree page.  The l
1750: 65 61 66 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  eaf flag means t
1760: 68 61 74 0a 2a 2a 20 74 68 69 73 20 70 61 67 65  hat.** this page
1770: 20 68 61 73 20 6e 6f 20 63 68 69 6c 64 72 65 6e   has no children
1780: 2e 20 20 54 68 65 20 7a 65 72 6f 64 61 74 61 20  .  The zerodata 
1790: 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
17a0: 74 68 69 73 20 70 61 67 65 20 63 61 72 72 69 65  this page carrie
17b0: 73 0a 2a 2a 20 6f 6e 6c 79 20 6b 65 79 73 20 61  s.** only keys a
17c0: 6e 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65  nd no data.  The
17d0: 20 69 6e 74 6b 65 79 20 66 6c 61 67 20 6d 65 61   intkey flag mea
17e0: 6e 73 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  ns that the key 
17f0: 69 73 20 61 20 69 6e 74 65 67 65 72 0a 2a 2a 20  is a integer.** 
1800: 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
1810: 69 6e 20 74 68 65 20 6b 65 79 20 73 69 7a 65 20  in the key size 
1820: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 63 65 6c  entry of the cel
1830: 6c 20 68 65 61 64 65 72 20 72 61 74 68 65 72 20  l header rather 
1840: 74 68 61 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 70  than in.** the p
1850: 61 79 6c 6f 61 64 20 61 72 65 61 2e 0a 2a 2a 0a  ayload area..**.
1860: 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e  ** The cell poin
1870: 74 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73  ter array begins
1880: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79   on the first by
1890: 74 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67  te after the pag
18a0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 65  e header..** The
18b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
18c0: 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  ray contains zer
18d0: 6f 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 65  o or more 2-byte
18e0: 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
18f0: 72 65 0a 2a 2a 20 6f 66 66 73 65 74 73 20 66 72  re.** offsets fr
1900: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
1910: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
1920: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1930: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
1940: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
1950: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73  he cell pointers
1960: 20 6f 63 63 75 72 20 69 6e 20 73 6f 72 74 65 64   occur in sorted
1970: 20 6f 72 64 65 72 2e 20 20 54 68 65 20 73 79 73   order.  The sys
1980: 74 65 6d 20 73 74 72 69 76 65 73 0a 2a 2a 20 74  tem strives.** t
1990: 6f 20 6b 65 65 70 20 66 72 65 65 20 73 70 61 63  o keep free spac
19a0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
19b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 73 6f   cell pointer so
19c0: 20 74 68 61 74 20 6e 65 77 20 63 65 6c 6c 73 20   that new cells 
19d0: 63 61 6e 0a 2a 2a 20 62 65 20 65 61 73 69 6c 79  can.** be easily
19e0: 20 61 64 64 65 64 20 77 69 74 68 6f 75 74 20 68   added without h
19f0: 61 76 69 6e 67 20 74 6f 20 64 65 66 72 61 67 6d  aving to defragm
1a00: 65 6e 74 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ent the page..**
1a10: 0a 2a 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74  .** Cell content
1a20: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
1a30: 65 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68  e very end of th
1a40: 65 20 70 61 67 65 20 61 6e 64 20 67 72 6f 77 73  e page and grows
1a50: 20 74 6f 77 61 72 64 20 74 68 65 0a 2a 2a 20 62   toward the.** b
1a60: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1a70: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 55 6e 75 73  page..**.** Unus
1a80: 65 64 20 73 70 61 63 65 20 77 69 74 68 69 6e 20  ed space within 
1a90: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
1aa0: 20 61 72 65 61 20 69 73 20 63 6f 6c 6c 65 63 74   area is collect
1ab0: 65 64 20 69 6e 74 6f 20 61 20 6c 69 6e 6b 65 64  ed into a linked
1ac0: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 66 72 65 65   list of.** free
1ad0: 62 6c 6f 63 6b 73 2e 20 20 45 61 63 68 20 66 72  blocks.  Each fr
1ae0: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 6c 65  eeblock is at le
1af0: 61 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73  ast 4 bytes in s
1b00: 69 7a 65 2e 20 20 54 68 65 20 62 79 74 65 20 6f  ize.  The byte o
1b10: 66 66 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  ffset.** to the 
1b20: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
1b30: 69 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  is given in the 
1b40: 68 65 61 64 65 72 2e 20 20 46 72 65 65 62 6c 6f  header.  Freeblo
1b50: 63 6b 73 20 6f 63 63 75 72 20 69 6e 0a 2a 2a 20  cks occur in.** 
1b60: 69 6e 63 72 65 61 73 69 6e 67 20 6f 72 64 65 72  increasing order
1b70: 2e 20 20 42 65 63 61 75 73 65 20 61 20 66 72 65  .  Because a fre
1b80: 65 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61  eblock must be a
1b90: 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
1ba0: 69 6e 20 73 69 7a 65 2c 0a 2a 2a 20 61 6e 79 20  in size,.** any 
1bb0: 67 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65  group of 3 or fe
1bc0: 77 65 72 20 75 6e 75 73 65 64 20 62 79 74 65 73  wer unused bytes
1bd0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   in the cell con
1be0: 74 65 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74  tent area cannot
1bf0: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
1c00: 20 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e   freeblock chain
1c10: 2e 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20  .  A group of 3 
1c20: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79  or fewer free by
1c30: 74 65 73 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tes is called.**
1c40: 20 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68   a fragment.  Th
1c50: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1c60: 66 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66  f bytes in all f
1c70: 72 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f  ragments is reco
1c80: 72 64 65 64 2e 0a 2a 2a 20 69 6e 20 74 68 65 20  rded..** in the 
1c90: 70 61 67 65 20 68 65 61 64 65 72 20 61 74 20 6f  page header at o
1ca0: 66 66 73 65 74 20 37 2e 0a 2a 2a 0a 2a 2a 20 20  ffset 7..**.**  
1cb0: 20 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49    SIZE    DESCRI
1cc0: 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 32 20  PTION.**      2 
1cd0: 20 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20      Byte offset 
1ce0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
1cf0: 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 20 32 20  block.**      2 
1d00: 20 20 20 20 42 79 74 65 73 20 69 6e 20 74 68 69      Bytes in thi
1d10: 73 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a  s freeblock.**.*
1d20: 2a 20 43 65 6c 6c 73 20 61 72 65 20 6f 66 20 76  * Cells are of v
1d30: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 2e 20  ariable length. 
1d40: 20 43 65 6c 6c 73 20 61 72 65 20 73 74 6f 72 65   Cells are store
1d50: 64 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f  d in the cell co
1d60: 6e 74 65 6e 74 20 61 72 65 61 20 61 74 0a 2a 2a  ntent area at.**
1d70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d80: 70 61 67 65 2e 20 20 50 6f 69 6e 74 65 72 73 20  page.  Pointers 
1d90: 74 6f 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  to the cells are
1da0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   in the cell poi
1db0: 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 74 68  nter array.** th
1dc0: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
1dd0: 6f 6c 6c 6f 77 73 20 74 68 65 20 70 61 67 65 20  ollows the page 
1de0: 68 65 61 64 65 72 2e 20 20 43 65 6c 6c 73 20 69  header.  Cells i
1df0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1e00: 79 0a 2a 2a 20 63 6f 6e 74 69 67 75 6f 75 73 20  y.** contiguous 
1e10: 6f 72 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74  or in order, but
1e20: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
1e30: 72 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 6e  re contiguous an
1e40: 64 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a  d in order..**.*
1e50: 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d  * Cell content m
1e60: 61 6b 65 73 20 75 73 65 20 6f 66 20 76 61 72 69  akes use of vari
1e70: 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
1e80: 67 65 72 73 2e 20 20 41 20 76 61 72 69 61 62 6c  gers.  A variabl
1e90: 65 0a 2a 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65  e.** length inte
1ea0: 67 65 72 20 69 73 20 31 20 74 6f 20 39 20 62 79  ger is 1 to 9 by
1eb0: 74 65 73 20 77 68 65 72 65 20 74 68 65 20 6c 6f  tes where the lo
1ec0: 77 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61  wer 7 bits of ea
1ed0: 63 68 20 0a 2a 2a 20 62 79 74 65 20 61 72 65 20  ch .** byte are 
1ee0: 75 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67  used.  The integ
1ef0: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1f00: 6c 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61  ll bytes that ha
1f10: 76 65 20 62 69 74 20 38 20 73 65 74 20 61 6e 64  ve bit 8 set and
1f20: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
1f30: 74 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c  te with bit 8 cl
1f40: 65 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73  ear.  The most s
1f50: 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20  ignificant byte 
1f60: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
1f70: 2a 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e  * appears first.
1f80: 20 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e    A variable-len
1f90: 67 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20  gth integer may 
1fa0: 6e 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  not be more than
1fb0: 20 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a   9 bytes long..*
1fc0: 2a 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 63  * As a special c
1fd0: 61 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 73  ase, all 8 bytes
1fe0: 20 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 65   of the 9th byte
1ff0: 20 61 72 65 20 75 73 65 64 20 61 73 20 64 61 74   are used as dat
2000: 61 2e 20 20 54 68 69 73 0a 2a 2a 20 61 6c 6c 6f  a.  This.** allo
2010: 77 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ws a 64-bit inte
2020: 67 65 72 20 74 6f 20 62 65 20 65 6e 63 6f 64 65  ger to be encode
2030: 64 20 69 6e 20 39 20 62 79 74 65 73 2e 0a 2a 2a  d in 9 bytes..**
2040: 0a 2a 2a 20 20 20 20 30 78 30 30 20 20 20 20 20  .**    0x00     
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2070: 30 30 30 30 0a 2a 2a 20 20 20 20 30 78 37 66 20  0000.**    0x7f 
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78       becomes  0x
20a0: 30 30 30 30 30 30 37 66 0a 2a 2a 20 20 20 20 30  0000007f.**    0
20b0: 78 38 31 20 30 78 30 30 20 20 20 20 20 20 20 20  x81 0x00        
20c0: 20 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73           becomes
20d0: 20 20 30 78 30 30 30 30 30 30 38 30 0a 2a 2a 20    0x00000080.** 
20e0: 20 20 20 30 78 38 32 20 30 78 30 30 20 20 20 20     0x82 0x00    
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63               bec
2100: 6f 6d 65 73 20 20 30 78 30 30 30 30 30 31 30 30  omes  0x00000100
2110: 0a 2a 2a 20 20 20 20 30 78 38 30 20 30 78 37 66  .**    0x80 0x7f
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30   becomes  0x0000
2140: 30 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 61 20  007f.**    0x8a 
2150: 30 78 39 31 20 30 78 64 31 20 30 78 61 63 20 30  0x91 0xd1 0xac 0
2160: 78 37 38 20 20 62 65 63 6f 6d 65 73 20 20 30 78  x78  becomes  0x
2170: 31 32 33 34 35 36 37 38 0a 2a 2a 20 20 20 20 30  12345678.**    0
2180: 78 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78  x81 0x81 0x81 0x
2190: 38 31 20 30 78 30 31 20 20 62 65 63 6f 6d 65 73  81 0x01  becomes
21a0: 20 20 30 78 31 30 32 30 34 30 38 31 0a 2a 2a 0a    0x10204081.**.
21b0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 6c 65 6e 67  ** Variable leng
21c0: 74 68 20 69 6e 74 65 67 65 72 73 20 61 72 65 20  th integers are 
21d0: 75 73 65 64 20 66 6f 72 20 72 6f 77 69 64 73 20  used for rowids 
21e0: 61 6e 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  and to hold the 
21f0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74  number of.** byt
2200: 65 73 20 6f 66 20 6b 65 79 20 61 6e 64 20 64 61  es of key and da
2210: 74 61 20 69 6e 20 61 20 62 74 72 65 65 20 63 65  ta in a btree ce
2220: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ll..**.** The co
2230: 6e 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20  ntent of a cell 
2240: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
2250: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
2260: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
2270: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
2280: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
2290: 65 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 74 74  eft child. Omitt
22a0: 65 64 20 69 66 20 6c 65 61 66 20 66 6c 61 67 20  ed if leaf flag 
22b0: 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20 20 76  is set..**     v
22c0: 61 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  ar    Number of 
22d0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 4f  bytes of data. O
22e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 7a 65  mitted if the ze
22f0: 72 6f 64 61 74 61 20 66 6c 61 67 20 69 73 20 73  rodata flag is s
2300: 65 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20  et..**     var  
2310: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
2320: 73 20 6f 66 20 6b 65 79 2e 20 4f 72 20 74 68 65  s of key. Or the
2330: 20 6b 65 79 20 69 74 73 65 6c 66 20 69 66 20 69   key itself if i
2340: 6e 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65  ntkey flag is se
2350: 74 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20  t..**      *    
2360: 20 50 61 79 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   Payload.**     
2370: 20 34 20 20 20 20 20 46 69 72 73 74 20 70 61 67   4     First pag
2380: 65 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  e of the overflo
2390: 77 20 63 68 61 69 6e 2e 20 20 4f 6d 69 74 74 65  w chain.  Omitte
23a0: 64 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  d if no overflow
23b0: 0a 2a 2a 0a 2a 2a 20 4f 76 65 72 66 6c 6f 77 20  .**.** Overflow 
23c0: 70 61 67 65 73 20 66 6f 72 6d 20 61 20 6c 69 6e  pages form a lin
23d0: 6b 65 64 20 6c 69 73 74 2e 20 20 45 61 63 68 20  ked list.  Each 
23e0: 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
23f0: 6c 61 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65  last is complete
2400: 6c 79 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74  ly.** filled wit
2410: 68 20 64 61 74 61 20 28 70 61 67 65 73 69 7a 65  h data (pagesize
2420: 20 2d 20 34 20 62 79 74 65 73 29 2e 20 20 54 68   - 4 bytes).  Th
2430: 65 20 6c 61 73 74 20 70 61 67 65 20 63 61 6e 20  e last page can 
2440: 68 61 76 65 20 61 73 20 6c 69 74 74 6c 65 0a 2a  have as little.*
2450: 2a 20 61 73 20 31 20 62 79 74 65 20 6f 66 20 64  * as 1 byte of d
2460: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49  ata..**.**    SI
2470: 5a 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f  ZE    DESCRIPTIO
2480: 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  N.**      4     
2490: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e  Page number of n
24a0: 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24b0: 65 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20  e.**      *     
24c0: 44 61 74 61 0a 2a 2a 0a 2a 2a 20 46 72 65 65 6c  Data.**.** Freel
24d0: 69 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69  ist pages come i
24e0: 6e 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20  n two subtypes: 
24f0: 74 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20  trunk pages and 
2500: 6c 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65  leaf pages.  The
2510: 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20  .** file header 
2520: 70 6f 69 6e 74 73 20 74 6f 20 66 69 72 73 74 20  points to first 
2530: 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
2540: 20 6f 66 20 74 72 75 6e 6b 20 70 61 67 65 2e 20   of trunk page. 
2550: 20 45 61 63 68 20 74 72 75 6e 6b 0a 2a 2a 20 70   Each trunk.** p
2560: 61 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 6d 75  age points to mu
2570: 6c 74 69 70 6c 65 20 6c 65 61 66 20 70 61 67 65  ltiple leaf page
2580: 73 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  s.  The content 
2590: 6f 66 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  of a leaf page i
25a0: 73 0a 2a 2a 20 75 6e 73 70 65 63 69 66 69 65 64  s.** unspecified
25b0: 2e 20 20 41 20 74 72 75 6e 6b 20 70 61 67 65 20  .  A trunk page 
25c0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
25d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20  .**.**    SIZE  
25e0: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
25f0: 20 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65        4     Page
2600: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20   number of next 
2610: 74 72 75 6e 6b 20 70 61 67 65 0a 2a 2a 20 20 20  trunk page.**   
2620: 20 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20     4     Number 
2630: 6f 66 20 6c 65 61 66 20 70 6f 69 6e 74 65 72 73  of leaf pointers
2640: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a   on this page.**
2650: 20 20 20 20 20 20 2a 20 20 20 20 20 7a 65 72 6f        *     zero
2660: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 6e   or more pages n
2670: 75 6d 62 65 72 73 20 6f 66 20 6c 65 61 76 65 73  umbers of leaves
2680: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
2690: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
26a0: 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69  ude "pager.h".#i
26b0: 6e 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68 22  nclude "btree.h"
26c0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
26d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
26e0: 74 2e 68 3e 0a 0a 2f 2a 20 52 6f 75 6e 64 20 75  t.h>../* Round u
26f0: 70 20 61 20 6e 75 6d 62 65 72 20 74 6f 20 74 68  p a number to th
2700: 65 20 6e 65 78 74 20 6c 61 72 67 65 72 20 6d 75  e next larger mu
2710: 6c 74 69 70 6c 65 20 6f 66 20 38 2e 20 20 54 68  ltiple of 8.  Th
2720: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
2730: 20 66 6f 72 63 65 20 38 2d 62 79 74 65 20 61 6c   force 8-byte al
2740: 69 67 6e 6d 65 6e 74 20 6f 6e 20 36 34 2d 62 69  ignment on 64-bi
2750: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  t architectures.
2760: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e  .*/.#define ROUN
2770: 44 38 28 78 29 20 20 20 28 28 78 2b 37 29 26 7e  D8(x)   ((x+7)&~
2780: 37 29 0a 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  7).../* The foll
2790: 6f 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 74  owing value is t
27a0: 68 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20  he maximum cell 
27b0: 73 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 20  size assuming a 
27c0: 6d 61 78 69 6d 75 6d 20 70 61 67 65 0a 2a 2a 20  maximum page.** 
27d0: 73 69 7a 65 20 67 69 76 65 20 61 62 6f 76 65 2e  size give above.
27e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
27f0: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 20 28  ELL_SIZE(pBt)  (
2800: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29  pBt->pageSize-8)
2810: 0a 0a 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  ../* The maximum
2820: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2830: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
2840: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2850: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 61 73 73 75  e.  This.** assu
2860: 6d 65 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65  mes a minimum ce
2870: 6c 6c 20 73 69 7a 65 20 6f 66 20 33 20 62 79 74  ll size of 3 byt
2880: 65 73 2e 20 20 53 75 63 68 20 73 6d 61 6c 6c 20  es.  Such small 
2890: 63 65 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  cells will be.**
28a0: 20 65 78 63 65 65 64 69 6e 67 6c 79 20 72 61 72   exceedingly rar
28b0: 65 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20  e, but they are 
28c0: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 64 65  possible..*/.#de
28d0: 66 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 42 74  fine MX_CELL(pBt
28e0: 29 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  ) ((pBt->pageSiz
28f0: 65 2d 38 29 2f 33 29 0a 0a 2f 2a 20 46 6f 72 77  e-8)/3)../* Forw
2900: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
2910: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2920: 63 74 20 4d 65 6d 50 61 67 65 20 4d 65 6d 50 61  ct MemPage MemPa
2930: 67 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ge;.typedef stru
2940: 63 74 20 42 74 4c 6f 63 6b 20 42 74 4c 6f 63 6b  ct BtLock BtLock
2950: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
2960: 20 61 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20   a magic string 
2970: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
2980: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2990: 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69 74 65   every.** SQLite
29a0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64   database in ord
29b0: 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  er to identify t
29c0: 68 65 20 66 69 6c 65 20 61 73 20 61 20 72 65 61  he file as a rea
29d0: 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  l database..**.*
29e0: 2a 20 59 6f 75 20 63 61 6e 20 63 68 61 6e 67 65  * You can change
29f0: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 63   this value at c
2a00: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 73  ompile-time by s
2a10: 70 65 63 69 66 79 69 6e 67 20 61 0a 2a 2a 20 2d  pecifying a.** -
2a20: 44 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41  DSQLITE_FILE_HEA
2a30: 44 45 52 3d 22 2e 2e 2e 22 20 6f 6e 20 74 68 65  DER="..." on the
2a40: 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e   compiler comman
2a50: 64 2d 6c 69 6e 65 2e 20 20 54 68 65 0a 2a 2a 20  d-line.  The.** 
2a60: 68 65 61 64 65 72 20 6d 75 73 74 20 62 65 20 65  header must be e
2a70: 78 61 63 74 6c 79 20 31 36 20 62 79 74 65 73 20  xactly 16 bytes 
2a80: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 7a 65  including the ze
2a90: 72 6f 2d 74 65 72 6d 69 6e 61 74 6f 72 20 73 6f  ro-terminator so
2aa0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
2ab0: 74 73 65 6c 66 20 73 68 6f 75 6c 64 20 62 65 20  tself should be 
2ac0: 31 35 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  15 characters lo
2ad0: 6e 67 2e 20 20 49 66 20 79 6f 75 20 63 68 61 6e  ng.  If you chan
2ae0: 67 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  ge.** the header
2af0: 2c 20 74 68 65 6e 20 79 6f 75 72 20 63 75 73 74  , then your cust
2b00: 6f 6d 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20  om library will 
2b10: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72  not be able to r
2b20: 65 61 64 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  ead .** database
2b30: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
2b40: 68 65 20 73 74 61 6e 64 61 72 64 20 74 6f 6f 6c  he standard tool
2b50: 73 20 61 6e 64 20 74 68 65 20 73 74 61 6e 64 61  s and the standa
2b60: 72 64 20 74 6f 6f 6c 73 0a 2a 2a 20 77 69 6c 6c  rd tools.** will
2b70: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
2b80: 72 65 61 64 20 64 61 74 61 62 61 73 65 73 20 63  read databases c
2b90: 72 65 61 74 65 64 20 62 79 20 79 6f 75 72 20 63  reated by your c
2ba0: 75 73 74 6f 6d 20 6c 69 62 72 61 72 79 2e 0a 2a  ustom library..*
2bb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2bc0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 20 2f 2a 20  _FILE_HEADER /* 
2bd0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
2be0: 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 53 51   */.#  define SQ
2bf0: 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  LITE_FILE_HEADER
2c00: 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20   "SQLite format 
2c10: 33 22 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  3".#endif.static
2c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67   const char zMag
2c30: 69 63 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c  icHeader[] = SQL
2c40: 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b  ITE_FILE_HEADER;
2c50: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 74 79 70  ../*.** Page typ
2c60: 65 20 66 6c 61 67 73 2e 20 20 41 6e 20 4f 52 65  e flags.  An ORe
2c70: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
2c80: 20 74 68 65 73 65 20 66 6c 61 67 73 20 61 70 70   these flags app
2c90: 65 61 72 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  ear as the.** fi
2ca0: 72 73 74 20 62 79 74 65 20 6f 66 20 65 76 65 72  rst byte of ever
2cb0: 79 20 42 54 72 65 65 20 70 61 67 65 2e 0a 2a 2f  y BTree page..*/
2cc0: 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 49 4e 54  .#define PTF_INT
2cd0: 4b 45 59 20 20 20 20 30 78 30 31 0a 23 64 65 66  KEY    0x01.#def
2ce0: 69 6e 65 20 50 54 46 5f 5a 45 52 4f 44 41 54 41  ine PTF_ZERODATA
2cf0: 20 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 50    0x02.#define P
2d00: 54 46 5f 4c 45 41 46 44 41 54 41 20 20 30 78 30  TF_LEAFDATA  0x0
2d10: 34 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45  4.#define PTF_LE
2d20: 41 46 20 20 20 20 20 20 30 78 30 38 0a 0a 2f 2a  AF      0x08../*
2d30: 0a 2a 2a 20 41 73 20 65 61 63 68 20 70 61 67 65  .** As each page
2d40: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
2d50: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
2d60: 72 79 2c 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ry, an instance 
2d70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2d80: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
2d90: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 69 6e   appended and in
2da0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
2db0: 6f 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75  o.  This structu
2dc0: 72 65 20 73 74 6f 72 65 73 0a 2a 2a 20 69 6e 66  re stores.** inf
2dd0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
2de0: 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20  he page that is 
2df0: 64 65 63 6f 64 65 64 20 66 72 6f 6d 20 74 68 65  decoded from the
2e00: 20 72 61 77 20 66 69 6c 65 20 70 61 67 65 2e 0a   raw file page..
2e10: 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
2e20: 74 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 62  t field points b
2e30: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2e40: 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 61 6c  t page.  This al
2e50: 6c 6f 77 73 20 75 73 20 74 6f 0a 2a 2a 20 77 61  lows us to.** wa
2e60: 6c 6b 20 75 70 20 74 68 65 20 42 54 72 65 65 20  lk up the BTree 
2e70: 66 72 6f 6d 20 61 6e 79 20 6c 65 61 66 20 74 6f  from any leaf to
2e80: 20 74 68 65 20 72 6f 6f 74 2e 20 20 43 61 72 65   the root.  Care
2e90: 20 6d 75 73 74 20 62 65 20 74 61 6b 65 6e 20 74   must be taken t
2ea0: 6f 0a 2a 2a 20 75 6e 72 65 66 28 29 20 74 68 65  o.** unref() the
2eb0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 70 6f 69   parent page poi
2ec0: 6e 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 70  nter when this p
2ed0: 61 67 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  age is no longer
2ee0: 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20   referenced..** 
2ef0: 54 68 65 20 70 61 67 65 44 65 73 74 72 75 63 74  The pageDestruct
2f00: 6f 72 28 29 20 72 6f 75 74 69 6e 65 20 68 61 6e  or() routine han
2f10: 64 6c 65 73 20 74 68 61 74 20 63 68 6f 72 65 2e  dles that chore.
2f20: 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 50 61  .*/.struct MemPa
2f30: 67 65 20 7b 0a 20 20 75 38 20 69 73 49 6e 69 74  ge {.  u8 isInit
2f40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2f50: 72 75 65 20 69 66 20 70 72 65 76 69 6f 75 73 6c  rue if previousl
2f60: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 4d  y initialized. M
2f70: 55 53 54 20 42 45 20 46 49 52 53 54 21 20 2a 2f  UST BE FIRST! */
2f80: 0a 20 20 75 38 20 69 64 78 53 68 69 66 74 3b 20  .  u8 idxShift; 
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fa0: 69 66 20 43 65 6c 6c 20 69 6e 64 69 63 65 73 20  if Cell indices 
2fb0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2fc0: 20 20 75 38 20 6e 4f 76 65 72 66 6c 6f 77 3b 20    u8 nOverflow; 
2fd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2fe0: 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   of overflow cel
2ff0: 6c 20 62 6f 64 69 65 73 20 69 6e 20 61 43 65 6c  l bodies in aCel
3000: 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 6e 74 4b  l[] */.  u8 intK
3010: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey;           /*
3020: 20 54 72 75 65 20 69 66 20 69 6e 74 6b 65 79 20   True if intkey 
3030: 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 20  flag is set */. 
3040: 20 75 38 20 6c 65 61 66 3b 20 20 20 20 20 20 20   u8 leaf;       
3050: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3060: 20 6c 65 61 66 20 66 6c 61 67 20 69 73 20 73 65   leaf flag is se
3070: 74 20 2a 2f 0a 20 20 75 38 20 7a 65 72 6f 44 61  t */.  u8 zeroDa
3080: 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
3090: 72 75 65 20 69 66 20 74 61 62 6c 65 20 73 74 6f  rue if table sto
30a0: 72 65 73 20 6b 65 79 73 20 6f 6e 6c 79 20 2a 2f  res keys only */
30b0: 0a 20 20 75 38 20 6c 65 61 66 44 61 74 61 3b 20  .  u8 leafData; 
30c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30d0: 69 66 20 74 61 62 6c 65 73 20 73 74 6f 72 65 73  if tables stores
30e0: 20 64 61 74 61 20 6f 6e 20 6c 65 61 76 65 73 20   data on leaves 
30f0: 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 68 61 73  only */.  u8 has
3100: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  Data;          /
3110: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 70  * True if this p
3120: 61 67 65 20 73 74 6f 72 65 73 20 64 61 74 61 20  age stores data 
3130: 2a 2f 0a 20 20 75 38 20 68 64 72 4f 66 66 73 65  */.  u8 hdrOffse
3140: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 30 30  t;        /* 100
3150: 20 66 6f 72 20 70 61 67 65 20 31 2e 20 20 30 20   for page 1.  0 
3160: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
3170: 38 20 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  8 childPtrSize; 
3180: 20 20 20 20 2f 2a 20 30 20 69 66 20 6c 65 61 66      /* 0 if leaf
3190: 3d 3d 31 2e 20 20 34 20 69 66 20 6c 65 61 66 3d  ==1.  4 if leaf=
31a0: 3d 30 20 2a 2f 0a 20 20 75 31 36 20 6d 61 78 4c  =0 */.  u16 maxL
31b0: 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  ocal;        /* 
31c0: 43 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 61  Copy of Btree.ma
31d0: 78 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e  xLocal or Btree.
31e0: 6d 61 78 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36  maxLeaf */.  u16
31f0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20   minLocal;      
3200: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42 74 72    /* Copy of Btr
3210: 65 65 2e 6d 69 6e 4c 6f 63 61 6c 20 6f 72 20 42  ee.minLocal or B
3220: 74 72 65 65 2e 6d 69 6e 4c 65 61 66 20 2a 2f 0a  tree.minLeaf */.
3230: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
3240: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  ;      /* Index 
3250: 69 6e 20 61 44 61 74 61 20 6f 66 20 66 69 72 73  in aData of firs
3260: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
3270: 2f 0a 20 20 75 31 36 20 69 64 78 50 61 72 65 6e  /.  u16 idxParen
3280: 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  t;       /* Inde
3290: 78 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 74  x in parent of t
32a0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 31  his node */.  u1
32b0: 36 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  6 nFree;        
32c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32d0: 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68  free bytes on th
32e0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20  e page */.  u16 
32f0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
3300: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
3310: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  lls on this page
3320: 2c 20 6c 6f 63 61 6c 20 61 6e 64 20 6f 76 66 6c  , local and ovfl
3330: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 5f 4f 76   */.  struct _Ov
3340: 66 6c 43 65 6c 6c 20 7b 20 20 20 2f 2a 20 43 65  flCell {   /* Ce
3350: 6c 6c 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  lls that will no
3360: 74 20 66 69 74 20 6f 6e 20 61 44 61 74 61 5b 5d  t fit on aData[]
3370: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 43 65 6c   */.    u8 *pCel
3380: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  l;          /* P
3390: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 62  ointers to the b
33a0: 6f 64 79 20 6f 66 20 74 68 65 20 6f 76 65 72 66  ody of the overf
33b0: 6c 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  low cell */.    
33c0: 75 31 36 20 69 64 78 3b 20 20 20 20 20 20 20 20  u16 idx;        
33d0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
33e0: 69 73 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 69  is cell before i
33f0: 64 78 2d 74 68 20 6e 6f 6e 2d 6f 76 65 72 66 6c  dx-th non-overfl
3400: 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 7d 20 61  ow cell */.  } a
3410: 4f 76 66 6c 5b 35 5d 3b 0a 20 20 42 74 53 68 61  Ovfl[5];.  BtSha
3420: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
3430: 2f 2a 20 50 6f 69 6e 74 65 72 20 62 61 63 6b 20  /* Pointer back 
3440: 74 6f 20 42 54 72 65 65 20 73 74 72 75 63 74 75  to BTree structu
3450: 72 65 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  re */.  u8 *aDat
3460: 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
3470: 50 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20  Pointer back to 
3480: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
3490: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
34a0: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
34b0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
34c0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
34d0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
34e0: 6e 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61  nt;    /* The pa
34f0: 72 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  rent of this pag
3500: 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f  e.  NULL for roo
3510: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  t */.};../*.** T
3520: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61  he in-memory ima
3530: 67 65 20 6f 66 20 61 20 64 69 73 6b 20 70 61 67  ge of a disk pag
3540: 65 20 68 61 73 20 74 68 65 20 61 75 78 69 6c 69  e has the auxili
3550: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
3560: 61 70 70 65 6e 64 65 64 0a 2a 2a 20 74 6f 20 74  appended.** to t
3570: 68 65 20 65 6e 64 2e 20 20 45 58 54 52 41 5f 53  he end.  EXTRA_S
3580: 49 5a 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65  IZE is the numbe
3590: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
35a0: 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ace needed to ho
35b0: 6c 64 0a 2a 2a 20 74 68 61 74 20 65 78 74 72 61  ld.** that extra
35c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
35d0: 0a 23 64 65 66 69 6e 65 20 45 58 54 52 41 5f 53  .#define EXTRA_S
35e0: 49 5a 45 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  IZE sizeof(MemPa
35f0: 67 65 29 0a 0a 2f 2a 20 42 74 72 65 65 20 68 61  ge)../* Btree ha
3600: 6e 64 6c 65 20 2a 2f 0a 73 74 72 75 63 74 20 42  ndle */.struct B
3610: 74 72 65 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tree {.  sqlite3
3620: 20 2a 70 53 71 6c 69 74 65 3b 0a 20 20 42 74 53   *pSqlite;.  BtS
3630: 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 75 38  hared *pBt;.  u8
3640: 20 69 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20   inTrans;       
3650: 20 20 20 20 20 2f 2a 20 54 52 41 4e 53 5f 4e 4f       /* TRANS_NO
3660: 4e 45 2c 20 54 52 41 4e 53 5f 52 45 41 44 20 6f  NE, TRANS_READ o
3670: 72 20 54 52 41 4e 53 5f 57 52 49 54 45 20 2a 2f  r TRANS_WRITE */
3680: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 74 72 65 65  .};../*.** Btree
3690: 2e 69 6e 54 72 61 6e 73 20 6d 61 79 20 74 61 6b  .inTrans may tak
36a0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  e one of the fol
36b0: 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a  lowing values..*
36c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
36d0: 65 64 2d 64 61 74 61 20 65 78 74 65 6e 73 69 6f  ed-data extensio
36e0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
36f0: 65 72 65 20 6d 61 79 20 62 65 20 6d 75 6c 74 69  ere may be multi
3700: 70 6c 65 20 75 73 65 72 73 0a 2a 2a 20 6f 66 20  ple users.** of 
3710: 74 68 65 20 42 74 72 65 65 20 73 74 72 75 63 74  the Btree struct
3720: 75 72 65 2e 20 41 74 20 6d 6f 73 74 20 6f 6e 65  ure. At most one
3730: 20 6f 66 20 74 68 65 73 65 20 6d 61 79 20 6f 70   of these may op
3740: 65 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  en a write trans
3750: 61 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 61  action,.** but a
3760: 6e 79 20 6e 75 6d 62 65 72 20 6d 61 79 20 68 61  ny number may ha
3770: 76 65 20 61 63 74 69 76 65 20 72 65 61 64 20 74  ve active read t
3780: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 56 61 72  ransactions. Var
3790: 69 61 62 6c 65 20 42 74 72 65 65 2e 70 44 62 20  iable Btree.pDb 
37a0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
37b0: 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
37c0: 6e 73 20 61 6e 79 20 63 75 72 72 65 6e 74 20 77  ns any current w
37d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 52 41  ..*/.#define TRA
37f0: 4e 53 5f 4e 4f 4e 45 20 20 30 0a 23 64 65 66 69  NS_NONE  0.#defi
3800: 6e 65 20 54 52 41 4e 53 5f 52 45 41 44 20 20 31  ne TRANS_READ  1
3810: 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 57  .#define TRANS_W
3820: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 45 76  RITE 2../*.** Ev
3830: 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64  erything we need
3840: 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 20 61   to know about a
3850: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  n open database.
3860: 2a 2f 0a 73 74 72 75 63 74 20 42 74 53 68 61 72  */.struct BtShar
3870: 65 64 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ed {.  Pager *pP
3880: 61 67 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ager;        /* 
3890: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 2a  The page cache *
38a0: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
38b0: 75 72 73 6f 72 3b 20 20 20 20 2f 2a 20 41 20 6c  ursor;    /* A l
38c0: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
38d0: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 4d 65 6d  cursors */.  Mem
38e0: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
38f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
3900: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3910: 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b   */.  u8 inStmt;
3920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3930: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 69 6e  rue if we are in
3940: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3950: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3960: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
3970: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3980: 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
3990: 20 66 69 6c 65 20 69 73 20 72 65 61 64 6f 6e 6c   file is readonl
39a0: 79 20 2a 2f 0a 20 20 75 38 20 6d 61 78 45 6d 62  y */.  u8 maxEmb
39b0: 65 64 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20  edFrac;      /* 
39c0: 4d 61 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20  Maximum payload 
39d0: 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61  as % of total pa
39e0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20  ge size */.  u8 
39f0: 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 20 20 20  minEmbedFrac;   
3a00: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 70 61     /* Minimum pa
3a10: 79 6c 6f 61 64 20 61 73 20 25 20 6f 66 20 74 6f  yload as % of to
3a20: 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tal page size */
3a30: 0a 20 20 75 38 20 6d 69 6e 4c 65 61 66 46 72 61  .  u8 minLeafFra
3a40: 63 3b 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  c;       /* Mini
3a50: 6d 75 6d 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  mum leaf payload
3a60: 20 61 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70   as % of total p
3a70: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38  age size */.  u8
3a80: 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 3b 20   pageSizeFixed; 
3a90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3aa0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 6e  he page size can
3ab0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
3ac0: 61 6e 67 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  anged */.#ifndef
3ad0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3ae0: 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 61 75 74  OVACUUM.  u8 aut
3af0: 6f 56 61 63 75 75 6d 3b 20 20 20 20 20 20 20 20  oVacuum;        
3b00: 2f 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62  /* True if datab
3b10: 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
3b20: 6f 2d 76 61 63 75 75 6d 20 2a 2f 0a 23 65 6e 64  o-vacuum */.#end
3b30: 69 66 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  if.  u16 pageSiz
3b40: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  e;         /* To
3b50: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
3b60: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
3b70: 0a 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a  .  u16 usableSiz
3b80: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  e;       /* Numb
3b90: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
3ba0: 65 73 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  es on each page 
3bb0: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
3bc0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  l;         /* Ma
3bd0: 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c  ximum local payl
3be0: 6f 61 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46 44  oad in non-LEAFD
3bf0: 41 54 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ATA tables */.  
3c00: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20  int minLocal;   
3c10: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
3c20: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3c30: 6e 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74  n non-LEAFDATA t
3c40: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  ables */.  int m
3c50: 61 78 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  axLeaf;         
3c60: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61   /* Maximum loca
3c70: 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c  l payload in a L
3c80: 45 41 46 44 41 54 41 20 74 61 62 6c 65 20 2a 2f  EAFDATA table */
3c90: 0a 20 20 69 6e 74 20 6d 69 6e 4c 65 61 66 3b 20  .  int minLeaf; 
3ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
3cb0: 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  mum local payloa
3cc0: 64 20 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20  d in a LEAFDATA 
3cd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 42 75 73 79 48  table */.  BusyH
3ce0: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
3cf0: 64 6c 65 72 3b 20 20 20 2f 2a 20 43 61 6c 6c 62  dler;   /* Callb
3d00: 61 63 6b 20 66 6f 72 20 77 68 65 6e 20 74 68 65  ack for when the
3d10: 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
3d20: 6e 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 6e  ntion */.  u8 in
3d30: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20  Transaction;    
3d40: 20 2f 2a 20 54 72 61 6e 73 61 63 74 69 6f 6e 20   /* Transaction 
3d50: 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  state */.  int n
3d60: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
3d70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3d80: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
3d90: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3da0: 69 6e 74 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  int nTransaction
3db0: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3dc0: 6f 66 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  of open transact
3dd0: 69 6f 6e 73 20 28 72 65 61 64 20 2b 20 77 72 69  ions (read + wri
3de0: 74 65 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  te) */.  void *p
3df0: 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20 20 2f  Schema;        /
3e00: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 70 61  * Pointer to spa
3e10: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ce allocated by 
3e20: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
3e30: 6d 61 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  ma() */.  void (
3e40: 2a 78 46 72 65 65 53 63 68 65 6d 61 29 28 76 6f  *xFreeSchema)(vo
3e50: 69 64 2a 29 3b 20 20 2f 2a 20 44 65 73 74 72 75  id*);  /* Destru
3e60: 63 74 6f 72 20 66 6f 72 20 42 74 53 68 61 72 65  ctor for BtShare
3e70: 64 2e 70 53 63 68 65 6d 61 20 2a 2f 0a 23 69 66  d.pSchema */.#if
3e80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e90: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
3ea0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 20 20  BtLock *pLock;  
3eb0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3ec0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 6f 6e 20 74   locks held on t
3ed0: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
3ee0: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 42 74 53   struct */.  BtS
3ef0: 68 61 72 65 64 20 2a 70 4e 65 78 74 3b 20 20 20  hared *pNext;   
3f00: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 54 68     /* Next in Th
3f10: 72 65 61 64 44 61 74 61 2e 70 42 74 72 65 65 20  readData.pBtree 
3f20: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 23  linked list */.#
3f30: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
3f40: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3f50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3f60: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
3f70: 6f 20 68 6f 6c 64 20 69 6e 66 6f 72 6d 61 74 69  o hold informati
3f80: 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 61 20 63 65  on.** about a ce
3f90: 6c 6c 2e 20 20 54 68 65 20 70 61 72 73 65 43 65  ll.  The parseCe
3fa0: 6c 6c 50 74 72 28 29 20 66 75 6e 63 74 69 6f 6e  llPtr() function
3fb0: 20 66 69 6c 6c 73 20 69 6e 20 74 68 69 73 20 73   fills in this s
3fc0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 61 73 65  tructure.** base
3fd0: 64 20 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  d on information
3fe0: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 74 68   extract from th
3ff0: 65 20 72 61 77 20 64 69 73 6b 20 70 61 67 65 2e  e raw disk page.
4000: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
4010: 63 74 20 43 65 6c 6c 49 6e 66 6f 20 43 65 6c 6c  ct CellInfo Cell
4020: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 43 65 6c  Info;.struct Cel
4030: 6c 49 6e 66 6f 20 7b 0a 20 20 75 38 20 2a 70 43  lInfo {.  u8 *pC
4040: 65 6c 6c 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ell;     /* Poin
4050: 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ter to the start
4060: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
4070: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 3b 20   */.  i64 nKey; 
4080: 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
4090: 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  for INTKEY table
40a0: 73 2c 20 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  s, or number of 
40b0: 62 79 74 65 73 20 69 6e 20 6b 65 79 20 2a 2f 0a  bytes in key */.
40c0: 20 20 75 33 32 20 6e 44 61 74 61 3b 20 20 20 20    u32 nData;    
40d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
40e0: 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  tes of data */. 
40f0: 20 75 31 36 20 6e 48 65 61 64 65 72 3b 20 20 20   u16 nHeader;   
4100: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63  /* Size of the c
4110: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
4120: 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
4130: 20 75 31 36 20 6e 4c 6f 63 61 6c 3b 20 20 20 20   u16 nLocal;    
4140: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 70 61 79  /* Amount of pay
4150: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
4160: 79 20 2a 2f 0a 20 20 75 31 36 20 69 4f 76 65 72  y */.  u16 iOver
4170: 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66 73 65 74 20  flow; /* Offset 
4180: 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
4190: 20 6e 75 6d 62 65 72 2e 20 20 5a 65 72 6f 20 69   number.  Zero i
41a0: 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 2a 2f  f no overflow */
41b0: 0a 20 20 75 31 36 20 6e 53 69 7a 65 3b 20 20 20  .  u16 nSize;   
41c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
41d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 6e   cell content on
41e0: 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
41f0: 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   page */.};../*.
4200: 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 61  ** A cursor is a
4210: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 61   pointer to a pa
4220: 72 74 69 63 75 6c 61 72 20 65 6e 74 72 79 20 69  rticular entry i
4230: 6e 20 74 68 65 20 42 54 72 65 65 2e 0a 2a 2a 20  n the BTree..** 
4240: 54 68 65 20 65 6e 74 72 79 20 69 73 20 69 64 65  The entry is ide
4250: 6e 74 69 66 69 65 64 20 62 79 20 69 74 73 20 4d  ntified by its M
4260: 65 6d 50 61 67 65 20 61 6e 64 20 74 68 65 20 69  emPage and the i
4270: 6e 64 65 78 20 69 6e 0a 2a 2a 20 4d 65 6d 50 61  ndex in.** MemPa
4280: 67 65 2e 61 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  ge.aCell[] of th
4290: 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 72 75  e entry..*/.stru
42a0: 63 74 20 42 74 43 75 72 73 6f 72 20 7b 0a 20 20  ct BtCursor {.  
42b0: 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 20 20  Btree *pBtree;  
42c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
42d0: 20 42 74 72 65 65 20 74 6f 20 77 68 69 63 68 20   Btree to which 
42e0: 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
42f0: 6e 67 73 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ngs */.  BtCurso
4300: 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76  r *pNext, *pPrev
4310: 3b 20 20 2f 2a 20 46 6f 72 6d 73 20 61 20 6c 69  ;  /* Forms a li
4320: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c  nked list of all
4330: 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 69 6e   cursors */.  in
4340: 74 20 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  t (*xCompare)(vo
4350: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
4360: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
4370: 69 64 2a 29 3b 20 2f 2a 20 4b 65 79 20 63 6f 6d  id*); /* Key com
4380: 70 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64  p func */.  void
4390: 20 2a 70 41 72 67 3b 20 20 20 20 20 20 20 20 20   *pArg;         
43a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
43b0: 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
43c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52   */.  Pgno pgnoR
43d0: 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  oot;            
43e0: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
43f0: 20 6f 66 20 74 68 69 73 20 74 72 65 65 20 2a 2f   of this tree */
4400: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
4410: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
4420: 50 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Page that contai
4430: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 2a 2f 0a  ns the entry */.
4440: 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
4460: 6e 64 65 78 20 6f 66 20 74 68 65 20 65 6e 74 72  ndex of the entr
4470: 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
4480: 6c 5b 5d 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  l[] */.  CellInf
4490: 6f 20 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  o info;         
44a0: 20 20 20 2f 2a 20 41 20 70 61 72 73 65 20 6f 66     /* A parse of
44b0: 20 74 68 65 20 63 65 6c 6c 20 77 65 20 61 72 65   the cell we are
44c0: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 2a 2f 0a   pointing at */.
44d0: 20 20 75 38 20 77 72 46 6c 61 67 3b 20 20 20 20    u8 wrFlag;    
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
44f0: 72 75 65 20 69 66 20 77 72 69 74 61 62 6c 65 20  rue if writable 
4500: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 55 52  * One of the CUR
4530: 53 4f 52 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74  SOR_XXX constant
4540: 73 20 28 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f  s (see below) */
4550: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4560: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
4570: 45 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 20  E.  void *pKey; 
4580: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 6b 65       /* Saved ke
4590: 79 20 74 68 61 74 20 77 61 73 20 63 75 72 73 6f  y that was curso
45a0: 72 27 73 20 6c 61 73 74 20 6b 6e 6f 77 6e 20 70  r's last known p
45b0: 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34  osition */.  i64
45c0: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 2f 2a   nKey;        /*
45d0: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 2c 20 6f   Size of pKey, o
45e0: 72 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 6b  r last integer k
45f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  ey */.  int skip
4600: 3b 20 20 20 20 20 20 20 20 2f 2a 20 28 73 6b 69  ;        /* (ski
4610: 70 3c 30 29 20 2d 3e 20 50 72 65 76 28 29 20 69  p<0) -> Prev() i
4620: 73 20 61 20 6e 6f 2d 6f 70 2e 20 28 73 6b 69 70  s a no-op. (skip
4630: 3e 30 29 20 2d 3e 20 4e 65 78 74 28 29 20 69 73  >0) -> Next() is
4640: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
4650: 2a 0a 2a 2a 20 50 6f 74 65 6e 74 69 61 6c 20 76  *.** Potential v
4660: 61 6c 75 65 73 20 66 6f 72 20 42 74 43 75 72 73  alues for BtCurs
4670: 6f 72 2e 65 53 74 61 74 65 2e 20 54 68 65 20 66  or.eState. The f
4680: 69 72 73 74 20 74 77 6f 20 76 61 6c 75 65 73 20  irst two values 
4690: 28 56 41 4c 49 44 20 61 6e 64 20 0a 2a 2a 20 49  (VALID and .** I
46a0: 4e 56 41 4c 49 44 29 20 6d 61 79 20 6f 63 63 75  NVALID) may occu
46b0: 72 20 69 6e 20 61 6e 79 20 62 75 69 6c 64 2e 20  r in any build. 
46c0: 54 68 65 20 74 68 69 72 64 20 28 52 45 51 55 49  The third (REQUI
46d0: 52 45 53 45 45 4b 29 20 6d 61 79 20 6f 6e 6c 79  RESEEK) may only
46e0: 20 6f 63 63 75 72 20 0a 2a 2a 20 69 66 20 73 71   occur .** if sq
46f0: 6c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c 65  lite was compile
4700: 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 4f 4d  d without the OM
4710: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
4720: 73 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2e 0a  symbol defined..
4730: 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 56 41 4c  **.** CURSOR_VAL
4740: 49 44 3a 0a 2a 2a 20 20 20 43 75 72 73 6f 72 20  ID:.**   Cursor 
4750: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
4760: 64 20 65 6e 74 72 79 2e 20 67 65 74 50 61 79 6c  d entry. getPayl
4770: 6f 61 64 28 29 20 65 74 63 2e 20 6d 61 79 20 62  oad() etc. may b
4780: 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
4790: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3a 0a  CURSOR_INVALID:.
47a0: 2a 2a 20 20 20 43 75 72 73 6f 72 20 64 6f 65 73  **   Cursor does
47b0: 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20   not point to a 
47c0: 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 54 68 69  valid entry. Thi
47d0: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 28 66 6f  s can happen (fo
47e0: 72 20 65 78 61 6d 70 6c 65 29 20 0a 2a 2a 20 20  r example) .**  
47f0: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
4800: 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 62  le is empty or b
4810: 65 63 61 75 73 65 20 42 74 72 65 65 43 75 72 73  ecause BtreeCurs
4820: 6f 72 46 69 72 73 74 28 29 20 68 61 73 20 6e 6f  orFirst() has no
4830: 74 20 62 65 65 6e 0a 2a 2a 20 20 20 63 61 6c 6c  t been.**   call
4840: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52  ed..**.** CURSOR
4850: 5f 52 45 51 55 49 52 45 53 45 45 4b 3a 0a 2a 2a  _REQUIRESEEK:.**
4860: 20 20 20 54 68 65 20 74 61 62 6c 65 20 74 68 61     The table tha
4870: 74 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61  t this cursor wa
4880: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 73 74 69 6c  s opened on stil
4890: 6c 20 65 78 69 73 74 73 2c 20 62 75 74 20 68 61  l exists, but ha
48a0: 73 20 62 65 65 6e 20 0a 2a 2a 20 20 20 6d 6f 64  s been .**   mod
48b0: 69 66 69 65 64 20 73 69 6e 63 65 20 74 68 65 20  ified since the 
48c0: 63 75 72 73 6f 72 20 77 61 73 20 6c 61 73 74 20  cursor was last 
48d0: 75 73 65 64 2e 20 54 68 65 20 63 75 72 73 6f 72  used. The cursor
48e0: 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 73 61 76   position is sav
48f0: 65 64 0a 2a 2a 20 20 20 69 6e 20 76 61 72 69 61  ed.**   in varia
4900: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 70 4b  bles BtCursor.pK
4910: 65 79 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ey and BtCursor.
4920: 6e 4b 65 79 2e 20 57 68 65 6e 20 61 20 63 75 72  nKey. When a cur
4930: 73 6f 72 20 69 73 20 69 6e 20 0a 2a 2a 20 20 20  sor is in .**   
4940: 74 68 69 73 20 73 74 61 74 65 2c 20 72 65 73 74  this state, rest
4950: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
4960: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6e 20 62  Position() can b
4970: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 74 74 65  e called to atte
4980: 6d 70 74 20 74 6f 0a 2a 2a 20 20 20 73 65 65 6b  mpt to.**   seek
4990: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
49a0: 68 65 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  he saved positio
49b0: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 55  n..*/.#define CU
49c0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 20 20 20  RSOR_INVALID    
49d0: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
49e0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
49f0: 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66            1.#def
4a00: 69 6e 65 20 43 55 52 53 4f 52 5f 52 45 51 55 49  ine CURSOR_REQUI
4a10: 52 45 53 45 45 4b 20 20 20 20 20 20 20 32 0a 0a  RESEEK       2..
4a20: 2f 2a 0a 2a 2a 20 54 68 65 20 54 52 41 43 45 20  /*.** The TRACE 
4a30: 6d 61 63 72 6f 20 77 69 6c 6c 20 70 72 69 6e 74  macro will print
4a40: 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 74 61 74   high-level stat
4a50: 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  us information a
4a60: 62 6f 75 74 20 74 68 65 0a 2a 2a 20 62 74 72 65  bout the.** btre
4a70: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e  e operation when
4a80: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
4a90: 61 62 6c 65 20 73 71 6c 69 74 65 33 5f 62 74 72  able sqlite3_btr
4aa0: 65 65 5f 74 72 61 63 65 20 69 73 0a 2a 2a 20 65  ee_trace is.** e
4ab0: 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 23 69 66 20 53  nabled..*/.#if S
4ac0: 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66  QLITE_TEST.# def
4ad0: 69 6e 65 20 54 52 41 43 45 28 58 29 20 20 20 69  ine TRACE(X)   i
4ae0: 66 28 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65  f( sqlite3_btree
4af0: 5f 74 72 61 63 65 20 29 5c 0a 20 20 20 20 20 20  _trace )\.      
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67    { sqlite3Debug
4b20: 50 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68  Printf X; fflush
4b30: 28 73 74 64 6f 75 74 29 3b 20 7d 0a 23 65 6c 73  (stdout); }.#els
4b40: 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45  e.# define TRACE
4b50: 28 58 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73  (X).#endif.int s
4b60: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
4b70: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
4b80: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
4b90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61   */../*.** Forwa
4ba0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
4bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4bc0: 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 53 68  ckReadLocks(BtSh
4bd0: 61 72 65 64 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  ared*,Pgno,BtCur
4be0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  sor*);../*.** Re
4bf0: 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 74 77  ad or write a tw
4c00: 6f 2d 20 61 6e 64 20 66 6f 75 72 2d 62 79 74 65  o- and four-byte
4c10: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
4c20: 67 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ger values..*/.s
4c30: 74 61 74 69 63 20 75 33 32 20 67 65 74 32 62 79  tatic u32 get2by
4c40: 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  te(unsigned char
4c50: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
4c60: 70 5b 30 5d 3c 3c 38 29 20 7c 20 70 5b 31 5d 3b  p[0]<<8) | p[1];
4c70: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 67 65  .}.static u32 ge
4c80: 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t4byte(unsigned 
4c90: 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  char *p){.  retu
4ca0: 72 6e 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c 20  rn (p[0]<<24) | 
4cb0: 28 70 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70 5b  (p[1]<<16) | (p[
4cc0: 32 5d 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d  2]<<8) | p[3];.}
4cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74  .static void put
4ce0: 32 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63  2byte(unsigned c
4cf0: 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a  har *p, u32 v){.
4d00: 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 38 3b 0a 20    p[0] = v>>8;. 
4d10: 20 70 5b 31 5d 20 3d 20 76 3b 0a 7d 0a 73 74 61   p[1] = v;.}.sta
4d20: 74 69 63 20 76 6f 69 64 20 70 75 74 34 62 79 74  tic void put4byt
4d30: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4d40: 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b  *p, u32 v){.  p[
4d50: 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b  0] = v>>24;.  p[
4d60: 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b  1] = v>>16;.  p[
4d70: 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33  2] = v>>8;.  p[3
4d80: 5d 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = v;.}../*.** 
4d90: 52 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61 64  Routines to read
4da0: 20 61 6e 64 20 77 72 69 74 65 20 76 61 72 69 61   and write varia
4db0: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
4dc0: 65 72 73 2e 20 20 54 68 65 73 65 20 75 73 65 64  ers.  These used
4dd0: 20 74 6f 0a 2a 2a 20 62 65 20 64 65 66 69 6e 65   to.** be define
4de0: 64 20 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 20 6e  d locally, but n
4df0: 6f 77 20 77 65 20 75 73 65 20 74 68 65 20 76 61  ow we use the va
4e00: 72 69 6e 74 20 72 6f 75 74 69 6e 65 73 20 69 6e  rint routines in
4e10: 20 74 68 65 20 75 74 69 6c 2e 63 0a 2a 2a 20 66   the util.c.** f
4e20: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
4e30: 67 65 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c  getVarint    sql
4e40: 69 74 65 33 47 65 74 56 61 72 69 6e 74 0a 2f 2a  ite3GetVarint./*
4e50: 20 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69   #define getVari
4e60: 6e 74 33 32 20 20 73 71 6c 69 74 65 33 47 65 74  nt32  sqlite3Get
4e70: 56 61 72 69 6e 74 33 32 20 2a 2f 0a 23 64 65 66  Varint32 */.#def
4e80: 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 28  ine getVarint32(
4e90: 41 2c 42 29 20 20 28 28 2a 42 3d 2a 28 41 29 29  A,B)  ((*B=*(A))
4ea0: 3c 3d 30 78 37 66 3f 31 3a 73 71 6c 69 74 65 33  <=0x7f?1:sqlite3
4eb0: 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29  GetVarint32(A,B)
4ec0: 29 0a 23 64 65 66 69 6e 65 20 70 75 74 56 61 72  ).#define putVar
4ed0: 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 50 75  int    sqlite3Pu
4ee0: 74 56 61 72 69 6e 74 0a 0a 2f 2a 20 54 68 65 20  tVarint../* The 
4ef0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74 68  database page th
4f00: 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6f  e PENDING_BYTE o
4f10: 63 63 75 70 69 65 73 2e 20 54 68 69 73 20 70 61  ccupies. This pa
4f20: 67 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  ge is never used
4f30: 2e 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  ..** TODO: This 
4f40: 6d 61 63 72 6f 20 69 73 20 76 65 72 79 20 73 69  macro is very si
4f50: 6d 69 6c 61 72 79 20 74 6f 20 50 41 47 45 52 5f  milary to PAGER_
4f60: 4d 4a 5f 50 47 4e 4f 28 29 20 69 6e 20 70 61 67  MJ_PGNO() in pag
4f70: 65 72 2e 63 2e 20 54 68 65 79 0a 2a 2a 20 73 68  er.c. They.** sh
4f80: 6f 75 6c 64 20 70 6f 73 73 69 62 6c 79 20 62 65  ould possibly be
4f90: 20 63 6f 6e 73 6f 6c 69 64 61 74 65 64 20 28 70   consolidated (p
4fa0: 72 65 73 75 6d 61 62 6c 79 20 69 6e 20 70 61 67  resumably in pag
4fb0: 65 72 2e 68 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er.h)..**.** If 
4fc0: 64 69 73 6b 20 49 2f 4f 20 69 73 20 6f 6d 69 74  disk I/O is omit
4fd0: 74 65 64 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ted (meaning tha
4fe0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
4ff0: 73 20 73 74 6f 72 65 64 20 70 75 72 65 6c 79 0a  s stored purely.
5000: 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 29 20 74 68  ** in memory) th
5010: 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  en there is no p
5020: 65 6e 64 69 6e 67 20 62 79 74 65 2e 0a 2a 2f 0a  ending byte..*/.
5030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5040: 49 54 5f 44 49 53 4b 49 4f 0a 23 20 64 65 66 69  IT_DISKIO.# defi
5050: 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ne PENDING_BYTE_
5060: 50 41 47 45 28 70 42 74 29 20 20 30 78 37 66 66  PAGE(pBt)  0x7ff
5070: 66 66 66 66 66 0a 23 65 6c 73 65 0a 23 20 64 65  fffff.#else.# de
5080: 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54  fine PENDING_BYT
5090: 45 5f 50 41 47 45 28 70 42 74 29 20 28 28 50 45  E_PAGE(pBt) ((PE
50a0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 70 42 74 29  NDING_BYTE/(pBt)
50b0: 2d 3e 70 61 67 65 53 69 7a 65 29 2b 31 29 0a 23  ->pageSize)+1).#
50c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  endif../*.** A l
50d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68  inked list of th
50e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
50f0: 63 74 75 72 65 73 20 69 73 20 73 74 6f 72 65 64  ctures is stored
5100: 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4c 6f   at BtShared.pLo
5110: 63 6b 2e 0a 2a 2a 20 4c 6f 63 6b 73 20 61 72 65  ck..** Locks are
5120: 20 61 64 64 65 64 20 28 6f 72 20 75 70 67 72 61   added (or upgra
5130: 64 65 64 20 66 72 6f 6d 20 52 45 41 44 5f 4c 4f  ded from READ_LO
5140: 43 4b 20 74 6f 20 57 52 49 54 45 5f 4c 4f 43 4b  CK to WRITE_LOCK
5150: 29 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20  ) when a cursor 
5160: 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  .** is opened on
5170: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
5180: 72 6f 6f 74 20 70 61 67 65 20 42 74 53 68 61 72  root page BtShar
5190: 65 64 2e 69 54 61 62 6c 65 2e 20 4c 6f 63 6b 73  ed.iTable. Locks
51a0: 20 61 72 65 20 72 65 6d 6f 76 65 64 0a 2a 2a 20   are removed.** 
51b0: 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 77  from this list w
51c0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
51d0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f  n is committed o
51e0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 6f  r rolled back, o
51f0: 72 20 77 68 65 6e 0a 2a 2a 20 61 20 62 74 72 65  r when.** a btre
5200: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
5210: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74  ed..*/.struct Bt
5220: 4c 6f 63 6b 20 7b 0a 20 20 42 74 72 65 65 20 2a  Lock {.  Btree *
5230: 70 42 74 72 65 65 3b 20 20 20 20 20 20 20 20 2f  pBtree;        /
5240: 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 68  * Btree handle h
5250: 6f 6c 64 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b  olding this lock
5260: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 61 62 6c   */.  Pgno iTabl
5270: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  e;          /* R
5280: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
5290: 65 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  e */.  u8 eLock;
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
52c0: 54 45 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 42 74 4c  TE_LOCK */.  BtL
52d0: 6f 63 6b 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ock *pNext;     
52e0: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 42 74     /* Next in Bt
52f0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
5300: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 61 6e 64  t */.};../* Cand
5310: 69 64 61 74 65 20 76 61 6c 75 65 73 20 66 6f 72  idate values for
5320: 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f   BtLock.eLock */
5330: 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 4c 4f  .#define READ_LO
5340: 43 4b 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  CK     1.#define
5350: 20 57 52 49 54 45 5f 4c 4f 43 4b 20 20 20 20 32   WRITE_LOCK    2
5360: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5370: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
5380: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  E.  /*.  ** The 
5390: 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54  functions queryT
53a0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b  ableLock(), lock
53b0: 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f  Table() and unlo
53c0: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20  ckAllTables().  
53d0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
53e0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
53f0: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
5400: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
5410: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
5420: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
5430: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
5440: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
5450: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
5460: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
5470: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
5480: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
5490: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
54a0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
54b0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
54c0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
54d0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
54e0: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
54f0: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
5500: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
5510: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
5520: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
5530: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c  ueryTableLock(a,
5540: 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  b,c) SQLITE_OK. 
5550: 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62   #define lockTab
5560: 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  le(a,b,c) SQLITE
5570: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  _OK.  #define un
5580: 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29  lockAllTables(a)
5590: 0a 20 20 23 64 65 66 69 6e 65 20 72 65 73 74 6f  .  #define resto
55a0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
55b0: 6f 73 69 74 69 6f 6e 28 61 2c 62 29 20 53 51 4c  osition(a,b) SQL
55c0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
55d0: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
55e0: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
55f0: 0a 0a 23 65 6c 73 65 0a 0a 73 74 61 74 69 63 20  ..#else..static 
5600: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
5610: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5620: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  ;../*.** Save th
5630: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5640: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5650: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5660: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5670: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5680: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5690: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
56a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
56b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
56c0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
56d0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
56e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
56f0: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5700: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5710: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5720: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5730: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5740: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
5750: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
5760: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5770: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
5780: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
5790: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
57a0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
57b0: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
57c0: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
57d0: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
57e0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
57f0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
5800: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
5810: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
5820: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
5830: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
5840: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
5850: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
5860: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
5870: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
5880: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
5890: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58a0: 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70  OK && 0==pCur->p
58b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  Page->intKey){. 
58c0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
58d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 43 75  sqliteMalloc(pCu
58e0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  r->nKey);.    if
58f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ( pKey ){.      
5900: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5910: 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70 43  eKey(pCur, 0, pC
5920: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
5930: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
5940: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5950: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5960: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
5970: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5980: 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  teFree(pKey);.  
5990: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
59a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
59b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
59c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
59d0: 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
59e0: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
59f0: 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  y );..  if( rc==
5a00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5a10: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
5a20: 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
5a30: 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a  Cur->pPage = 0;.
5a40: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5a50: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5a60: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  ESEEK;.  }..  re
5a70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5a80: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a90: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5aa0: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
5ab0: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
5ac0: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
5ad0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
5ae0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
5af0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b00: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
5b10: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
5b20: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
5b30: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
5b40: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5b50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5b60: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5b70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5b80: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
5b90: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
5ba0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5bb0: 69 66 28 20 73 71 6c 69 74 65 33 54 68 72 65 61  if( sqlite3Threa
5bc0: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
5bd0: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 29  >useSharedData )
5be0: 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 2d  {.    for(p=pBt-
5bf0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5c00: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
5c10: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
5c20: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
5c30: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
5c40: 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  t) && .         
5c50: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5c60: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
5c70: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
5c80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5c90: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
5ca0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
5cb0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5cc0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
5cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5cf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
5d00: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
5d10: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
5d20: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
5d30: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
5d40: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
5d50: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5d60: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
5d70: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
5d80: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
5d90: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
5da0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
5db0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
5dc0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
5dd0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
5de0: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
5df0: 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ve restoreOrClea
5e00: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
5e10: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
5e20: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
5e30: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a  Position()..**.*
5e40: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
5e50: 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e  argument argumen
5e60: 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69 73 20  t - doSeek - is 
5e70: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
5e80: 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72  ead of .** retur
5e90: 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
5ea0: 74 6f 20 69 74 27 73 20 73 61 76 65 64 20 70 6f  to it's saved po
5eb0: 73 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65  sition, any save
5ec0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 64 65  d position is de
5ed0: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  leted.** and the
5ee0: 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 73 65   cursor state se
5ef0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41  t to CURSOR_INVA
5f00: 4c 49 44 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LID..*/.static i
5f10: 6e 74 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  nt restoreOrClea
5f20: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 58  rCursorPositionX
5f30: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
5f40: 20 69 6e 74 20 64 6f 53 65 65 6b 29 7b 0a 20 20   int doSeek){.  
5f50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5f60: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  OK;.  assert( sq
5f70: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
5f80: 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68  eadOnly()->useSh
5f90: 61 72 65 64 44 61 74 61 20 29 3b 0a 20 20 61 73  aredData );.  as
5fa0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
5fb0: 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te==CURSOR_REQUI
5fc0: 52 45 53 45 45 4b 20 29 3b 0a 20 20 70 43 75 72  RESEEK );.  pCur
5fd0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
5fe0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 69 66 28  R_INVALID;.  if(
5ff0: 20 64 6f 53 65 65 6b 20 29 7b 0a 20 20 20 20 72   doSeek ){.    r
6000: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6010: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
6020: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
6030: 4b 65 79 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  Key, &pCur->skip
6040: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6050: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6060: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
6070: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
6080: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6090: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
60a0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
60b0: 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 49  tate || CURSOR_I
60c0: 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
60d0: 74 61 74 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65  tate );.  }.  re
60e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
60f0: 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ine restoreOrCle
6100: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
6110: 28 70 2c 78 29 20 5c 0a 20 20 28 70 2d 3e 65 53  (p,x) \.  (p->eS
6120: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51  tate==CURSOR_REQ
6130: 55 49 52 45 53 45 45 4b 3f 72 65 73 74 6f 72 65  UIRESEEK?restore
6140: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
6150: 69 74 69 6f 6e 58 28 70 2c 78 29 3a 53 51 4c 49  itionX(p,x):SQLI
6160: 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 51 75  TE_OK)../*.** Qu
6170: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
6180: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
6190: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
61a0: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
61b0: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
61c0: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
61d0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
61e0: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
61f0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
6200: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
6210: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
6220: 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62   calling lockTab
6230: 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c  le()), or.** SQL
6240: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
6250: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6260: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
6270: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
6280: 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  Tab, u8 eLock){.
6290: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
62a0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
62b0: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 2f 2a  ck *pIter;..  /*
62c0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
62d0: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
62e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
62f0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  led */.  if( 0==
6300: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
6310: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
6320: 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20  SharedData ){.  
6330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6340: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  OK;.  }..  /* Th
6350: 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c  is (along with l
6360: 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77  ockTable()) is w
6370: 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63  here the ReadUnc
6380: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
6390: 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
63a0: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
63b0: 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20  is querying for 
63c0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20  a read-lock and 
63d0: 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a  the flag is.  **
63e0: 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f   set, it is unco
63f0: 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e  nditionally gran
6400: 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68  ted - even if th
6410: 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f  ere are write-lo
6420: 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  cks.  ** on the 
6430: 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74  table. If a writ
6440: 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e-lock is reques
6450: 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63  ted, the ReadUnc
6460: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20  ommitted flag.  
6470: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
6480: 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ered..  **.  ** 
6490: 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b  In function lock
64a0: 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65  Table(), if a re
64b0: 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e  ad-lock is deman
64c0: 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ded and the .  *
64d0: 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  * ReadUncommitte
64e0: 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e  d flag is set, n
64f0: 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64  o entry is added
6500: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69   to the locks li
6510: 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72  st .  ** (BtShar
6520: 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a  ed.pLock)..  **.
6530: 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a    ** To summariz
6540: 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e  e: If the ReadUn
6550: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
6560: 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64  s set, then read
6570: 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a   cursors do.  **
6580: 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72   not create or r
6590: 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63  espect table loc
65a0: 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  ks. The locking 
65b0: 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20  procedure for a 
65c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73  .  ** write-curs
65d0: 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  or does not chan
65e0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  ge..  */.  if( .
65f0: 20 20 20 20 21 70 2d 3e 70 53 71 6c 69 74 65 20      !p->pSqlite 
6600: 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 70  || .    0==(p->p
6610: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
6620: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
6630: 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c  tted) || .    eL
6640: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
6650: 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53  ||.    iTab==MAS
6660: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
6670: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
6680: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
6690: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
66a0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
66b0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
66c0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
66d0: 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20 20 20  =iTab && .      
66e0: 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63      (pIter->eLoc
66f0: 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63  k!=eLock || eLoc
6700: 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b  k!=READ_LOCK) ){
6710: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6720: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
6730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6740: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6750: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
6760: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
6770: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
6780: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
6790: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
67a0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
67b0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
67c0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
67d0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
67e0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
67f0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
6800: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6810: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
6820: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
6830: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
6840: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
6850: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
6860: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61  tatic int lockTa
6880: 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ble(Btree *p, Pg
6890: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
68a0: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
68b0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
68c0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
68d0: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
68e0: 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Iter;..  /* This
68f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
6900: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
6910: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
6920: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
6930: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
6940: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
6950: 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74  dData ){.    ret
6960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6970: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
6980: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61  LITE_OK==queryTa
6990: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
69a0: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
69b0: 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75  /* If the read-u
69c0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
69d0: 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61  is set and a rea
69e0: 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  d-lock is reques
69f0: 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ted,.  ** return
6a00: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61   early without a
6a10: 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74  dding an entry t
6a20: 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  o the BtShared.p
6a30: 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20  Lock list. See. 
6a40: 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66   ** comment in f
6a50: 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62  unction queryTab
6a60: 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72  leLock() for mor
6a70: 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69  e info on handli
6a80: 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61  ng .  ** the Rea
6a90: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
6aa0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
6ab0: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 29 20     (p->pSqlite) 
6ac0: 26 26 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c  && .    (p->pSql
6ad0: 69 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  ite->flags&SQLIT
6ae0: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
6af0: 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63  d) && .    (eLoc
6b00: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26  k==READ_LOCK) &&
6b10: 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53  .    iTable!=MAS
6b20: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
6b30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6b40: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  OK;.  }..  /* Fi
6b50: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
6b60: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
6b70: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
6b80: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
6b90: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
6ba0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
6bb0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
6bc0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
6bd0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
6be0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
6bf0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
6c00: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
6c10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6c20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
6c30: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
6c40: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
6c50: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
6c60: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
6c70: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
6c80: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
6c90: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
6ca0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
6cb0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
6cc0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
6cd0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  ock *)sqliteMall
6ce0: 6f 63 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  oc(sizeof(BtLock
6cf0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
6d00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
6d10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6d20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
6d30: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
6d40: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
6d50: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
6d60: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
6d70: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
6d80: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
6d90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
6da0: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
6db0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
6dc0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
6dd0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
6de0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
6df0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
6e00: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
6e10: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
6e20: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
6e30: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
6e40: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
6e50: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
6e60: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
6e70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
6e80: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
6e90: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
6ea0: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
6eb0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
6ec0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
6ed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6ee0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
6ef0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
6f00: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
6f10: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
6f20: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
6f30: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
6f40: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
6f50: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
6f60: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
6f70: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
6f80: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
6f90: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
6fa0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  t->pLock;..  /* 
6fb0: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  If the shared-ca
6fc0: 63 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  che extension is
6fd0: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 2c 20 74 68   not enabled, th
6fe0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  ere should be no
6ff0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 74  .  ** locks in t
7000: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
7010: 6b 20 6c 69 73 74 2c 20 6d 61 6b 69 6e 67 20 74  k list, making t
7020: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 20  his procedure a 
7030: 6e 6f 2d 6f 70 2e 20 41 73 73 65 72 74 0a 20 20  no-op. Assert.  
7040: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
7050: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
7060: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7070: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
7080: 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44  ly()->useSharedD
7090: 61 74 61 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ata || 0==*ppIte
70a0: 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  r );..  while( *
70b0: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
70c0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
70d0: 70 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20 70  pIter;.    if( p
70e0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
70f0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
7100: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
7110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7120: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65  e(pLock);.    }e
7130: 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65  lse{.      ppIte
7140: 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78  r = &pLock->pNex
7150: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  t;.    }.  }.}.#
7160: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7170: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
7180: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
7190: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
71a0: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  CUUM./*.** These
71b0: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74   macros define t
71c0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
71d0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
71e0: 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a 20 64  ntry for a .** d
71f0: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
7200: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
7210: 20 74 6f 20 65 61 63 68 20 69 73 20 74 68 65 20   to each is the 
7220: 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  number of usable
7230: 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65 61 63  .** bytes on eac
7240: 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  h page of the da
7250: 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20 31 30  tabase (often 10
7260: 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  24). The second 
7270: 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
7280: 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70  umber to look up
7290: 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
72a0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  map..**.** PTRMA
72b0: 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72 6e 73  P_PAGENO returns
72c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
72d0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
72e0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
72f0: 70 61 67 65 20 74 68 61 74 20 73 74 6f 72 65 73  page that stores
7300: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 70 6f   the required po
7310: 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f 50 54  inter. PTRMAP_PT
7320: 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e 73 0a  ROFFSET returns.
7330: 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  ** the offset of
7340: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
7350: 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ap entry..**.** 
7360: 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72 67 75  If the pgno argu
7370: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 50  ment passed to P
7380: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69 73 20  TRMAP_PAGENO is 
7390: 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
73a0: 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67 6e 6f  ge,.** then pgno
73b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 53 6f   is returned. So
73c0: 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50   (pgno==PTRMAP_P
73d0: 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f  AGENO(pgsz, pgno
73e0: 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75 73 65  )) can be.** use
73f0: 64 20 74 6f 20 74 65 73 74 20 69 66 20 70 67 6e  d to test if pgn
7400: 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d  o is a pointer-m
7410: 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41 50 5f  ap page. PTRMAP_
7420: 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65 6e 74  ISPAGE implement
7430: 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74 2e 0a  s.** this test..
7440: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41  */.#define PTRMA
7450: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67  P_PAGENO(pBt, pg
7460: 6e 6f 29 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  no) ptrmapPageno
7470: 28 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64 65 66  (pBt, pgno).#def
7480: 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  ine PTRMAP_PTROF
7490: 46 53 45 54 28 70 42 74 2c 20 70 67 6e 6f 29 20  FSET(pBt, pgno) 
74a0: 28 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61 70 50  (5*(pgno-ptrmapP
74b0: 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29  ageno(pBt, pgno)
74c0: 2d 31 29 29 0a 23 64 65 66 69 6e 65 20 50 54 52  -1)).#define PTR
74d0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
74e0: 70 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f 50 41  pgno) (PTRMAP_PA
74f0: 47 45 4e 4f 28 28 70 42 74 29 2c 28 70 67 6e 6f  GENO((pBt),(pgno
7500: 29 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73 74 61  ))==(pgno))..sta
7510: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
7520: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
7530: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
7540: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
7550: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
7560: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
7570: 0a 20 20 69 6e 74 20 69 50 74 72 4d 61 70 20 3d  .  int iPtrMap =
7580: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7590: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 69 6e  PerMapPage;.  in
75a0: 74 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70  t ret = (iPtrMap
75b0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
75c0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
75d0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
75e0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
75f0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
7600: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
7610: 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
7620: 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20  map is a lookup 
7630: 74 61 62 6c 65 20 74 68 61 74 20 69 64 65 6e 74  table that ident
7640: 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74  ifies the parent
7650: 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65 61 63   page for.** eac
7660: 68 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 20  h child page in 
7670: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7680: 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74 20 70  e.  The parent p
7690: 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
76a0: 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  that.** contains
76b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
76c0: 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72 79 20  e child.  Every 
76d0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
76e0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  base contains.**
76f0: 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74 20 70   0 or 1 parent p
7700: 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69 73 20  ages.  (In this 
7710: 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62 61 73  context 'databas
7720: 65 20 70 61 67 65 27 20 72 65 66 65 72 73 0a 2a  e page' refers.*
7730: 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20 74 68  * to any page th
7740: 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  at is not part o
7750: 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  f the pointer ma
7760: 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61 63 68  p itself.)  Each
7770: 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20   pointer map.** 
7780: 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20 6f  entry consists o
7790: 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  f a single byte 
77a0: 27 74 79 70 65 27 20 61 6e 64 20 61 20 34 20 62  'type' and a 4 b
77b0: 79 74 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  yte parent page 
77c0: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20 50  number..** The P
77d0: 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e 74 69  TRMAP_XXX identi
77e0: 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72 65 20  fiers below are 
77f0: 74 68 65 20 76 61 6c 69 64 20 74 79 70 65 73 2e  the valid types.
7800: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f  .**.** The purpo
7810: 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  se of the pointe
7820: 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61 63 69  r map is to faci
7830: 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61 67 65  lity moving page
7840: 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70 6f  s from one.** po
7850: 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69  sition in the fi
7860: 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 61 73  le to another as
7870: 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76 61 63   part of autovac
7880: 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70 61 67  uum.  When a pag
7890: 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c 20 74  e.** is moved, t
78a0: 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 69 74  he pointer in it
78b0: 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  s parent must be
78c0: 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
78d0: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20  t to the.** new 
78e0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  location.  The p
78f0: 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 75 73  ointer map is us
7900: 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
7910: 20 70 61 72 65 6e 74 20 70 61 67 65 20 71 75 69   parent page qui
7920: 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  ckly..**.** PTRM
7930: 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54 68 65  AP_ROOTPAGE: The
7940: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
7950: 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e 20 54  s a root-page. T
7960: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
7970: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
7980: 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20 69            used i
7990: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
79a0: 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  ** PTRMAP_FREEPA
79b0: 47 45 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  GE: The database
79c0: 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e 75 73   page is an unus
79d0: 65 64 20 28 66 72 65 65 29 20 70 61 67 65 2e 20  ed (free) page. 
79e0: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
79f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7a00: 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73 65 64       is not used
7a10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
7a20: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
7a30: 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74 61 62  FLOW1: The datab
7a40: 61 73 65 20 70 61 67 65 20 69 73 20 74 68 65 20  ase page is the 
7a50: 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 61 20  first page in a 
7a60: 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20 20 20  list of .**     
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
7a80: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
7a90: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 64  e page number id
7aa0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 67  entifies the pag
7ab0: 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  e that.**       
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
7ad0: 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 77 69  ains the cell wi
7ae0: 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  th a pointer to 
7af0: 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
7b00: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
7b10: 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68 65 20  _OVERFLOW2: The 
7b20: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73  database page is
7b30: 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 6c   the second or l
7b40: 61 74 65 72 20 70 61 67 65 20 69 6e 20 61 20 6c  ater page in a l
7b50: 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
7b70: 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
7b80: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64 65 6e  page-number iden
7b90: 74 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  tifies the previ
7ba0: 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ous.**          
7bb0: 20 20 20 20 20 20 20 20 20 70 61 67 65 20 69 6e           page in
7bc0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
7bd0: 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50  ge list..**.** P
7be0: 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54 68 65  TRMAP_BTREE: The
7bf0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
7c00: 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74 72  s a non-root btr
7c10: 65 65 20 70 61 67 65 2e 20 54 68 65 20 70 61 67  ee page. The pag
7c20: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
7c30: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
7c40: 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  fies the parent 
7c50: 70 61 67 65 20 69 6e 20 74 68 65 20 62 74 72 65  page in the btre
7c60: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54  e..*/.#define PT
7c70: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 31 0a  RMAP_ROOTPAGE 1.
7c80: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 46  #define PTRMAP_F
7c90: 52 45 45 50 41 47 45 20 32 0a 23 64 65 66 69 6e  REEPAGE 2.#defin
7ca0: 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  e PTRMAP_OVERFLO
7cb0: 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50 54 52  W1 3.#define PTR
7cc0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 34 0a  MAP_OVERFLOW2 4.
7cd0: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 42  #define PTRMAP_B
7ce0: 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57 72  TREE 5../*.** Wr
7cf0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
7d00: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
7d10: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
7d20: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
7d30: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7d40: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
7d50: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
7d60: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
7d70: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
7d80: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
7d90: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41  ber 'pgno'..** A
7da0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
7db0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
7dc0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7dd0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
7de0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
7df0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42   int ptrmapPut(B
7e00: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7e10: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
7e20: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a  , Pgno parent){.
7e30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7e40: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7e50: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50   map page */.  P
7e60: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 2f  gno iPtrmap;   /
7e70: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7e80: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
7e90: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7ea0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7eb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7ec0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
7ed0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7ee0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7ef0: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7f00: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7f10: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7f20: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7f30: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7f40: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7f50: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7f60: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7f70: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7f80: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
7f90: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7fa0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
7fb0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7fc0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7fd0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
7fe0: 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50  ager_get(pBt->pP
7ff0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 28  ager, iPtrmap, (
8000: 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d 61 70  void **)&pPtrmap
8010: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
8030: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
8040: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
8050: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
8060: 79 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  y);..  if( eType
8070: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
8080: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
8090: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
80a0: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
80b0: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
80c0: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
80d0: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
80e0: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
80f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
8100: 67 65 72 5f 77 72 69 74 65 28 70 50 74 72 6d 61  ger_write(pPtrma
8110: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
8120: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8130: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
8140: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
8150: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
8160: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
8170: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
8180: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  }..  sqlite3page
8190: 72 5f 75 6e 72 65 66 28 70 50 74 72 6d 61 70 29  r_unref(pPtrmap)
81a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
81b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
81c0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
81d0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
81e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
81f0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8200: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8210: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8220: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8230: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8240: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8250: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8260: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8270: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8280: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8290: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
82a0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
82b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
82c0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
82d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
82f0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8300: 6f 29 7b 0a 20 20 69 6e 74 20 69 50 74 72 6d 61  o){.  int iPtrma
8310: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8320: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8330: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8340: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8350: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8360: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
8370: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
8380: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8390: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
83a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 50  .  int rc;..  iP
83b0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
83c0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
83d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
83e0: 61 67 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50  ager_get(pBt->pP
83f0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 28  ager, iPtrmap, (
8400: 76 6f 69 64 20 2a 2a 29 26 70 50 74 72 6d 61 70  void **)&pPtrmap
8410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8430: 0a 20 20 7d 0a 0a 20 20 6f 66 66 73 65 74 20 3d  .  }..  offset =
8440: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
8450: 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61  T(pBt, key);.  a
8460: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
8470: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
8480: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
8490: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
84a0: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
84b0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
84c0: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
84d0: 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 74 72  pager_unref(pPtr
84e0: 6d 61 70 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  map);.  if( *pET
84f0: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
8500: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
8510: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8520: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8530: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
8540: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
8550: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
8560: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
8570: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
8580: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
8590: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
85a0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
85b0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
85c0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
85d0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
85e0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
85f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
8600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8610: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
8620: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
8630: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
8640: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  low cells..*/.st
8650: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c  atic u8 *findCel
8660: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
8670: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
8680: 75 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  u8 *data = pPage
8690: 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72  ->aData;.  asser
86a0: 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20  t( iCell>=0 );. 
86b0: 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67   assert( iCell<g
86c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
86d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
86e0: 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  ]) );.  return d
86f0: 61 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26  ata + get2byte(&
8700: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
8710: 4f 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29  Offset+2*iCell])
8720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8730: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
8740: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
8750: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
8760: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
8770: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
8780: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65  rflow cells.  Se
8790: 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74  e insert.*/.stat
87a0: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
87b0: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
87c0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
87d0: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
87e0: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
87f0: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
8800: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
8810: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
8820: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
8830: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
8840: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
8850: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
8860: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
8870: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
8880: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
8890: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
88a0: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
88b0: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
88c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
88d0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
88e0: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
88f0: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
8900: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
8910: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
8920: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
8930: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
8940: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
8950: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61  is function.  pa
8960: 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20  rseCell() takes 
8970: 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20  a cell index.** 
8980: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
8990: 67 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65  gument and parse
89a0: 43 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20  CellPtr() takes 
89b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
89c0: 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20  .** body of the 
89d0: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
89e0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
89f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
8a00: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
8a10: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8a20: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8a30: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8a40: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a60: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8a70: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8a80: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8a90: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8aa0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8ab0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20   */.){.  int n; 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
8ae0: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
8af0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
8b00: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
8b10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8b20: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
8b30: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49  payload */..  pI
8b40: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
8b50: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
8b60: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
8b70: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
8b80: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
8b90: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
8ba0: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
8bb0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
8bc0: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
8bd0: 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  a ){.    n += ge
8be0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
8bf0: 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b  [n], &nPayload);
8c00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
8c10: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a  ayload = 0;.  }.
8c20: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
8c30: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28   nPayload;.  if(
8c40: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
8c50: 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  {.    n += getVa
8c60: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
8c70: 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e  (u64 *)&pInfo->n
8c80: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
8c90: 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20     u32 x;.    n 
8ca0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
8cb0: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20  pCell[n], &x);. 
8cc0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
8cd0: 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   x;.    nPayload
8ce0: 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e   += x;.  }.  pIn
8cf0: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
8d00: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
8d10: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
8d30: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
8d40: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
8d50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
8d60: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
8d70: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8d80: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
8d90: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
8da0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  */.    int nSize
8db0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
8dc0: 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  tal size of cell
8dd0: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65   content in byte
8de0: 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  s */.    pInfo->
8df0: 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61  nLocal = nPayloa
8e00: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
8e10: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
8e20: 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61   nSize = nPayloa
8e30: 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e  d + n;.    if( n
8e40: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20  Size<4 ){.      
8e50: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
8e60: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
8e70: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
8e80: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
8e90: 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20  nSize = nSize;. 
8ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
8eb0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
8ec0: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
8ed0: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
8ee0: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
8ef0: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
8f00: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8f10: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8f20: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8f30: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
8f40: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
8f50: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
8f60: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
8f70: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
8f80: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
8f90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
8fa0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
8fb0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
8fc0: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
8fd0: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
8fe0: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
8ff0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
9000: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
9010: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
9020: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
9030: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
9040: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
9050: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9060: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9070: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
9080: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9090: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
90a0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
90b0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
90c0: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
90d0: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
90e0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
90f0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
9100: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
9110: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9120: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9130: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9140: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
9150: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
9160: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
9170: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
9180: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
9190: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
91a0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
91b0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
91c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
91d0: 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70  4);.    if( surp
91e0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
91f0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
9200: 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73  nLocal = surplus
9210: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9220: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9230: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
9240: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
9250: 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d  verflow = pInfo-
9260: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20  >nLocal + n;.   
9270: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9280: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
9290: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74   + 4;.  }.}.stat
92a0: 69 63 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c  ic void parseCel
92b0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
92c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
92d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
92e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
92f0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
9300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
9310: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
9320: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
9330: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9340: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9350: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9360: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
9370: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
9380: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
9390: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
93a0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
93b0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
93c0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
93d0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
93e0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
93f0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
9400: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
9410: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
9420: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
9430: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
9440: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
9450: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
9460: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
9470: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
9480: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
9490: 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ter..*/.#ifndef 
94a0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
94b0: 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  t cellSize(MemPa
94c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
94d0: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
94e0: 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43  o info;.  parseC
94f0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9500: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
9510: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
9520: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
9530: 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  nt cellSizePtr(M
9540: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
9550: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
9560: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61  lInfo info;.  pa
9570: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
9580: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
9590: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
95a0: 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Size;.}..#ifndef
95b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
95c0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
95d0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
95e0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
95f0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
9600: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
9610: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
9620: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
9630: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
9640: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
9650: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
9660: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
9670: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
9680: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9690: 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70  *pCell){.  if( p
96a0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c  Cell ){.    Cell
96b0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
96c0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
96d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
96e0: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e  ;.    if( (info.
96f0: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
9700: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
9710: 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
9720: 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66  {.      Pgno ovf
9730: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
9740: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
9750: 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ow]);.      retu
9760: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
9770: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9780: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9790: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
97a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
97b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
97c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
97d0: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
97e0: 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20  l on page pPage 
97f0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
9800: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
9810: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
9820: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
9830: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
9840: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
9850: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
9860: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
9870: 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tOvfl(MemPage *p
9880: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
9890: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  {.  u8 *pCell;. 
98a0: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
98b0: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
98c0: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
98d0: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
98e0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
98f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
9900: 2a 2a 20 44 6f 20 73 61 6e 69 74 79 20 63 68 65  ** Do sanity che
9910: 63 6b 69 6e 67 20 6f 6e 20 61 20 70 61 67 65 2e  cking on a page.
9920: 20 20 54 68 72 6f 77 20 61 6e 20 65 78 63 65 70    Throw an excep
9930: 74 69 6f 6e 20 69 66 20 61 6e 79 74 68 69 6e 67  tion if anything
9940: 20 69 73 0a 2a 2a 20 6e 6f 74 20 72 69 67 68 74   is.** not right
9950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9960: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
9970: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
9980: 63 68 65 63 6b 69 6e 67 20 6f 6e 6c 79 2e 20 20  checking only.  
9990: 49 74 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  It is omitted.**
99a0: 20 66 72 6f 6d 20 6d 6f 73 74 20 62 75 69 6c 64   from most build
99b0: 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
99c0: 64 28 42 54 52 45 45 5f 44 45 42 55 47 29 20 26  d(BTREE_DEBUG) &
99d0: 26 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  & !defined(NDEBU
99e0: 47 29 20 26 26 20 30 0a 73 74 61 74 69 63 20 76  G) && 0.static v
99f0: 6f 69 64 20 5f 70 61 67 65 49 6e 74 65 67 72 69  oid _pageIntegri
9a00: 74 79 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ty(MemPage *pPag
9a10: 65 29 7b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  e){.  int usable
9a20: 53 69 7a 65 3b 0a 20 20 75 38 20 2a 64 61 74 61  Size;.  u8 *data
9a30: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 69 64  ;.  int i, j, id
9a40: 78 2c 20 63 2c 20 70 63 2c 20 68 64 72 2c 20 6e  x, c, pc, hdr, n
9a50: 46 72 65 65 3b 0a 20 20 69 6e 74 20 63 65 6c 6c  Free;.  int cell
9a60: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 43  Offset;.  int nC
9a70: 65 6c 6c 2c 20 63 65 6c 6c 4c 69 6d 69 74 3b 0a  ell, cellLimit;.
9a80: 20 20 75 38 20 2a 75 73 65 64 3b 0a 0a 20 20 75    u8 *used;..  u
9a90: 73 65 64 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  sed = sqliteMall
9aa0: 6f 63 52 61 77 28 20 70 50 61 67 65 2d 3e 70 42  ocRaw( pPage->pB
9ab0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
9ac0: 20 69 66 28 20 75 73 65 64 3d 3d 30 20 29 20 72   if( used==0 ) r
9ad0: 65 74 75 72 6e 3b 0a 20 20 75 73 61 62 6c 65 53  eturn;.  usableS
9ae0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9af0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9b00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
9b10: 44 61 74 61 3d 3d 26 28 28 75 6e 73 69 67 6e 65  Data==&((unsigne
9b20: 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b 2d  d char*)pPage)[-
9b30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
9b40: 53 69 7a 65 5d 20 29 3b 0a 20 20 68 64 72 20 3d  Size] );.  hdr =
9b50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9b60: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64 72  t;.  assert( hdr
9b70: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
9b80: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
9b90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9ba0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61  >pgno==sqlite3pa
9bb0: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70  ger_pagenumber(p
9bc0: 50 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Page->aData) );.
9bd0: 20 20 63 20 3d 20 70 50 61 67 65 2d 3e 61 44 61    c = pPage->aDa
9be0: 74 61 5b 68 64 72 5d 3b 0a 20 20 69 66 28 20 70  ta[hdr];.  if( p
9bf0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
9c00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9c10: 65 2d 3e 6c 65 61 66 20 3d 3d 20 28 28 63 20 26  e->leaf == ((c &
9c20: 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 29 20 29   PTF_LEAF)!=0) )
9c30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9c40: 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 3d  age->zeroData ==
9c50: 20 28 28 63 20 26 20 50 54 46 5f 5a 45 52 4f 44   ((c & PTF_ZEROD
9c60: 41 54 41 29 21 3d 30 29 20 29 3b 0a 20 20 20 20  ATA)!=0) );.    
9c70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9c80: 65 61 66 44 61 74 61 20 3d 3d 20 28 28 63 20 26  eafData == ((c &
9c90: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 29 21 3d   PTF_LEAFDATA)!=
9ca0: 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
9cb0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
9cc0: 3d 3d 20 28 28 63 20 26 20 28 50 54 46 5f 49 4e  == ((c & (PTF_IN
9cd0: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
9ce0: 41 29 29 21 3d 30 29 20 29 3b 0a 20 20 20 20 61  A))!=0) );.    a
9cf0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 61  ssert( pPage->ha
9d00: 73 44 61 74 61 20 3d 3d 0a 20 20 20 20 20 20 20  sData ==.       
9d10: 20 20 20 20 20 20 21 28 70 50 61 67 65 2d 3e 7a        !(pPage->z
9d20: 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61  eroData || (!pPa
9d30: 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67  ge->leaf && pPag
9d40: 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 20 29 3b  e->leafData)) );
9d50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9d60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3d 3d  ge->cellOffset==
9d70: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9d80: 2b 31 32 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  +12-4*pPage->lea
9d90: 66 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f );.    assert(
9da0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
9db0: 67 65 74 32 62 79 74 65 28 26 70 50 61 67 65 2d  get2byte(&pPage-
9dc0: 3e 61 44 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  >aData[hdr+3]) )
9dd0: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 20 3d 20 70  ;.  }.  data = p
9de0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  Page->aData;.  m
9df0: 65 6d 73 65 74 28 75 73 65 64 2c 20 30 2c 20 75  emset(used, 0, u
9e00: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 66 6f  sableSize);.  fo
9e10: 72 28 69 3d 30 3b 20 69 3c 68 64 72 2b 31 30 2d  r(i=0; i<hdr+10-
9e20: 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 20 69  pPage->leaf*4; i
9e30: 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b  ++) used[i] = 1;
9e40: 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
9e50: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
9e60: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77  ata[hdr+1]);.  w
9e70: 68 69 6c 65 28 20 70 63 20 29 7b 0a 20 20 20 20  hile( pc ){.    
9e80: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 20 20 61 73  int size;.    as
9e90: 73 65 72 74 28 20 70 63 3e 30 20 26 26 20 70 63  sert( pc>0 && pc
9ea0: 3c 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  <usableSize-4 );
9eb0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
9ec0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9ed0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9ee0: 63 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  c+size<=usableSi
9ef0: 7a 65 20 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  ze );.    nFree 
9f00: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 66 6f 72  += size;.    for
9f10: 28 69 3d 70 63 3b 20 69 3c 70 63 2b 73 69 7a 65  (i=pc; i<pc+size
9f20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
9f30: 73 65 72 74 28 20 75 73 65 64 5b 69 5d 3d 3d 30  sert( used[i]==0
9f40: 20 29 3b 0a 20 20 20 20 20 20 75 73 65 64 5b 69   );.      used[i
9f50: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 1;.    }.   
9f60: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
9f70: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 0a 20  data[pc]);.  }. 
9f80: 20 69 64 78 20 3d 20 30 3b 0a 20 20 6e 43 65 6c   idx = 0;.  nCel
9f90: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
9fa0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
9fb0: 6c 6c 4c 69 6d 69 74 20 3d 20 67 65 74 32 62 79  llLimit = get2by
9fc0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9fd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9fe0: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 0a 20 20  e->isInit==0 .  
9ff0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 2d         || pPage-
a000: 3e 6e 46 72 65 65 3d 3d 6e 46 72 65 65 2b 64 61  >nFree==nFree+da
a010: 74 61 5b 68 64 72 2b 37 5d 2b 63 65 6c 6c 4c 69  ta[hdr+7]+cellLi
a020: 6d 69 74 2d 28 63 65 6c 6c 4f 66 66 73 65 74 2b  mit-(cellOffset+
a030: 32 2a 6e 43 65 6c 6c 29 20 29 3b 0a 20 20 63 65  2*nCell) );.  ce
a040: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a050: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a060: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
a070: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
a080: 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 67  size;.    pc = g
a090: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
a0a0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 69 5d 29 3b 0a  llOffset+2*i]);.
a0b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 30      assert( pc>0
a0c0: 20 26 26 20 70 63 3c 75 73 61 62 6c 65 53 69 7a   && pc<usableSiz
a0d0: 65 2d 34 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  e-4 );.    size 
a0e0: 3d 20 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  = cellSize(pPage
a0f0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
a100: 20 20 61 73 73 65 72 74 28 20 70 63 2b 73 69 7a    assert( pc+siz
a110: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e<=usableSize );
a120: 0a 20 20 20 20 66 6f 72 28 6a 3d 70 63 3b 20 6a  .    for(j=pc; j
a130: 3c 70 63 2b 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a  <pc+size; j++){.
a140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73        assert( us
a150: 65 64 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  ed[j]==0 );.    
a160: 20 20 75 73 65 64 5b 6a 5d 20 3d 20 31 3b 0a 20    used[j] = 1;. 
a170: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
a180: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
a190: 65 6c 6c 3b 20 69 3c 63 65 6c 6c 69 6d 69 74 3b  ell; i<cellimit;
a1a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
a1b0: 74 28 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29 3b  t( used[i]==0 );
a1c0: 0a 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31  .    used[i] = 1
a1d0: 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20  ;.  }.  nFree = 
a1e0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
a1f0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
a200: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 73  {.    assert( us
a210: 65 64 5b 69 5d 3c 3d 31 20 29 3b 0a 20 20 20 20  ed[i]<=1 );.    
a220: 69 66 28 20 75 73 65 64 5b 69 5d 3d 3d 30 20 29  if( used[i]==0 )
a230: 20 6e 46 72 65 65 2b 2b 3b 0a 20 20 7d 0a 20 20   nFree++;.  }.  
a240: 61 73 73 65 72 74 28 20 6e 46 72 65 65 3d 3d 64  assert( nFree==d
a250: 61 74 61 5b 68 64 72 2b 37 5d 20 29 3b 0a 20 20  ata[hdr+7] );.  
a260: 73 71 6c 69 74 65 46 72 65 65 28 75 73 65 64 29  sqliteFree(used)
a270: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 67 65  ;.}.#define page
a280: 49 6e 74 65 67 72 69 74 79 28 58 29 20 5f 70 61  Integrity(X) _pa
a290: 67 65 49 6e 74 65 67 72 69 74 79 28 58 29 0a 23  geIntegrity(X).#
a2a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
a2b0: 67 65 49 6e 74 65 67 72 69 74 79 28 58 29 0a 23  geIntegrity(X).#
a2c0: 65 6e 64 69 66 0a 0a 2f 2a 20 41 20 62 75 6e 63  endif../* A bunc
a2d0: 68 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  h of assert() st
a2e0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 63 68 65 63  atements to chec
a2f0: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
a300: 6e 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  n state variable
a310: 73 0a 2a 2a 20 6f 66 20 68 61 6e 64 6c 65 20 70  s.** of handle p
a320: 20 28 74 79 70 65 20 42 74 72 65 65 2a 29 20 61   (type Btree*) a
a330: 72 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  re internally co
a340: 6e 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 23 64 65  nsistent..*/.#de
a350: 66 69 6e 65 20 62 74 72 65 65 49 6e 74 65 67 72  fine btreeIntegr
a360: 69 74 79 28 70 29 20 5c 0a 20 20 61 73 73 65 72  ity(p) \.  asser
a370: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  t( p->inTrans!=T
a380: 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e  RANS_NONE || p->
a390: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
a3a0: 6e 3c 70 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29  n<p->pBt->nRef )
a3b0: 3b 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ; \.  assert( p-
a3c0: 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
a3d0: 6f 6e 3c 3d 70 2d 3e 70 42 74 2d 3e 6e 52 65 66  on<=p->pBt->nRef
a3e0: 20 29 3b 20 5c 0a 20 20 61 73 73 65 72 74 28 20   ); \.  assert( 
a3f0: 70 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  p->pBt->inTransa
a400: 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 4e 4f 4e  ction!=TRANS_NON
a410: 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72  E || p->pBt->nTr
a420: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 29 3b 20  ansaction==0 ); 
a430: 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  \.  assert( p->p
a440: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
a450: 6e 3e 3d 70 2d 3e 69 6e 54 72 61 6e 73 20 29 3b  n>=p->inTrans );
a460: 20 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d   ../*.** Defragm
a470: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
a480: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
a490: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
a4a0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
a4b0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
a4c0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
a4d0: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
a4e0: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
a4f0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
a500: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
a510: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
a520: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
a530: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a550: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
a560: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
a570: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a590: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
a5a0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5c0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74  Address of a i-t
a5d0: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
a5e0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
a5f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
a600: 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61   of first byte a
a610: 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65  fter cell pointe
a620: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
a630: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
a640: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
a650: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
a660: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
a670: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
a680: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a690: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
a6a0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
a6b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a6c0: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
a6d0: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
a6e0: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
a6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
a700: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
a710: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
a720: 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20  /.  int brk;    
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a740: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
a750: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a760: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
a770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a780: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a790: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
a7a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
a7b0: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
a7c0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
a7d0: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
a7e0: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
a7f0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
a800: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
a810: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
a820: 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
a830: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 61 44  teable(pPage->aD
a840: 61 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ata) );.  assert
a850: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
a860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a870: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a880: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
a890: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
a8a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a8b0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
a8c0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d    temp = sqliteM
a8d0: 61 6c 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42  alloc( pPage->pB
a8e0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
a8f0: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72   if( temp==0 ) r
a900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a910: 45 4d 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  EM;.  data = pPa
a920: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
a930: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
a940: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
a950: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
a960: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
a970: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
a980: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
a990: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a9a0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
a9b0: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
a9c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
a9d0: 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
a9e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
a9f0: 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b  .  memcpy(&temp[
aa00: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
aa10: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62  , usableSize - b
aa20: 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61  rk);.  brk = usa
aa30: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
aa40: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
aa50: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
aa60: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
aa70: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
aa80: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
aa90: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
aaa0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
aab0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
aac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
aad0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
aae0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
aaf0: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
ab00: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
ab10: 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73  ]);.    brk -= s
ab20: 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ize;.    memcpy(
ab30: 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d  &data[brk], &tem
ab40: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
ab50: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
ab60: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73  , brk);.  }.  as
ab70: 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f  sert( brk>=cellO
ab80: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
ab90: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
aba0: 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a  a[hdr+5], brk);.
abb0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
abc0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
abd0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
abe0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
abf0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
ac00: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
ac10: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62  data[addr], 0, b
ac20: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  rk-addr);.  sqli
ac30: 74 65 46 72 65 65 28 74 65 6d 70 29 3b 0a 20 20  teFree(temp);.  
ac40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ac50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
ac60: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
ac70: 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61  of space on a pa
ac80: 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ge..**.** Return
ac90: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
aca0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f  pPage->aData[] o
acb0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
acc0: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61   of.** the new a
acd0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65  llocation. Or re
ace0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
acf0: 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72  is not enough fr
ad00: 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74  ee.** space on t
ad10: 68 65 20 70 61 67 65 20 74 6f 20 73 61 74 69 73  he page to satis
ad20: 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  fy the allocatio
ad30: 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  n request..**.**
ad40: 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   If the page con
ad50: 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66 20  tains nBytes of 
ad60: 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20 64  free space but d
ad70: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  oes not contain.
ad80: 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e  ** nBytes of con
ad90: 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70 61  tiguous free spa
ada0: 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ce, then this ro
adb0: 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63 61  utine automatica
adc0: 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66  lly.** calls def
add0: 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20 74  ragementPage() t
ade0: 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c  o consolidate al
adf0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65 66  l free space bef
ae00: 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  ore .** allocati
ae10: 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e 6b  ng the new chunk
ae20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ae30: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
ae40: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ae50: 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  t nByte){.  int 
ae60: 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20  addr, pc, hdr;. 
ae70: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74   int size;.  int
ae80: 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f   nFrag;.  int to
ae90: 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  p;.  int nCell;.
aea0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
aeb0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
aec0: 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64 61  r *data;.  .  da
aed0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
aee0: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  a;.  assert( sql
aef0: 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
af00: 65 61 62 6c 65 28 64 61 74 61 29 20 29 3b 0a 20  eable(data) );. 
af10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af20: 70 42 74 20 29 3b 0a 20 20 69 66 28 20 6e 42 79  pBt );.  if( nBy
af30: 74 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34  te<4 ) nByte = 4
af40: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
af50: 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50  Free<nByte || pP
af60: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
af70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
af80: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e  Page->nFree -= n
af90: 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50  Byte;.  hdr = pP
afa0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
afb0: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
afc0: 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46  hdr+7];.  if( nF
afd0: 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a  rag<60 ){.    /*
afe0: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
aff0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
b000: 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75   a slot big enou
b010: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
b020: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72  e.    ** space r
b030: 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61  equest. */.    a
b040: 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20  ddr = hdr+1;.   
b050: 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65   while( (pc = ge
b060: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
b070: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  r]))>0 ){.      
b080: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
b090: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
b0a0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
b0b0: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
b0c0: 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20  f( size<nByte+4 
b0d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
b0e0: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
b0f0: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
b100: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
b110: 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20  dr+7] = nFrag + 
b120: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
b130: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
b140: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
b150: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  {.          put2
b160: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
b170: 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20  , size-nByte);. 
b180: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b190: 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  pc + size - nByt
b1a0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
b1b0: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
b1c0: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
b1d0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
b1e0: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
b1f0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
b200: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
b210: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
b220: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
b230: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
b240: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b250: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
b260: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b270: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
b280: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
b290: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
b2a0: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
b2b0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
b2c0: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
b2d0: 79 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64  yte ){.    if( d
b2e0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b2f0: 61 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  age) ) return 0;
b300: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
b310: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b320: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
b330: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
b340: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
b350: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
b360: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b370: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
b380: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
b390: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
b3a0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
b3b0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
b3c0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
b3d0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b3e0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
b3f0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
b400: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
b410: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
b420: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
b430: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
b440: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
b450: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
b460: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
b470: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
b480: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
b490: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
b4a0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
b4b0: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
b4c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
b4d0: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
b4e0: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
b4f0: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
b500: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
b510: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
b520: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
b530: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
b540: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b550: 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
b560: 6c 65 28 64 61 74 61 29 20 29 3b 0a 20 20 61 73  le(data) );.  as
b570: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
b580: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
b590: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
b5a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
b5b0: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
b5c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b5d0: 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73  eSize );.  if( s
b5e0: 69 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34  ize<4 ) size = 4
b5f0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
b600: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
b610: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
b620: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
b630: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
b640: 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c  n the SECURE_DEL
b650: 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  ETE .  ** option
b660: 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63   is enabled at c
b670: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20  ompile-time */. 
b680: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74   memset(&data[st
b690: 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a  art], 0, size);.
b6a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
b6b0: 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20   the space back 
b6c0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
b6d0: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
b6e0: 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  ks */.  hdr = pP
b6f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
b700: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
b710: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
b720: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
b730: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
b740: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
b750: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
b760: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
b770: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
b780: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
b790: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
b7a0: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
b7b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
b7c0: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
b7d0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
b7e0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
b7f0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
b800: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
b810: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
b820: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
b830: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
b840: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
b850: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
b860: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
b870: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a  ge->nFree += siz
b880: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
b890: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
b8a0: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
b8b0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
b8c0: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
b8d0: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
b8e0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
b8f0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
b900: 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20  pnext, psize;.  
b910: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
b920: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
b930: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
b940: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b950: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65  ize-4 );.    pne
b960: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
b970: 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20  ata[pbegin]);.  
b980: 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79    psize = get2by
b990: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b9a0: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  2]);.    if( pbe
b9b0: 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20  gin + psize + 3 
b9c0: 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78  >= pnext && pnex
b9d0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
b9e0: 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20   frag = pnext - 
b9f0: 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a  (pbegin+psize);.
ba00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72        assert( fr
ba10: 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e  ag<=data[pPage->
ba20: 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a  hdrOffset+7] );.
ba30: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
ba40: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
ba50: 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75  = frag;.      pu
ba60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ba70: 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26  gin], get2byte(&
ba80: 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20  data[pnext]));. 
ba90: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
baa0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70  ata[pbegin+2], p
bab0: 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64  next+get2byte(&d
bac0: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62  ata[pnext+2])-pb
bad0: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  egin);.    }else
bae0: 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  {.      addr = p
baf0: 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begin;.    }.  }
bb00: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65  ..  /* If the ce
bb10: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
bb20: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72  begins with a fr
bb30: 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20  eeblock, remove 
bb40: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74  it. */.  if( dat
bb50: 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68  a[hdr+1]==data[h
bb60: 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64  dr+5] && data[hd
bb70: 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36  r+2]==data[hdr+6
bb80: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70  ] ){.    int top
bb90: 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67  ;.    pbegin = g
bba0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
bbb0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+1]);.    memcp
bbc0: 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  y(&data[hdr+1], 
bbd0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32  &data[pbegin], 2
bbe0: 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  );.    top = get
bbf0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bc00: 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  5]);.    put2byt
bc10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
bc20: 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26  top + get2byte(&
bc30: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29  data[pbegin+2]))
bc40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
bc50: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
bc60: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
bc70: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
bc80: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
bc90: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
bca0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
bcb0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
bcc0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
bcd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63  .static void dec
bce0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
bcf0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
bd00: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
bd10: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
bd20: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
bd30: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
bd50: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
bd60: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
bd70: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  );.  pPage->intK
bd80: 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26  ey = (flagByte &
bd90: 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46   (PTF_INTKEY|PTF
bda0: 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a  _LEAFDATA))!=0;.
bdb0: 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74    pPage->zeroDat
bdc0: 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  a = (flagByte & 
bdd0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30  PTF_ZERODATA)!=0
bde0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
bdf0: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
be00: 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50  F_LEAF)!=0;.  pP
be10: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
be20: 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65  e = 4*(pPage->le
be30: 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20  af==0);.  pBt = 
be40: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
be50: 28 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46  ( flagByte & PTF
be60: 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20  _LEAFDATA ){.   
be70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
be80: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
be90: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
bea0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
beb0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
bec0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
bed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
bee0: 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a  ->leafData = 0;.
bef0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
bf00: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
bf10: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
bf20: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
bf30: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
bf40: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
bf50: 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
bf60: 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
bf70: 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
bf80: 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a  afData));.}../*.
bf90: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
bfa0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
bfb0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
bfc0: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
bfd0: 54 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  The pParent para
bfe0: 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20  meter must be a 
bff0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
c000: 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20  emPage which.** 
c010: 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  is the parent of
c020: 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
c030: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
c040: 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42  e root of a.** B
c050: 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65  Tree has no pare
c060: 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68  nt and so for th
c070: 61 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74  at page, pParent
c080: 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ==NULL..**.** Re
c090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
c0a0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
c0b0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
c0c0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
c0d0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
c0e0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
c0f0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
c100: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
c110: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
c120: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
c130: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
c140: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
c150: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
c160: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
c170: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
c180: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
c190: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
c1a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
c1b0: 6e 74 20 69 6e 69 74 50 61 67 65 28 0a 20 20 4d  nt initPage(.  M
c1c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
c1d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
c1e0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
c1f0: 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  zed */.  MemPage
c200: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20   *pParent       
c210: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20  /* The parent.  
c220: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c230: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  .){.  int pc;   
c240: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c250: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
c260: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
c270: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  >aData[] */.  in
c280: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
c290: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
c2a0: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
c2b0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
c2c0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
c2d0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
c2e0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
c2f0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
c300: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
c310: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
c320: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
c330: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
c340: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
c350: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
c360: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
c370: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
c380: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
c390: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
c3a0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
c3b0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
c3c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
c3d0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
c3e0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
c3f0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
c400: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
c410: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
c420: 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20   area */..  pBt 
c430: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
c440: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
c450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
c460: 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  ent==0 || pParen
c470: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
c480: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c490: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 70 61 67  pgno==sqlite3pag
c4a0: 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 70 50  er_pagenumber(pP
c4b0: 61 67 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20  age->aData) );. 
c4c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c4d0: 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69  aData == &((unsi
c4e0: 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65  gned char*)pPage
c4f0: 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
c500: 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ] );.  if( pPage
c510: 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65  ->pParent!=pPare
c520: 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50  nt && (pPage->pP
c530: 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67  arent!=0 || pPag
c540: 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20  e->isInit) ){.  
c550: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
c560: 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  page should neve
c570: 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20  r change unless 
c580: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
c590: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
c5a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5b0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
c5c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
c5d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c5e0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
c5f0: 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50  pParent==0 && pP
c600: 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20  arent!=0 ){.    
c610: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
c620: 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71   pParent;.    sq
c630: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 70  lite3pager_ref(p
c640: 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
c650: 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
c660: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
c670: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c680: 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  ata;.  decodeFla
c690: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
c6a0: 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  dr]);.  pPage->n
c6b0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
c6c0: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
c6d0: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
c6e0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
c6f0: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
c700: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
c710: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
c720: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
c730: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
c740: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c750: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c760: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c770: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28  a[hdr+3]);.  if(
c780: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
c790: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
c7a0: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
c7b0: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
c7c0: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
c7d0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
c7e0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
c7f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c800: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
c810: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ge->nCell==0 && 
c820: 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50  pParent!=0 && pP
c830: 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  arent->pgno!=1 )
c840: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67  {.    /* All pag
c850: 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20  es must have at 
c860: 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20  least one cell, 
c870: 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20  except for root 
c880: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  pages */.    ret
c890: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c8a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
c8b0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c8c0: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c8d0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c8e0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c8f0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
c900: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
c910: 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c  +7] + top - (cel
c920: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
c930: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69  e->nCell);.  whi
c940: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
c950: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
c960: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
c970: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
c980: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69   /* Free block i
c990: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
c9a0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
c9b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c9c0: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
c9d0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
c9e0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73  data[pc]);.    s
c9f0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
ca00: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
ca10: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
ca20: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
ca30: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
ca40: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
ca50: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
ca60: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
ca70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ca80: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
ca90: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
caa0: 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a  .    pc = next;.
cab0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
cac0: 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66  ee = nFree;.  if
cad0: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
cae0: 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72  ize ){.    /* Fr
caf0: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
cb00: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
cb10: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65  e size */.    re
cb20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
cb30: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
cb40: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
cb50: 3d 20 31 3b 0a 20 20 70 61 67 65 49 6e 74 65 67  = 1;.  pageInteg
cb60: 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20 20 72  rity(pPage);.  r
cb70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
cb90: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
cba0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
cbb0: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
cbc0: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
cbd0: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
cbe0: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
cbf0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
cc00: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
cc10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
cc20: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
cc30: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
cc40: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
cc50: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
cc60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
cc70: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
cc80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61  ssert( sqlite3pa
cc90: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 64  ger_pagenumber(d
cca0: 61 74 61 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  ata)==pPage->pgn
ccb0: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
ccc0: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
ccd0: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
cce0: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
ccf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cd00: 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
cd10: 6c 65 28 64 61 74 61 29 20 29 3b 0a 20 20 6d 65  le(data) );.  me
cd20: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
cd30: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
cd40: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61  ize - hdr);.  da
cd50: 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b  ta[hdr] = flags;
cd60: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
cd70: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
cd80: 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20  TF_LEAF)==0);.  
cd90: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
cda0: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
cdb0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
cdc0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
cdd0: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
cde0: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
cdf0: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  e->nFree = pBt->
ce00: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
ce10: 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  st;.  decodeFlag
ce20: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
ce30: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
ce40: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
ce50: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
ce60: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
ce70: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
ce80: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
ce90: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  t = 0;.  pPage->
cea0: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
ceb0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
cec0: 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28    pageIntegrity(
ced0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cee0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
cef0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
cf00: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
cf10: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
cf20: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
cf30: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
cf40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
cf50: 65 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20  etPage(BtShared 
cf60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pBt, Pgno pgno,
cf70: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
cf80: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
cf90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
cfa0: 44 61 74 61 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Data;.  MemPage 
cfb0: 2a 70 50 61 67 65 3b 0a 20 20 72 63 20 3d 20 73  *pPage;.  rc = s
cfc0: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
cfd0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
cfe0: 6f 2c 20 28 76 6f 69 64 2a 2a 29 26 61 44 61 74  o, (void**)&aDat
cff0: 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  a);.  if( rc ) r
d000: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
d010: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  e = (MemPage*)&a
d020: 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
d030: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ze];.  pPage->aD
d040: 61 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70  ata = aData;.  p
d050: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
d060: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
d070: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
d080: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
d090: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
d0a0: 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20   : 0;.  *ppPage 
d0b0: 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = pPage;.  retur
d0c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0d0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
d0e0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d0f0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
d100: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
d110: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
d120: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
d130: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
d140: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65  e calls to.** ge
d150: 74 50 61 67 65 28 29 20 61 6e 64 20 69 6e 69 74  tPage() and init
d160: 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
d170: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
d180: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d190: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
d1a0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d1b0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d1c0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
d1d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
d1e0: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
d1f0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
d200: 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e,    /* Write t
d210: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
d220: 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  here */.  MemPag
d230: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f  e *pParent     /
d240: 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20  * Parent of the 
d250: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
d260: 20 72 63 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d   rc;.  if( pgno=
d270: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d280: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d290: 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20  BKPT; .  }.  rc 
d2a0: 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 70  = getPage(pBt, p
d2b0: 67 6e 6f 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  gno, ppPage);.  
d2c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d2d0: 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e  K && (*ppPage)->
d2e0: 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
d2f0: 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 2a   rc = initPage(*
d300: 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  ppPage, pParent)
d310: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d320: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
d330: 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
d340: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
d350: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
d360: 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
d370: 6c 20 74 6f 20 67 65 74 50 61 67 65 2e 0a 2a 2f  l to getPage..*/
d380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d390: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d3a0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d3b0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d3c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d3d0: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d3e0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d3f0: 20 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67     assert( &pPag
d400: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
d410: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d  pBt->pageSize]==
d420: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
d430: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 73 71 6c  pPage );.    sql
d440: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
d450: 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
d460: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
d470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d480: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
d490: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
d4a0: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
d4b0: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
d4c0: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
d4d0: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
d4e0: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
d4f0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
d500: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
d510: 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  r(void *pData, i
d520: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
d530: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
d540: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
d550: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
d560: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
d570: 65 2a 29 26 28 28 63 68 61 72 2a 29 70 44 61 74  e*)&((char*)pDat
d580: 61 29 5b 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  a)[pageSize];.  
d590: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
d5a0: 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  nt ){.    MemPag
d5b0: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
d5c0: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
d5d0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
d5e0: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
d5f0: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
d600: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
d610: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
d620: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
d630: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
d640: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
d650: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
d660: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
d670: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
d680: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
d690: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
d6a0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d6b0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
d6c0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
d6d0: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
d6e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
d6f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d700: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
d710: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
d720: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
d730: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
d740: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
d750: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
d760: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
d770: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 76 6f  id pageReinit(vo
d780: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70  id *pData, int p
d790: 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50  ageSize){.  MemP
d7a0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
d7b0: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
d7c0: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61  & 7)==0 );.  pPa
d7d0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  ge = (MemPage*)&
d7e0: 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 70  ((char*)pData)[p
d7f0: 61 67 65 53 69 7a 65 5d 3b 0a 20 20 69 66 28 20  ageSize];.  if( 
d800: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
d810: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d820: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 69 74  it = 0;.    init
d830: 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
d840: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e->pParent);.  }
d850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d860: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d870: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d880: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d890: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d8a0: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d8b0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65   is NULL.** a ne
d8c0: 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  w database with 
d8d0: 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73  a random name is
d8e0: 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20   created.  This 
d8f0: 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a  randomly named.*
d900: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
d910: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
d920: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
d930: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
d940: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
d950: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
d960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d970: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
d980: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
d990: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
d9a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
d9b0: 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20  lite3 *pSqlite, 
d9c0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
d9d0: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
d9e0: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
d9f0: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
da00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
da10: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
da20: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
da30: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
da50: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  ions */.){.  BtS
da60: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
da70: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
da80: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
da90: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
daa0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
dab0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
dac0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
dad0: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65   rc;.  int nRese
dae0: 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  rve;.  unsigned 
daf0: 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
db00: 30 30 5d 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  00];.#if !define
db10: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
db20: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
db30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
db40: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 63 6f  MIT_DISKIO).  co
db50: 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a  nst ThreadData *
db60: 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69 66 0a 0a  pTsdro;.#endif..
db70: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
db80: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
db90: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
dba0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
dbb0: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
dbc0: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
dbd0: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
dbe0: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
dbf0: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
dc00: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
dc10: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
dc20: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
dc30: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
dc40: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
dc50: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
dc60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dc70: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
dc80: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
dc90: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
dca0: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
dcb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
dcc0: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
dcd0: 69 73 4d 65 6d 64 62 20 3d 20 21 7a 46 69 6c 65  isMemdb = !zFile
dce0: 6e 61 6d 65 3b 0a 20 20 23 65 6c 73 65 0a 20 20  name;.  #else.  
dcf0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
dd00: 62 20 3d 20 21 7a 46 69 6c 65 6e 61 6d 65 20 7c  b = !zFilename |
dd10: 7c 20 28 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  | (strcmp(zFilen
dd20: 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
dd30: 3f 30 3a 31 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ?0:1);.  #endif.
dd40: 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73 71  #endif..  p = sq
dd50: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
dd60: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
dd70: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
dd80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
dd90: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
dda0: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
ddb0: 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53   p->pSqlite = pS
ddc0: 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72 79  qlite;..  /* Try
ddd0: 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73   to find an exis
dde0: 74 69 6e 67 20 42 74 72 65 65 20 73 74 72 75 63  ting Btree struc
ddf0: 74 75 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20 7a  ture opened on z
de00: 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66  Filename. */.#if
de10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
de20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
de30: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
de40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
de50: 49 4f 29 0a 20 20 70 54 73 64 72 6f 20 3d 20 73  IO).  pTsdro = s
de60: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
de70: 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
de80: 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61  ( pTsdro->useSha
de90: 72 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65  redData && zFile
dea0: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
deb0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   ){.    char *zF
dec0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
ded0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
dee0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
def0: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
df00: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
df10: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20  sqliteFree(p);. 
df20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
df30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
df40: 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 73 64      for(pBt=pTsd
df50: 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b  ro->pBtree; pBt;
df60: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
df70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
df80: 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
df90: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
dfa0: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
dfb0: 2c 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66  , sqlite3pager_f
dfc0: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
dfd0: 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ger)) ){.       
dfe0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
dff0: 20 20 20 20 20 20 20 2a 70 70 42 74 72 65 65 20         *ppBtree 
e000: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 42 74  = p;.        pBt
e010: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
e020: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
e030: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e040: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
e060: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
e070: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e080: 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  e);.  }.#endif..
e090: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    /*.  ** The fo
e0a0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
e0b0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
e0c0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
e0d0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
e0e0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
e0f0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
e100: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
e110: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
e120: 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65   result.  ** whe
e130: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
e140: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
e150: 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  tecture..  */.  
e160: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
e170: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
e180: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (i64)==4 );.  as
e190: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
e1a0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
e1b0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65  64)==4 );.  asse
e1c0: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
e1d0: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
e1e0: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
e1f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
e200: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a  of(Pgno)==4 );..
e210: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61    pBt = sqliteMa
e220: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42  lloc( sizeof(*pB
e230: 74 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d  t) );.  if( pBt=
e240: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 74 72  =0 ){.    *ppBtr
e250: 65 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ee = 0;.    sqli
e260: 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72  teFree(p);.    r
e270: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e280: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
e290: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
e2a0: 28 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  (&pBt->pPager, z
e2b0: 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f  Filename, EXTRA_
e2c0: 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20  SIZE, flags);.  
e2d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e2e0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
e2f0: 2d 3e 70 50 61 67 65 72 20 29 20 73 71 6c 69 74  ->pPager ) sqlit
e300: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 70 42  e3pager_close(pB
e310: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
e320: 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b  sqliteFree(pBt);
e330: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e340: 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
e350: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e360: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42   rc;.  }.  p->pB
e370: 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69  t = pBt;..  sqli
e380: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73  te3pager_set_des
e390: 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61  tructor(pBt->pPa
e3a0: 67 65 72 2c 20 70 61 67 65 44 65 73 74 72 75 63  ger, pageDestruc
e3b0: 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 70  tor);.  sqlite3p
e3c0: 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65  ager_set_reinite
e3d0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
e3e0: 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42  ageReinit);.  pB
e3f0: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
e400: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e410: 30 3b 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  0;.  pBt->readOn
e420: 6c 79 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  ly = sqlite3page
e430: 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  r_isreadonly(pBt
e440: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
e450: 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66  ite3pager_read_f
e460: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
e470: 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 7a 44  Pager, sizeof(zD
e480: 62 48 65 61 64 65 72 29 2c 20 7a 44 62 48 65 61  bHeader), zDbHea
e490: 64 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  der);.  pBt->pag
e4a0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
e4b0: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
e4c0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
e4d0: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
e4e0: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
e4f0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
e500: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
e510: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
e520: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
e530: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  {.    pBt->pageS
e540: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
e550: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
e560: 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65      pBt->maxEmbe
e570: 64 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a  dFrac = 64;   /*
e580: 20 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d   25% */.    pBt-
e590: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
e5a0: 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a  32;   /* 12.5% *
e5b0: 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  /.    pBt->minLe
e5c0: 61 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20  afFrac = 32;    
e5d0: 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e  /* 12.5% */.#ifn
e5e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e5f0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f  AUTOVACUUM.    /
e600: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
e610: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
e620: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
e630: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e640: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f  , then.    ** do
e650: 20 6e 6f 74 20 73 65 74 20 74 68 65 20 61 75 74   not set the aut
e660: 6f 2d 76 61 63 75 75 6d 20 66 6c 61 67 2c 20 65  o-vacuum flag, e
e670: 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 45  ven if SQLITE_DE
e680: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
e690: 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2e  .    ** is true.
e6a0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
e6b0: 6e 64 2c 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  nd, if SQLITE_OM
e6c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
e6d0: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20  been defined,.  
e6e0: 20 20 2a 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f    ** then ":memo
e6f0: 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 20 72  ry:" is just a r
e700: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
e710: 2e 20 52 65 73 70 65 63 74 20 74 68 65 20 61 75  . Respect the au
e720: 74 6f 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  to-vacuum.    **
e730: 20 64 65 66 61 75 6c 74 20 69 6e 20 74 68 69 73   default in this
e740: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
e750: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
e760: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
e770: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
e780: 63 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45  cuum = SQLITE_DE
e790: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
e7a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e7b0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
e7c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52  .  }else{.    nR
e7d0: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
e7e0: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d  er[20];.    pBt-
e7f0: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20  >maxEmbedFrac = 
e800: 7a 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20  zDbHeader[21];. 
e810: 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64     pBt->minEmbed
e820: 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72  Frac = zDbHeader
e830: 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [22];.    pBt->m
e840: 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62  inLeafFrac = zDb
e850: 48 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20  Header[23];.    
e860: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
e870: 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
e880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e890: 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
e8a0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
e8b0: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
e8c0: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
e8d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e8e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e8f0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
e900: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 61 73  - nReserve;.  as
e910: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
e920: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
e930: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
e940: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
e950: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67   */.  sqlite3pag
e960: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
e970: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
e980: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69  ->pageSize);..#i
e990: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
e9a0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e9b0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
e9c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
e9d0: 4b 49 4f 29 0a 20 20 2f 2a 20 41 64 64 20 74 68  KIO).  /* Add th
e9e0: 65 20 6e 65 77 20 62 74 72 65 65 20 74 6f 20 74  e new btree to t
e9f0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
ea00: 74 61 72 74 69 6e 67 20 61 74 20 54 68 72 65 61  tarting at Threa
ea10: 64 44 61 74 61 2e 70 42 74 72 65 65 2e 0a 20 20  dData.pBtree..  
ea20: 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63  ** There is no c
ea30: 68 61 6e 63 65 20 74 68 61 74 20 61 20 6d 61 6c  hance that a mal
ea40: 6c 6f 63 28 29 20 6d 61 79 20 66 61 69 6c 20 69  loc() may fail i
ea50: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 0a 20 20  nside of the .  
ea60: 2a 2a 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  ** sqlite3Thread
ea70: 44 61 74 61 28 29 20 63 61 6c 6c 2c 20 61 73 20  Data() call, as 
ea80: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 73  the ThreadData s
ea90: 74 72 75 63 74 75 72 65 20 6d 75 73 74 20 68 61  tructure must ha
eaa0: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
eab0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 66  been allocated f
eac0: 6f 72 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68  or pTsdro->useSh
ead0: 61 72 65 64 44 61 74 61 20 74 6f 20 62 65 20 6e  aredData to be n
eae0: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  on-zero..  */.  
eaf0: 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53  if( pTsdro->useS
eb00: 68 61 72 65 64 44 61 74 61 20 26 26 20 7a 46 69  haredData && zFi
eb10: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
eb20: 64 62 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  db ){.    pBt->p
eb30: 4e 65 78 74 20 3d 20 70 54 73 64 72 6f 2d 3e 70  Next = pTsdro->p
eb40: 42 74 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74  Btree;.    sqlit
eb50: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e  e3ThreadData()->
eb60: 70 42 74 72 65 65 20 3d 20 70 42 74 3b 0a 20 20  pBtree = pBt;.  
eb70: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  }.#endif.  pBt->
eb80: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 2a 70 70 42  nRef = 1;.  *ppB
eb90: 74 72 65 65 20 3d 20 70 3b 0a 20 20 72 65 74 75  tree = p;.  retu
eba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ebb0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
ebc0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
ebd0: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
ebe0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
ebf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
ec00: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
ec10: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ec20: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
ec30: 6f 72 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64  or *pCur;..#ifnd
ec40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ec50: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 54 68  HARED_CACHE.  Th
ec60: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a  readData *pTsd;.
ec70: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f  #endif..  /* Clo
ec80: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
ec90: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
eca0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75  andle.  */.  pCu
ecb0: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
ecc0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
ecd0: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
ece0: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
ecf0: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
ed00: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
ed10: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
ed20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ed30: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
ed40: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
ed50: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
ed60: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
ed70: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
ed80: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
ed90: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
eda0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
edb0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
edc0: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
edd0: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
ede0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
edf0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
ee00: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
ee10: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 0a 23  qliteFree(p);..#
ee20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
ee40: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
ee50: 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
ee60: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
ee70: 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
ee80: 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
ee90: 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
eea0: 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
eeb0: 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
eec0: 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
eed0: 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
eee0: 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
eef0: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
ef00: 30 20 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  0 );.  pBt->nRef
ef10: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
ef20: 52 65 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Ref ){.    retur
ef30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
ef40: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
ef50: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 66  e shared-btree f
ef60: 72 6f 6d 20 74 68 65 20 74 68 72 65 61 64 20 77  rom the thread w
ef70: 69 64 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a  ide list. Call .
ef80: 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 52    ** ThreadDataR
ef90: 65 61 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68  eadOnly() and th
efa0: 65 6e 20 63 61 73 74 20 61 77 61 79 20 74 68 65  en cast away the
efb0: 20 63 6f 6e 73 74 20 70 72 6f 70 65 72 74 79 20   const property 
efc0: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69  of the .  ** poi
efd0: 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 61 6c  nter to avoid al
efe0: 6c 6f 63 61 74 69 6e 67 20 74 68 72 65 61 64 20  locating thread 
eff0: 64 61 74 61 20 69 66 20 69 74 20 69 73 20 6e 6f  data if it is no
f000: 74 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  t really require
f010: 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d  d..  */.  pTsd =
f020: 20 28 54 68 72 65 61 64 44 61 74 61 20 2a 29 73   (ThreadData *)s
f030: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
f040: 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
f050: 28 20 70 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d  ( pTsd->pBtree==
f060: 70 42 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pBt ){.    asser
f070: 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33  t( pTsd==sqlite3
f080: 54 68 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a  ThreadData() );.
f090: 20 20 20 20 70 54 73 64 2d 3e 70 42 74 72 65 65      pTsd->pBtree
f0a0: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
f0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42 74 53 68   }else{.    BtSh
f0c0: 61 72 65 64 20 2a 70 50 72 65 76 3b 0a 20 20 20  ared *pPrev;.   
f0d0: 20 66 6f 72 28 70 50 72 65 76 3d 70 54 73 64 2d   for(pPrev=pTsd-
f0e0: 3e 70 42 74 72 65 65 3b 20 70 50 72 65 76 20 26  >pBtree; pPrev &
f0f0: 26 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d  & pPrev->pNext!=
f100: 70 42 74 3b 20 70 50 72 65 76 3d 70 50 72 65 76  pBt; pPrev=pPrev
f110: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69  ->pNext){}.    i
f120: 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20  f( pPrev ){.    
f130: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 3d 3d    assert( pTsd==
f140: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
f150: 61 28 29 20 29 3b 0a 20 20 20 20 20 20 70 50 72  a() );.      pPr
f160: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ev->pNext = pBt-
f170: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
f180: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
f190: 6c 6f 73 65 20 74 68 65 20 70 61 67 65 72 20 61  lose the pager a
f1a0: 6e 64 20 66 72 65 65 20 74 68 65 20 73 68 61 72  nd free the shar
f1b0: 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
f1c0: 72 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  re */.  assert( 
f1d0: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
f1e0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
f1f0: 63 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  close(pBt->pPage
f200: 72 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 78  r);.  if( pBt->x
f210: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
f220: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
f230: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
f240: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
f250: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
f260: 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ee(pBt->pSchema)
f270: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
f280: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
f290: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f2a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73  * Change the bus
f2b0: 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y handler callba
f2c0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ck function..*/.
f2d0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f2e0: 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42  SetBusyHandler(B
f2f0: 74 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e  tree *p, BusyHan
f300: 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b  dler *pHandler){
f310: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f320: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74   = p->pBt;.  pBt
f330: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
f340: 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c   pHandler;.  sql
f350: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
f360: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
f370: 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29  Pager, pHandler)
f380: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f390: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f3a0: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
f3b0: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
f3c0: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
f3d0: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
f3e0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
f3f0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
f400: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
f410: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
f420: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
f430: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
f440: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
f450: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
f460: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
f470: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
f480: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
f490: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
f4a0: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
f4b0: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
f4c0: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
f4d0: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
f4e0: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
f4f0: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
f500: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
f510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
f520: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
f530: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
f540: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
f550: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
f560: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
f570: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
f580: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
f590: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
f5a0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
f5b0: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
f5c0: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
f5d0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
f5e0: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
f5f0: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
f600: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
f610: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
f620: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
f630: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
f640: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
f650: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f660: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
f670: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
f680: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
f690: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f6a0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
f6b0: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 70 42  set_cachesize(pB
f6c0: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
f6d0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
f6e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f6f0: 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
f700: 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
f710: 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
f720: 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
f730: 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
f740: 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
f750: 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
f760: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
f770: 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
f780: 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
f790: 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
f7a0: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
f7b0: 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
f7c0: 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
f7d0: 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
f7e0: 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
f7f0: 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
f800: 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
f810: 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
f820: 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
f830: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
f840: 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
f850: 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
f860: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
f870: 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
f880: 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
f890: 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
f8a0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
f8b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
f8c0: 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
f8d0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
f8e0: 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
f8f0: 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
f900: 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
f910: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f920: 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
f930: 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74  3pager_set_safet
f940: 79 5f 6c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  y_level(pBt->pPa
f950: 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
f960: 53 79 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Sync);.  return 
f970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
f980: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
f990: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
f9a0: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
f9b0: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
f9c0: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
f9d0: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
f9e0: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
f9f0: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
fa00: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
fa10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
fa20: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
fa30: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
fa40: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
fa50: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
fa60: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
fa70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
fa80: 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28 70 42 74  pager_nosync(pBt
fa90: 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69  ->pPager);.}..#i
faa0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
fab0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
fac0: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
fad0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
fae0: 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
faf0: 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
fb00: 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
fb10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
fb20: 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
fb30: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
fb40: 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
fb50: 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
fb60: 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
fb70: 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
fb80: 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
fb90: 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
fba0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
fbb0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
fbc0: 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
fbd0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
fbe0: 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
fbf0: 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
fc00: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
fc10: 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
fc20: 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
fc30: 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
fc40: 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
fc50: 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
fc60: 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
fc70: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
fc80: 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
fc90: 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
fca0: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
fcb0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
fcc0: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
fcd0: 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
fce0: 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
fcf0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
fd00: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
fd10: 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
fd20: 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
fd30: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
fd40: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
fd50: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
fd60: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
fd70: 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
fd80: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fd90: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
fda0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
fdb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fdc0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
fdd0: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
fde0: 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
fdf0: 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
fe00: 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
fe10: 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  leSize;.  }.  if
fe20: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
fe30: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
fe40: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
fe50: 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
fe60: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
fe70: 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
fe80: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
fe90: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
fea0: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
feb0: 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
fec0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
fed0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 71 6c  ->pageSize = sql
fee0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61  ite3pager_set_pa
fef0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
ff00: 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  er, pageSize);. 
ff10: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
ff20: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
ff30: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
ff40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ff50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ff60: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
ff70: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
ff80: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
ff90: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
ffa0: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
ffb0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
ffc0: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
ffd0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
ffe0: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
fff0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
10000 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
10010 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
10020 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
10030 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10040 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
10050 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
10060 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
10070 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
10080 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
10090 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
100a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
100b0 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
100c0 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
100d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
100e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
100f0 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
10100 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
10110 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
10120 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
10130 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
10140 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
10150 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
10160 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
10170 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
10180 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
10190 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
101a0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
101b0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
101c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
101d0 3d 20 70 2d 3e 70 42 74 3b 3b 0a 23 69 66 64 65  = p->pBt;;.#ifde
101e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
101f0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
10200 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
10210 59 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70  Y;.#else.  if( p
10220 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
10230 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
10240 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
10250 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f  .  }.  pBt->auto
10260 56 61 63 75 75 6d 20 3d 20 28 61 75 74 6f 56 61  Vacuum = (autoVa
10270 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 72 65 74  cuum?1:0);.  ret
10280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
10290 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
102a0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
102b0 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
102c0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
102d0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
102e0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
102f0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
10300 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
10310 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
10320 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
10330 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
10340 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
10350 55 4d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  UM.  return 0;.#
10360 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 2d  else.  return p-
10370 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
10380 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
10390 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
103a0 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
103b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
103c0 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
103d0 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
103e0 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
103f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
10400 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10410 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
10420 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
10430 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
10440 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
10450 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
10460 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
10470 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
10480 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
10490 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
104a0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
104b0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
104c0 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
104d0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
104e0 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
104f0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
10500 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6c 6f  if there is a lo
10510 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 76  cking protocol v
10520 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  iolation..*/.sta
10530 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
10540 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10550 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65  {.  int rc, page
10560 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Size;.  MemPage 
10570 2a 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70  *pPage1;.  if( p
10580 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74  Bt->pPage1 ) ret
10590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
105a0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
105b0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 29 3b 0a  t, 1, &pPage1);.
105c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
105d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
105e0 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  .  ..  /* Do som
105f0 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
10600 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
10610 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
10620 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
10630 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
10640 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
10650 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
10660 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
10670 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  r_pagecount(pBt-
10680 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20  >pPager)>0 ){.  
10690 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
106a0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
106b0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
106c0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
106d0 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
106e0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
106f0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10700 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
10710 3e 31 20 7c 7c 20 70 61 67 65 31 5b 31 39 5d 3e  >1 || page1[19]>
10720 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
10730 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10740 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
10750 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
10760 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20  (&page1[16]);.  
10770 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
10780 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
10790 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
107a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
107b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
107c0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
107d0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  7)==0 );.    pBt
107e0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
107f0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
10800 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
10810 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
10820 5d 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ];.    if( pBt->
10830 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29  usableSize<500 )
10840 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
10850 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
10860 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d      }.    pBt->m
10870 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61  axEmbedFrac = pa
10880 67 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74  ge1[21];.    pBt
10890 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
108a0 20 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20   page1[22];.    
108b0 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
108c0 20 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69   = page1[23];.#i
108d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
108e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
108f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
10900 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
10910 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
10920 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
10930 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
10940 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
10950 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
10960 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
10970 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
10980 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
10990 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
109a0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
109b0 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
109c0 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
109d0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
109e0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
109f0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
10a00 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
10a10 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
10a20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
10a30 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
10a40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10a50 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
10a60 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
10a70 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
10a80 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
10a90 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
10aa0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
10ab0 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
10ac0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
10ad0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
10ae0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
10af0 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
10b00 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
10b10 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
10b20 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
10b30 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
10b40 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
10b50 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
10b60 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
10b70 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
10b80 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
10b90 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10ba0 2d 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62  -12)*pBt->maxEmb
10bb0 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b  edFrac/255 - 23;
10bc0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
10bd0 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10be0 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
10bf0 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20  EmbedFrac/255 - 
10c00 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
10c10 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
10c20 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
10c30 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
10c40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
10c50 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61  *pBt->minLeafFra
10c60 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66  c/255 - 23;.  if
10c70 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e  ( pBt->minLocal>
10c80 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c  pBt->maxLocal ||
10c90 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30   pBt->maxLocal<0
10ca0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   ){.    goto pag
10cb0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
10cc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
10cd0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
10ce0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
10cf0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
10d00 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
10d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10d20 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
10d30 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
10d40 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
10d50 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
10d60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10d70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10d80 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
10d90 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65  lockBtree() exce
10da0 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20  pt that it also 
10db0 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62  invokes the.** b
10dc0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
10dd0 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f  there is lock co
10de0 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ntention..*/.sta
10df0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
10e00 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65  eWithRetry(Btree
10e10 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72   *pRef){.  int r
10e20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10e30 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61   if( pRef->inTra
10e40 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
10e50 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73  {.    u8 inTrans
10e60 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70  action = pRef->p
10e70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10e80 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65  n;.    btreeInte
10e90 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20  grity(pRef);.   
10ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10eb0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65  eeBeginTrans(pRe
10ec0 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d  f, 0);.    pRef-
10ed0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
10ee0 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74  ion = inTransact
10ef0 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69  ion;.    pRef->i
10f00 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
10f10 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ONE;.    if( rc=
10f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10f30 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e      pRef->pBt->n
10f40 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
10f50 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e     }.    btreeIn
10f60 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
10f70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10f80 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  }.       ../*.**
10f90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
10fa0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
10fb0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
10fc0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
10fd0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
10fe0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
10ff0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
11000 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
11010 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
11020 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
11030 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
11040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11050 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
11060 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
11070 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
11080 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
11090 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
110a0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c  tanding cursors,
110b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
110c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
110d0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
110e0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
110f0 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
11100 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
11110 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
11120 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
11130 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
11140 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  ){.  if( pBt->in
11150 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
11160 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
11170 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42  pCursor==0 && pB
11180 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
11190 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
111a0 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b  ge1->aData==0 ){
111b0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
111c0 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
111d0 67 65 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ge1;.      pPage
111e0 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a  ->aData = &((u8*
111f0 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61  )pPage)[-pBt->pa
11200 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 70  geSize];.      p
11210 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
11220 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67  .      pPage->pg
11230 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  no = 1;.    }.  
11240 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
11250 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
11260 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
11270 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
11280 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
11290 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
112a0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
112b0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
112c0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
112d0 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
112e0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
112f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
11300 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
11310 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
11320 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
11330 63 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  c;.  if( sqlite3
11340 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
11350 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
11360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11370 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  K;.  pP1 = pBt->
11380 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
11390 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
113a0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
113b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
113c0 61 67 65 72 5f 77 72 69 74 65 28 64 61 74 61 29  ager_write(data)
113d0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
113e0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
113f0 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
11400 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
11410 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
11420 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
11430 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
11440 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
11450 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67  ta[16], pBt->pag
11460 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31  eSize);.  data[1
11470 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
11480 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32  9] = 1;.  data[2
11490 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  0] = pBt->pageSi
114a0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
114b0 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d  Size;.  data[21]
114c0 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64   = pBt->maxEmbed
114d0 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d  Frac;.  data[22]
114e0 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64   = pBt->minEmbed
114f0 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d  Frac;.  data[23]
11500 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46   = pBt->minLeafF
11510 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  rac;.  memset(&d
11520 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
11530 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
11540 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
11550 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
11560 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
11570 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
11580 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
11590 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
115a0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
115b0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 70  oVacuum ){.    p
115c0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
115d0 20 2b 20 34 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d   + 4*4], 1);.  }
115e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
115f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11600 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
11610 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
11620 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
11630 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
11640 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
11650 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11660 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
11670 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
11680 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
11690 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
116a0 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
116b0 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
116c0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
116d0 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
116e0 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
116f0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
11700 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
11710 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
11720 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
11730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
11740 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
11750 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
11760 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
11770 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
11780 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
11790 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
117a0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
117b0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
117c0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
117d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
117e0 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
117f0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
11800 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
11810 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
11820 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
11830 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
11840 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
11850 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
11860 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
11870 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
11880 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
11890 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
118a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
118b0 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
118c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
118d0 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
118e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
118f0 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
11900 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11910 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
11920 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
11930 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
11940 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
11950 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
11960 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
11970 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
11980 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
11990 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
119a0 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
119b0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
119c0 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
119d0 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
119e0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
119f0 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
11a00 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
11a10 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
11a20 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
11a30 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
11a40 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
11a50 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
11a60 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
11a70 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
11a80 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
11a90 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
11aa0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
11ab0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
11ac0 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
11ad0 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
11ae0 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
11af0 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
11b00 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
11b10 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
11b20 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
11b30 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
11b40 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
11b50 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
11b60 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
11b70 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
11b80 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
11b90 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
11ba0 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
11bb0 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
11bc0 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
11bd0 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
11be0 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
11bf0 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
11c00 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
11c10 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
11c20 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
11c30 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
11c40 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
11c50 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
11c60 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
11c70 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
11c80 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
11c90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11ca0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
11cb0 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
11cc0 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
11cd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11ce0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
11cf0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62 74 72 65  LITE_OK;..  btre
11d00 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
11d10 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
11d20 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
11d30 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
11d40 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
11d50 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
11d60 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
11d70 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
11d80 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
11d90 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
11da0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
11db0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
11dc0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
11dd0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
11de0 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
11df0 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74  flag) ){.    ret
11e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11e10 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
11e20 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
11e30 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
11e40 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
11e50 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42  base */.  if( pB
11e60 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
11e70 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rflag ){.    ret
11e80 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11e90 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  NLY;.  }..  /* I
11ea0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
11eb0 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
11ec0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
11ed0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11ee0 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
11ef0 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
11f00 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
11f10 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
11f20 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
11f30 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
11f40 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f  QLITE_BUSY..  */
11f50 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
11f60 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11f70 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61 67  _WRITE && wrflag
11f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11f90 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
11fa0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20  .  do {.    if( 
11fb0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
11fc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63  {.      rc = loc
11fd0 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
11fe0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
11ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
12000 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72  rflag ){.      r
12010 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
12020 5f 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  _begin(pBt->pPag
12030 65 31 2d 3e 61 44 61 74 61 2c 20 77 72 66 6c 61  e1->aData, wrfla
12040 67 3e 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  g>1);.      if( 
12050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65  .        rc = ne
12070 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
12080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12090 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
120a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
120b0 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
120c0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
120d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
120e0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
120f0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
12100 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
12110 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
12120 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
12130 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
12140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
12150 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
12160 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c  (pBt->pBusyHandl
12170 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  er) );..  if( rc
12180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12190 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
121a0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
121b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
121c0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
121d0 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
121e0 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
121f0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
12200 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
12210 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
12220 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
12230 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
12240 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
12250 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ns;.    }.  }.. 
12260 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12270 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12280 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12290 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
122a0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
122b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
122c0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
122d0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
122e0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
122f0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
12300 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
12310 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
12320 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
12330 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
12340 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
12350 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
12360 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
12370 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
12380 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
12390 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
123c0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
123d0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12400 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
12410 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
12420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12440 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
12450 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12460 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
12470 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
12480 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
12490 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
124a0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69  ge->pgno;..  ini
124b0 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
124c0 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
124d0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
124e0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
124f0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
12500 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
12510 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
12520 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
12530 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
12540 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12560 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
12570 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
12580 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
12590 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
125a0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
125b0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
125c0 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
125d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
125e0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
125f0 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
12600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12610 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
12620 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
12630 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
12640 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
12650 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
12660 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
12670 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12680 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12690 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
126a0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
126b0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
126c0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
126d0 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
126e0 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
126f0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12700 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
12710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
12720 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
12730 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
12740 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  enteed to be a b
12750 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
12760 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
12770 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
12780 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
12790 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
127a0 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
127b0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
127c0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
127d0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
127e0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
127f0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
12800 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
12810 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
12820 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
12830 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
12840 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
12850 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
12880 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12890 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
128a0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
128b0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
128c0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
128d0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
128e0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
128f0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
12900 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
12910 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
12920 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
12930 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
12940 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
12950 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
12960 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
12970 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
12980 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
12990 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
129a0 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
129b0 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
129c0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
129d0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
129e0 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65 54  eType){.  if( eT
129f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
12a00 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
12a10 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
12a20 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
12a30 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
12a40 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
12a50 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
12a60 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
12a70 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
12a80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12a90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12aa0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
12ab0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
12ac0 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
12ad0 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
12ae0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
12af0 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
12b00 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
12b10 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61      initPage(pPa
12b20 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
12b30 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
12b40 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12b50 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12b60 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
12b70 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
12b80 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
12b90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12ba0 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12bb0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12bc0 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
12bd0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
12be0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
12bf0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
12c00 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
12c10 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
12c20 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
12c30 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
12c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
12c50 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
12c60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
12c70 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
12c80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12c90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12cb0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
12cc0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
12cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
12ce0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
12cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12d00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12d20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
12d30 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
12d40 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
12d50 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
12d60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
12d70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
12d80 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
12d90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
12da0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12db0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
12dc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
12dd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
12de0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
12df0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
12e00 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12e10 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
12e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12e30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12e40 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
12e50 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
12e60 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
12e70 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
12e80 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
12e90 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
12ea0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
12eb0 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
12ec0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
12ed0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12ee0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
12ef0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
12f00 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
12f10 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
12f20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
12f30 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
12f40 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12f50 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
12f60 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
12f70 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
12f80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12f90 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
12fa0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
12fb0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
12fc0 20 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20   iFreePage      
12fd0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
12fe0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
12ff0 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  Page to */.){.  
13000 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
13010 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
13020 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
13030 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
13040 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
13050 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
13060 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
13070 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
13080 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
13090 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
130a0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
130b0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
130c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
130d0 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
130e0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
130f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
13100 54 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d  TPAGE );..  /* M
13110 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
13120 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65   from it's curre
13130 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
13140 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
13150 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
13160 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
13170 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
13180 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
13190 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
131a0 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
131b0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
131c0 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
131d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
131e0 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 70 50 61  ger_movepage(pPa
131f0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 61 44  ger, pDbPage->aD
13200 61 74 61 2c 20 69 46 72 65 65 50 61 67 65 29 3b  ata, iFreePage);
13210 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
13230 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
13240 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
13250 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
13260 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
13270 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
13280 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
13290 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
132a0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
132b0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
132c0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
132d0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
132e0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
132f0 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
13300 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
13310 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
13320 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
13330 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
13340 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
13350 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
13360 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
13370 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
13380 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
13390 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
133a0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
133b0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
133c0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
133d0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
133e0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
133f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
13400 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
13410 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
13420 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
13430 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
13440 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
13450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13460 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13470 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
13480 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
13490 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
134a0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
134b0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
134c0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
134d0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
134e0 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
134f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
13500 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
13510 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13520 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
13530 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13540 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13550 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
13560 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
13570 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
13580 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
13590 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
135a0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
135b0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
135c0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
135d0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
135e0 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
135f0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
13600 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
13610 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
13620 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
13630 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
13640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13650 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13660 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
13670 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13680 77 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  write(pPtrPage->
13690 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
136a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
136b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
136c0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
136d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
136e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
136f0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13700 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
13710 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
13720 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
13730 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
13740 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13760 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
13770 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
13780 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
13790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
137a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
137b0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
137c0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61 75  n required by au
137d0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 29  toVacuumCommit()
137e0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
137f0 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 42 74 53  allocatePage(BtS
13800 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
13810 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
13820 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  o, u8);../*.** T
13830 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13840 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
13850 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
13860 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
13870 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
13880 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
13890 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
138a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
138b0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
138c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
138d0 50 67 6e 6f 20 2a 6e 54 72 75 6e 63 29 7b 0a 20  Pgno *nTrunc){. 
138e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
138f0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
13900 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
13910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13920 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
13930 6d 61 69 6e 69 6e 67 20 6f 6e 20 74 68 65 20 66  maining on the f
13940 72 65 65 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20 69  ree-list. */.  i
13950 6e 74 20 6e 50 74 72 4d 61 70 3b 20 20 20 20 20  nt nPtrMap;     
13960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13970 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  ber of pointer-m
13980 61 70 20 70 61 67 65 73 20 64 65 61 6c 6c 6f 63  ap pages dealloc
13990 61 74 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  ated */.  Pgno o
139a0 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
139b0 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 69 6e       /* Pages in
139c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
139d0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 66 69 6e  le */.  Pgno fin
139e0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
139f0 20 20 20 2f 2a 20 50 61 67 65 73 20 69 6e 20 74     /* Pages in t
13a00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a10 20 61 66 74 65 72 20 74 72 75 6e 63 61 74 69 6f   after truncatio
13a20 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
13a50 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 0a   */.  u8 eType;.
13a60 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74    int pgsz = pBt
13a70 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20  ->pageSize;  /* 
13a80 50 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68  Page size for th
13a90 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
13aa0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 3b 20 20   Pgno iDbPage;  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13ac0 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
13ad0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 4d 65   to move */.  Me
13ae0 6d 50 61 67 65 20 2a 70 44 62 4d 65 6d 50 61 67  mPage *pDbMemPag
13af0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 22 22 20 2a  e = 0;   /* "" *
13b00 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
13b10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
13b20 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
13b30 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
13b40 65 72 20 74 6f 20 69 44 62 50 61 67 65 20 2a 2f  er to iDbPage */
13b50 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
13b60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
13b70 20 54 68 65 20 66 72 65 65 2d 6c 69 73 74 20 70   The free-list p
13b80 61 67 65 20 74 6f 20 6d 6f 76 65 20 69 44 62 50  age to move iDbP
13b90 61 67 65 20 74 6f 20 2a 2f 0a 20 20 4d 65 6d 50  age to */.  MemP
13ba0 61 67 65 20 2a 70 46 72 65 65 4d 65 6d 50 61 67  age *pFreeMemPag
13bb0 65 20 3d 20 30 3b 20 2f 2a 20 22 22 20 2a 2f 0a  e = 0; /* "" */.
13bc0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13bd0 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 2a 73 71    int nRef = *sq
13be0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
13bf0 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66  (pPager);.#endif
13c00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
13c10 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
13c20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
13c30 47 45 28 70 42 74 2c 20 73 71 6c 69 74 65 33 70  GE(pBt, sqlite3p
13c40 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
13c50 50 61 67 65 72 29 29 20 29 7b 0a 20 20 20 20 72  Pager)) ){.    r
13c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
13c70 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
13c80 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13c90 68 6f 77 20 6d 61 6e 79 20 66 72 65 65 2d 70 61  how many free-pa
13ca0 67 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 64  ges are in the d
13cb0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 72  atabase. If ther
13cc0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72  e are no.  ** fr
13cd0 65 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ee pages, then a
13ce0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 61 20  uto-vacuum is a 
13cf0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 6e 46  no-op..  */.  nF
13d00 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
13d10 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
13d20 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69  >aData[36]);.  i
13d30 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
13d40 29 7b 0a 20 20 20 20 2a 6e 54 72 75 6e 63 20 3d  ){.    *nTrunc =
13d50 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
13d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
13d70 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 66   /* This block f
13d80 69 67 75 72 65 73 20 6f 75 74 20 68 6f 77 20 6d  igures out how m
13d90 61 6e 79 20 70 61 67 65 73 20 74 68 65 72 65 20  any pages there 
13da0 61 72 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  are in the datab
13db0 61 73 65 0a 20 20 2a 2a 20 6e 6f 77 20 28 76 61  ase.  ** now (va
13dc0 72 69 61 62 6c 65 20 6f 72 69 67 53 69 7a 65 29  riable origSize)
13dd0 2c 20 61 6e 64 20 68 6f 77 20 6d 61 6e 79 20 74  , and how many t
13de0 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61 66 74  here will be aft
13df0 65 72 20 74 68 65 0a 20 20 2a 2a 20 74 72 75 6e  er the.  ** trun
13e00 63 61 74 69 6f 6e 20 28 76 61 72 69 61 62 6c 65  cation (variable
13e10 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a 2a 0a   finSize)..  **.
13e20 20 20 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 73    ** The final s
13e30 69 7a 65 20 69 73 20 74 68 65 20 6f 72 69 67 69  ize is the origi
13e40 6e 61 6c 20 73 69 7a 65 2c 20 6c 65 73 73 20 74  nal size, less t
13e50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
13e60 65 20 70 61 67 65 73 0a 20 20 2a 2a 20 69 6e 20  e pages.  ** in 
13e70 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
13e80 73 73 20 61 6e 79 20 70 6f 69 6e 74 65 72 2d 6d  ss any pointer-m
13e90 61 70 20 70 61 67 65 73 20 74 68 61 74 20 77 69  ap pages that wi
13ea0 6c 6c 20 6e 6f 20 6c 6f 6e 67 65 72 0a 20 20 2a  ll no longer.  *
13eb0 2a 20 62 65 20 72 65 71 75 69 72 65 64 2c 20 6c  * be required, l
13ec0 65 73 73 20 31 20 69 66 20 74 68 65 20 70 65 6e  ess 1 if the pen
13ed0 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 20 77  ding-byte page w
13ee0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  as part of the d
13ef0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 62 75 74  atabase.  ** but
13f00 20 69 73 20 6e 6f 74 20 61 66 74 65 72 20 74 68   is not after th
13f10 65 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 20 20  e truncation..  
13f20 2a 2a 2f 0a 20 20 6f 72 69 67 53 69 7a 65 20 3d  **/.  origSize =
13f30 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13f40 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
13f50 0a 20 20 69 66 28 20 6f 72 69 67 53 69 7a 65 3d  .  if( origSize=
13f60 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
13f70 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6f  GE(pBt) ){.    o
13f80 72 69 67 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20  rigSize--;.  }. 
13f90 20 6e 50 74 72 4d 61 70 20 3d 20 28 6e 46 72 65   nPtrMap = (nFre
13fa0 65 4c 69 73 74 2d 6f 72 69 67 53 69 7a 65 2b 50  eList-origSize+P
13fb0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
13fc0 2c 20 6f 72 69 67 53 69 7a 65 29 2b 70 67 73 7a  , origSize)+pgsz
13fd0 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20  /5)/(pgsz/5);.  
13fe0 66 69 6e 53 69 7a 65 20 3d 20 6f 72 69 67 53 69  finSize = origSi
13ff0 7a 65 20 2d 20 6e 46 72 65 65 4c 69 73 74 20 2d  ze - nFreeList -
14000 20 6e 50 74 72 4d 61 70 3b 0a 20 20 69 66 28 20   nPtrMap;.  if( 
14010 6f 72 69 67 53 69 7a 65 3e 50 45 4e 44 49 4e 47  origSize>PENDING
14020 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
14030 26 26 20 66 69 6e 53 69 7a 65 3c 3d 50 45 4e 44  && finSize<=PEND
14040 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
14050 74 29 20 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a  t) ){.    finSiz
14060 65 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e--;.  }.  while
14070 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
14080 70 42 74 2c 20 66 69 6e 53 69 7a 65 29 20 7c 7c  pBt, finSize) ||
14090 20 66 69 6e 53 69 7a 65 3d 3d 50 45 4e 44 49 4e   finSize==PENDIN
140a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
140b0 20 29 7b 0a 20 20 20 20 66 69 6e 53 69 7a 65 2d   ){.    finSize-
140c0 2d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28  -;.  }.  TRACE((
140d0 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 42 65 67  "AUTOVACUUM: Beg
140e0 69 6e 20 28 64 62 20 73 69 7a 65 20 25 64 2d 3e  in (db size %d->
140f0 25 64 29 5c 6e 22 2c 20 6f 72 69 67 53 69 7a 65  %d)\n", origSize
14100 2c 20 66 69 6e 53 69 7a 65 29 29 3b 0a 0a 20 20  , finSize));..  
14110 2f 2a 20 56 61 72 69 61 62 6c 65 20 27 66 69 6e  /* Variable 'fin
14120 53 69 7a 65 27 20 77 69 6c 6c 20 62 65 20 74 68  Size' will be th
14130 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
14140 6c 65 20 69 6e 20 70 61 67 65 73 20 61 66 74 65  le in pages afte
14150 72 0a 20 20 2a 2a 20 74 68 65 20 61 75 74 6f 2d  r.  ** the auto-
14160 76 61 63 75 75 6d 20 68 61 73 20 63 6f 6d 70 6c  vacuum has compl
14170 65 74 65 64 20 28 74 68 65 20 63 75 72 72 65 6e  eted (the curren
14180 74 20 66 69 6c 65 20 73 69 7a 65 20 6d 69 6e 75  t file size minu
14190 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a  s the number.  *
141a0 2a 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  * of pages on th
141b0 65 20 66 72 65 65 20 6c 69 73 74 29 2e 20 4c 6f  e free list). Lo
141c0 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  op through the p
141d0 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
141e0 79 6f 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 6d  yond.  ** this m
141f0 61 72 6b 2c 20 61 6e 64 20 69 66 20 74 68 65 79  ark, and if they
14200 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
14210 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
14220 74 2c 20 6d 6f 76 65 20 74 68 65 6d 0a 20 20 2a  t, move them.  *
14230 2a 20 74 6f 20 61 20 66 72 65 65 20 70 61 67 65  * to a free page
14240 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
14250 66 69 6c 65 20 28 73 6f 6d 65 77 68 65 72 65 20  file (somewhere 
14260 62 65 66 6f 72 65 20 66 69 6e 53 69 7a 65 29 2e  before finSize).
14270 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 20 69 44 62  .  */.  for( iDb
14280 50 61 67 65 3d 66 69 6e 53 69 7a 65 2b 31 3b 20  Page=finSize+1; 
14290 69 44 62 50 61 67 65 3c 3d 6f 72 69 67 53 69 7a  iDbPage<=origSiz
142a0 65 3b 20 69 44 62 50 61 67 65 2b 2b 20 29 7b 0a  e; iDbPage++ ){.
142b0 20 20 20 20 2f 2a 20 49 66 20 69 44 62 50 61 67      /* If iDbPag
142c0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  e is a pointer m
142d0 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 20  ap page, or the 
142e0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
142f0 65 2c 20 73 6b 69 70 20 69 74 2e 20 2a 2f 0a 20  e, skip it. */. 
14300 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
14310 50 41 47 45 28 70 42 74 2c 20 69 44 62 50 61 67  PAGE(pBt, iDbPag
14320 65 29 20 7c 7c 20 69 44 62 50 61 67 65 3d 3d 50  e) || iDbPage==P
14330 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
14340 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 63  (pBt) ){.      c
14350 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
14360 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
14370 65 74 28 70 42 74 2c 20 69 44 62 50 61 67 65 2c  et(pBt, iDbPage,
14380 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
14390 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
143a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
143b0 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
143c0 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ;.    if( eType=
143d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
143e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
143f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14400 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  PT;.      goto a
14410 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20  utovacuum_out;. 
14420 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
14430 69 44 62 50 61 67 65 20 69 73 20 66 72 65 65 2c  iDbPage is free,
14440 20 64 6f 20 6e 6f 74 20 73 77 61 70 20 69 74 2e   do not swap it.
14450 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 54 79    */.    if( eTy
14460 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
14470 41 47 45 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  AGE ){.      con
14480 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
14490 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
144a0 74 2c 20 69 44 62 50 61 67 65 2c 20 26 70 44 62  t, iDbPage, &pDb
144b0 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 69 66  MemPage);.    if
144c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
144d0 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75  ) goto autovacuu
144e0 6d 5f 6f 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 46  m_out;..    /* F
144f0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
14500 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
14510 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
14520 6c 72 65 61 64 79 20 61 74 20 74 68 65 20 65 6e  lready at the en
14530 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
14540 20 66 69 6c 65 2e 20 41 20 70 61 67 65 20 63 61   file. A page ca
14550 6e 20 62 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  n be pulled off 
14560 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 75 73  the free list us
14570 69 6e 67 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ing the .    ** 
14580 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 29 20 72  allocatePage() r
14590 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
145a0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
145b0 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20 29 7b   pFreeMemPage ){
145c0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
145d0 50 61 67 65 28 70 46 72 65 65 4d 65 6d 50 61 67  Page(pFreeMemPag
145e0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 65  e);.        pFre
145f0 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20  eMemPage = 0;.  
14600 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
14610 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
14620 74 2c 20 26 70 46 72 65 65 4d 65 6d 50 61 67 65  t, &pFreeMemPage
14630 2c 20 26 69 46 72 65 65 50 61 67 65 2c 20 30 2c  , &iFreePage, 0,
14640 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
14650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14660 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
14670 61 67 65 28 70 44 62 4d 65 6d 50 61 67 65 29 3b  age(pDbMemPage);
14680 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 75  .        goto au
14690 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20  tovacuum_out;.  
146a0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
146b0 72 74 28 20 69 46 72 65 65 50 61 67 65 3c 3d 6f  rt( iFreePage<=o
146c0 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 7d  rigSize );.    }
146d0 77 68 69 6c 65 28 20 69 46 72 65 65 50 61 67 65  while( iFreePage
146e0 3e 66 69 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  >finSize );.    
146f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
14700 65 4d 65 6d 50 61 67 65 29 3b 0a 20 20 20 20 70  eMemPage);.    p
14710 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b  FreeMemPage = 0;
14720 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 6f 63 61 74  ..    /* Relocat
14730 65 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  e the page into 
14740 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
14750 66 69 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  file. Note that 
14760 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
14770 20 20 2a 2a 20 70 61 67 65 20 68 61 73 20 6d 6f    ** page has mo
14780 76 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 64  ved within the d
14790 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
147a0 65 20 70 44 62 4d 65 6d 50 61 67 65 20 70 6f 69  e pDbMemPage poi
147b0 6e 74 65 72 20 0a 20 20 20 20 2a 2a 20 72 65 6d  nter .    ** rem
147c0 61 69 6e 73 20 76 61 6c 69 64 2e 20 54 68 69 73  ains valid. This
147d0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
147e0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 72 75   function can ru
147f0 6e 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  n without.    **
14800 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 63 75   invalidating cu
14810 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
14820 65 20 62 74 72 65 65 2e 20 54 68 69 73 20 69 73  e btree. This is
14830 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 0a 20   important in . 
14840 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63     ** shared-cac
14850 68 65 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a  he mode..    */.
14860 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
14870 65 50 61 67 65 28 70 42 74 2c 20 70 44 62 4d 65  ePage(pBt, pDbMe
14880 6d 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  mPage, eType, iP
14890 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  trPage, iFreePag
148a0 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
148b0 61 67 65 28 70 44 62 4d 65 6d 50 61 67 65 29 3b  age(pDbMemPage);
148c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
148d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75  ITE_OK ) goto au
148e0 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20  tovacuum_out;.  
148f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69  }..  /* The enti
14900 72 65 20 66 72 65 65 2d 6c 69 73 74 20 68 61 73  re free-list has
14910 20 62 65 65 6e 20 73 77 61 70 70 65 64 20 74 6f   been swapped to
14920 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
14930 66 69 6c 65 2e 20 53 6f 0a 20 20 2a 2a 20 74 72  file. So.  ** tr
14940 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
14950 61 73 65 20 66 69 6c 65 20 74 6f 20 66 69 6e 53  ase file to finS
14960 69 7a 65 20 70 61 67 65 73 20 61 6e 64 20 63 6f  ize pages and co
14970 6e 73 69 64 65 72 20 74 68 65 0a 20 20 2a 2a 20  nsider the.  ** 
14980 66 72 65 65 2d 6c 69 73 74 20 65 6d 70 74 79 2e  free-list empty.
14990 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
149a0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
149b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
149c0 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ta);.  if( rc!=S
149d0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
149e0 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b 0a  autovacuum_out;.
149f0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
14a00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
14a10 32 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  2], 0);.  put4by
14a20 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14a30 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
14a40 20 20 2a 6e 54 72 75 6e 63 20 3d 20 66 69 6e 53    *nTrunc = finS
14a50 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
14a60 69 6e 53 69 7a 65 21 3d 50 45 4e 44 49 4e 47 5f  inSize!=PENDING_
14a70 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
14a80 3b 0a 0a 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75  ;..autovacuum_ou
14a90 74 3a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t:.  assert( nRe
14aa0 66 3d 3d 2a 73 71 6c 69 74 65 33 70 61 67 65 72  f==*sqlite3pager
14ab0 5f 73 74 61 74 73 28 70 50 61 67 65 72 29 20 29  _stats(pPager) )
14ac0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
14ae0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
14af0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
14b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
14b10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  endif../*.** Com
14b20 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
14b30 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
14b40 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
14b50 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
14b60 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
14b70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14b80 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
14b90 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
14ba0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
14bb0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
14bc0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
14bd0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
14be0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
14bf0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14c00 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 62 74   = p->pBt;..  bt
14c10 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14c20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
14c30 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
14c40 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
14c50 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
14c60 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
14c70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
14c80 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
14c90 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
14ca0 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
14cb0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14cc0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
14cd0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
14ce0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
14cf0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
14d00 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
14d10 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
14d20 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
14d30 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
14d40 63 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  commit(pBt->pPag
14d50 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
14d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14d70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14d80 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
14d90 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
14da0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42  ANS_READ;.    pB
14db0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
14dc0 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   }.  unlockAllTa
14dd0 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  bles(p);..  /* I
14de0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
14df0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
14e00 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
14e10 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61  ecrement the tra
14e20 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
14e30 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
14e40 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
14e50 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
14e60 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  t reaches 0, set
14e70 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64  .  ** the shared
14e80 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
14e90 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
14ea0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20  BtreeIfUnused() 
14eb0 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20  call below.  ** 
14ec0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
14ed0 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pager..  */.  if
14ee0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
14ef0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
14f00 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
14f10 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
14f20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
14f30 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
14f40 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
14f50 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
14f60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
14f70 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72  the handles curr
14f80 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14f90 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
14fa0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20  ONE and unlock. 
14fb0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66   ** the pager if
14fc0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
14fd0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
14fe0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
14ff0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  tion..  */.  p->
15000 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
15010 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
15020 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
15030 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
15040 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ity(p);.  return
15050 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
15060 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
15070 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
15080 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
15090 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
150a0 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
150b0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
150c0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
150d0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
150e0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
150f0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
15100 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  ** defined..*/.s
15110 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
15120 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
15130 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
15140 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
15150 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
15160 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
15170 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
15180 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
15190 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
151a0 67 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  g ) r++; .  }.  
151b0 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
151c0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
151d0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
151e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
151f0 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
15200 74 20 64 65 62 75 67 67 69 6e 67 20 69 6e 66 6f  t debugging info
15210 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
15220 6c 20 63 75 72 73 6f 72 73 20 74 6f 20 73 74 61  l cursors to sta
15230 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f  ndard output..*/
15240 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15250 65 65 43 75 72 73 6f 72 4c 69 73 74 28 42 74 72  eeCursorList(Btr
15260 65 65 20 2a 70 29 7b 0a 20 20 42 74 43 75 72 73  ee *p){.  BtCurs
15270 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68  or *pCur;.  BtSh
15280 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15290 42 74 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70  Bt;.  for(pCur=p
152a0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
152b0 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
152c0 65 78 74 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  ext){.    MemPag
152d0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
152e0 3e 70 50 61 67 65 3b 0a 20 20 20 20 63 68 61 72  >pPage;.    char
152f0 20 2a 7a 4d 6f 64 65 20 3d 20 70 43 75 72 2d 3e   *zMode = pCur->
15300 77 72 46 6c 61 67 20 3f 20 22 72 77 22 20 3a 20  wrFlag ? "rw" : 
15310 22 72 6f 22 3b 0a 20 20 20 20 73 71 6c 69 74 65  "ro";.    sqlite
15320 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 43 55  3DebugPrintf("CU
15330 52 53 4f 52 20 25 70 20 72 6f 6f 74 65 64 20 61  RSOR %p rooted a
15340 74 20 25 34 64 28 25 73 29 20 63 75 72 72 65 6e  t %4d(%s) curren
15350 74 6c 79 20 61 74 20 25 64 2e 25 64 25 73 5c 6e  tly at %d.%d%s\n
15360 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2c 20  ",.       pCur, 
15370 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
15380 7a 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 70 50  zMode,.       pP
15390 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 70 67 6e  age ? pPage->pgn
153a0 6f 20 3a 20 30 2c 20 70 43 75 72 2d 3e 69 64 78  o : 0, pCur->idx
153b0 2c 0a 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e  ,.       (pCur->
153c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
153d0 41 4c 49 44 29 20 3f 20 22 22 20 3a 20 22 20 65  ALID) ? "" : " e
153e0 6f 66 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  of".    );.  }.}
153f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
15400 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
15410 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
15420 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
15430 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
15440 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
15450 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
15460 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
15470 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
15480 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
15490 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
154a0 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
154b0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
154c0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
154d0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
154e0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
154f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15500 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
15510 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
15520 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
15530 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
15540 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
15550 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
15560 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
15570 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
15580 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15590 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
155a0 61 67 65 31 3b 0a 0a 20 20 72 63 20 3d 20 73 61  age1;..  rc = sa
155b0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
155c0 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
155d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
155e0 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
155f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15600 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
15610 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
15620 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
15630 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
15640 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
15650 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
15660 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
15670 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
15680 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
15690 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
156a0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
156b0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
156c0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
156d0 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
156e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
156f0 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
15700 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
15710 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
15720 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
15730 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
15740 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
15750 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
15760 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
15770 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
15780 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
15790 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
157a0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
157b0 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
157c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  e..    */.    wh
157d0 69 6c 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ile( pBt->pCurso
157e0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
157f0 65 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43  e3 *db = pBt->pC
15800 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70  ursor->pBtree->p
15810 53 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66  Sqlite;.      if
15820 28 20 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  ( db ){.        
15830 73 71 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65  sqlite3AbortOthe
15840 72 41 63 74 69 76 65 56 64 62 65 73 28 64 62 2c  rActiveVdbes(db,
15850 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
15860 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
15870 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
15880 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  );.  unlockAllTa
15890 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20  bles(p);..  if( 
158a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
158b0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
158c0 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
158d0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
158e0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
158f0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
15900 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
15910 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
15920 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
15930 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
15940 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
15950 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
15960 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
15970 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
15980 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
15990 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
159a0 2a 20 63 61 6c 6c 20 67 65 74 50 61 67 65 28 29  * call getPage()
159b0 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
159c0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 50   to make sure pP
159d0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 0a 20  age1->aData is. 
159e0 20 20 20 2a 2a 20 73 65 74 20 63 6f 72 72 65 63     ** set correc
159f0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
15a00 67 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  getPage(pBt, 1, 
15a10 26 70 50 61 67 65 31 29 3d 3d 53 51 4c 49 54 45  &pPage1)==SQLITE
15a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
15a30 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
15a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15a50 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
15a60 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
15a70 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
15a80 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
15a90 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  READ;.  }..  if(
15aa0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
15ab0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61  NS_NONE ){.    a
15ac0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
15ad0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
15ae0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
15af0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30  ion--;.    if( 0
15b00 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
15b10 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
15b20 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
15b30 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
15b40 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e    }.  }..  p->in
15b50 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
15b60 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d  NE;.  pBt->inStm
15b70 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42  t = 0;.  unlockB
15b80 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
15b90 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
15ba0 72 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72  rity(p);.  retur
15bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
15bc0 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
15bd0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
15be0 20 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63    The subtransac
15bf0 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20  tion can.** can 
15c00 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
15c10 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
15c20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
15c30 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73  tion..** You mus
15c40 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
15c50 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61  ction before sta
15c60 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
15c70 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73  action..** The s
15c80 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
15c90 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
15ca0 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e  ally if the main
15cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
15cc0 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
15cd0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c   back..**.** Onl
15ce0 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63  y one subtransac
15cf0 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69  tion may be acti
15d00 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49  ve at a time.  I
15d10 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
15d20 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74   try.** to start
15d30 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61   a new subtransa
15d40 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72  ction if another
15d50 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
15d60 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
15d70 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  e..**.** Stateme
15d80 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
15d90 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
15da0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
15db0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
15dc0 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
15dd0 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
15de0 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
15df0 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
15e00 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
15e10 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
15e20 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
15e30 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
15e40 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
15e50 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
15e60 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
15e70 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
15e80 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
15e90 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
15ea0 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
15eb0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
15ec0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
15ed0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15ee0 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73   if( (p->inTrans
15ef0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c  !=TRANS_WRITE) |
15f00 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  | pBt->inStmt ){
15f10 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
15f20 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
15f30 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
15f40 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
15f50 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
15f60 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
15f70 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 72  ANS_WRITE );.  r
15f80 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
15f90 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  y ? SQLITE_OK : 
15fa0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
15fb0 74 5f 62 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  t_begin(pBt->pPa
15fc0 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69 6e 53  ger);.  pBt->inS
15fd0 74 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  tmt = 1;.  retur
15fe0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
15ff0 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d  Commit the statm
16000 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
16010 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
16020 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f  progress.  If no
16030 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69  .** subtransacti
16040 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68  on is active, th
16050 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
16060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16070 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72  eeCommitStmt(Btr
16080 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
16090 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
160a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
160b0 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
160c0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
160d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
160e0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
160f0 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  mmit(pBt->pPager
16100 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16120 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d    }.  pBt->inStm
16130 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
16140 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
16150 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65  lback the active
16160 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
16170 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e  ansaction.  If n
16180 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  o subtransaction
16190 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68  .** is active th
161a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
161b0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  no-op..**.** All
161c0 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
161d0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
161e0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
161f0 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20   Any attempt.** 
16200 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20  to use a cursor 
16210 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
16220 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16230 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
16240 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  .** will result 
16250 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  in an error..*/.
16260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16270 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72  RollbackStmt(Btr
16280 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
16290 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
162a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
162b0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
162c0 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28  3MallocDisallow(
162d0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
162e0 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
162f0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
16300 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
16310 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 70 42  stmt_rollback(pB
16320 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
16330 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
16340 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
16350 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
16360 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
16370 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c  sqlite3MallocAll
16380 6f 77 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ow();.  return r
16390 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  c;.}../*.** Defa
163a0 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73  ult key comparis
163b0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  on function to b
163c0 65 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d  e used if no com
163d0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
163e0 0a 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65 64  .** is specified
163f0 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42   on the sqlite3B
16400 74 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c  treeCursor() cal
16410 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
16420 20 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20   dfltCompare(.  
16430 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20  void *NotUsed,  
16440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
16450 65 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75  er data is not u
16460 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c  sed */.  int n1,
16470 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c   const void *p1,
16480 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79      /* First key
16490 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
164a0 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76   int n2, const v
164b0 6f 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53  oid *p2     /* S
164c0 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d  econd key to com
164d0 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pare */.){.  int
164e0 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70   c;.  c = memcmp
164f0 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f  (p1, p2, n1<n2 ?
16500 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28   n1 : n2);.  if(
16510 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d   c==0 ){.    c =
16520 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20   n1 - n2;.  }.  
16530 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
16540 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
16550 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
16560 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
16570 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
16580 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61  * iTable.  The a
16590 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20  ct of acquiring 
165a0 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20  a cursor gets a 
165b0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  read lock on .**
165c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
165d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  le..**.** If wrF
165e0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
165f0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
16600 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
16610 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
16620 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
16630 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
16640 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
16650 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
16660 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
16670 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
16680 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
16690 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
166a0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
166b0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
166c0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
166d0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
166e0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
166f0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
16700 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
16710 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
16720 0a 2a 2a 20 32 3a 20 20 4e 6f 20 6f 74 68 65 72  .** 2:  No other
16730 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20   cursors may be 
16740 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
16750 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
16760 74 61 62 6c 65 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  table.**.** 3:  
16770 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
16780 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
16790 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
167a0 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
167b0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
167c0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
167d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64  tion..**.** Cond
167e0 69 74 69 6f 6e 20 32 20 77 61 72 72 61 6e 74 73  ition 2 warrants
167f0 20 66 75 72 74 68 65 72 20 64 69 73 63 75 73 73   further discuss
16800 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 63 75 72  ion.  If any cur
16810 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  sor is opened.**
16820 20 6f 6e 20 61 20 74 61 62 6c 65 20 77 69 74 68   on a table with
16830 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 61 74   wrFlag==0, that
16840 20 70 72 65 76 65 6e 74 73 20 61 6c 6c 20 6f 74   prevents all ot
16850 68 65 72 20 63 75 72 73 6f 72 73 20 66 72 6f 6d  her cursors from
16860 0a 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 74  .** writing to t
16870 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73  hat table.  This
16880 20 69 73 20 61 20 6b 69 6e 64 20 6f 66 20 22 72   is a kind of "r
16890 65 61 64 2d 6c 6f 63 6b 22 2e 20 20 57 68 65 6e  ead-lock".  When
168a0 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20   a cursor.** is 
168b0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
168c0 61 67 3d 3d 30 20 69 74 20 69 73 20 67 75 61 72  ag==0 it is guar
168d0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
168e0 74 61 62 6c 65 20 77 69 6c 6c 20 6e 6f 74 0a 2a  table will not.*
168f0 2a 20 63 68 61 6e 67 65 20 61 73 20 6c 6f 6e 67  * change as long
16900 20 61 73 20 74 68 65 20 63 75 72 73 6f 72 20 69   as the cursor i
16910 73 20 6f 70 65 6e 2e 20 20 54 68 69 73 20 61 6c  s open.  This al
16920 6c 6f 77 73 20 74 68 65 20 63 75 72 73 6f 72 20  lows the cursor 
16930 74 6f 0a 2a 2a 20 64 6f 20 61 20 73 65 71 75 65  to.** do a seque
16940 6e 74 69 61 6c 20 73 63 61 6e 20 6f 66 20 74 68  ntial scan of th
16950 65 20 74 61 62 6c 65 20 77 69 74 68 6f 75 74 20  e table without 
16960 68 61 76 69 6e 67 20 74 6f 20 77 6f 72 72 79 20  having to worry 
16970 61 62 6f 75 74 0a 2a 2a 20 65 6e 74 72 69 65 73  about.** entries
16980 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
16990 6f 72 20 64 65 6c 65 74 65 64 20 64 75 72 69 6e  or deleted durin
169a0 67 20 74 68 65 20 73 63 61 6e 2e 20 20 43 75 72  g the scan.  Cur
169b0 73 6f 72 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  sors should.** b
169c0 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
169d0 46 6c 61 67 3d 3d 30 20 6f 6e 6c 79 20 69 66 20  Flag==0 only if 
169e0 74 68 69 73 20 72 65 61 64 2d 6c 6f 63 6b 20 70  this read-lock p
169f0 72 6f 70 65 72 74 79 20 69 73 20 6e 65 65 64 65  roperty is neede
16a00 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 6f  d..** That is to
16a10 20 73 61 79 2c 20 63 75 72 73 6f 72 73 20 73 68   say, cursors sh
16a20 6f 75 6c 64 20 62 65 20 6f 70 65 6e 65 64 20 77  ould be opened w
16a30 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
16a40 6c 79 20 69 66 20 74 68 65 79 0a 2a 2a 20 69 6e  ly if they.** in
16a50 74 65 6e 64 20 74 6f 20 75 73 65 20 74 68 65 20  tend to use the 
16a60 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
16a70 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  () system call. 
16a80 20 41 6c 6c 20 6f 74 68 65 72 20 63 75 72 73 6f   All other curso
16a90 72 73 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  rs.** should be 
16aa0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
16ab0 61 67 3d 3d 31 20 65 76 65 6e 20 69 66 20 74 68  ag==1 even if th
16ac0 65 79 20 6e 65 76 65 72 20 72 65 61 6c 6c 79 20  ey never really 
16ad0 69 6e 74 65 6e 64 0a 2a 2a 20 74 6f 20 77 72 69  intend.** to wri
16ae0 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 4e 6f 20 63 68  te..** .** No ch
16af0 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
16b00 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
16b10 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
16b20 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
16b30 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
16b40 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
16b50 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
16b60 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
16b70 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
16b80 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  rrectly..**.** T
16b90 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
16ba0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c  nction must be l
16bb0 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d  ogically the sam
16bc0 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
16bd0 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69  or.** on a parti
16be0 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 43 68  cular table.  Ch
16bf0 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d 70 61  anging the compa
16c00 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77  rison function w
16c10 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
16c20 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65 72 61   incorrect opera
16c30 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 63  tions.  If the c
16c40 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
16c50 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a  on is NULL, a.**
16c60 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61 72 69   default compari
16c70 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  son function is 
16c80 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d 70 61  used.  The compa
16c90 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
16ca0 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f  s.** always igno
16cb0 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59 20 74  red for INTKEY t
16cc0 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ables..*/.int sq
16cd0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16ce0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
16d20 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d50 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
16d60 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
16d70 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16da0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
16db0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ad-only */.  int
16dc0 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69   (*xCmp)(void*,i
16dd0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
16de0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
16df0 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73   /* Key Comparis
16e00 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69  on func */.  voi
16e10 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  d *pArg,        
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
16e40 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
16e50 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
16e60 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20  r **ppCur       
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
16e90 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
16ea0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
16eb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
16ec0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16ed0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70  = p->pBt;..  *pp
16ee0 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77  Cur = 0;.  if( w
16ef0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28  rFlag ){.    if(
16f00 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
16f10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
16f20 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
16f30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
16f40 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 42 74  eckReadLocks(pBt
16f50 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
16f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16f70 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
16f80 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
16f90 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
16fa0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
16fb0 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
16fc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
16fe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16ff0 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
17000 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
17010 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  (*pCur) );.  if(
17020 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20   pCur==0 ){.    
17030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
17040 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  M;.    goto crea
17050 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
17060 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ion;.  }.  pCur-
17070 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
17080 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  o)iTable;.  if( 
17090 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c  iTable==1 && sql
170a0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
170b0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
170c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
170d0 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
170e0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
170f0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
17100 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
17110 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
17120 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
17130 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b  pCur->pPage, 0);
17140 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
17160 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
17170 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  xception;.  }.. 
17180 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
17190 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
171a0 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
171b0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
171c0 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
171d0 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20  ables, link the 
171e0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
171f0 42 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e  BtShared list an
17200 64 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68  d set *ppCur (th
17210 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72  e.  ** output ar
17220 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
17230 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20  unction)..  */. 
17240 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20   pCur->xCompare 
17250 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20  = xCmp ? xCmp : 
17260 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70  dfltCompare;.  p
17270 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67  Cur->pArg = pArg
17280 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
17290 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72   = p;.  pCur->wr
172a0 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20  Flag = wrFlag;. 
172b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
172c0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
172d0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
172e0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
172f0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
17300 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
17310 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
17320 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
17330 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a  SOR_INVALID;.  *
17340 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20  ppCur = pCur;.. 
17350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17360 4b 3b 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72  K;.create_cursor
17370 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66  _exception:.  if
17380 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65  ( pCur ){.    re
17390 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
173a0 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  pPage);.    sqli
173b0 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20  teFree(pCur);.  
173c0 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  }.  unlockBtreeI
173d0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
173e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
173f0 66 20 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64  f 0  /* Not Used
17400 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65   */./*.** Change
17410 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17420 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
17430 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20  ction used by a 
17440 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
17450 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
17460 6f 6d 70 61 72 65 28 0a 20 20 42 74 43 75 72 73  ompare(.  BtCurs
17470 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
17480 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77   The cursor to w
17490 68 6f 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  hose comparison 
174a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e  function is chan
174b0 67 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  ged */.  int(*xC
174c0 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  mp)(void*,int,co
174d0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
174e0 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e  nst void*), /* N
174f0 65 77 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ew comparison fu
17500 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
17510 72 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  rg          /* F
17520 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
17530 20 78 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20   xCmp() */.){.  
17540 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d  pCur->xCompare =
17550 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64   xCmp ? xCmp : d
17560 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  fltCompare;.  pC
17570 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b  ur->pArg = pArg;
17580 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17590 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
175a0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
175b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
175c0 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
175d0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
175e0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
175f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17600 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
17610 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
17620 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
17630 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
17640 65 65 2d 3e 70 42 74 3b 0a 20 20 72 65 73 74 6f  ee->pBt;.  resto
17650 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
17660 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29  osition(pCur, 0)
17670 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  ;.  if( pCur->pP
17680 72 65 76 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  rev ){.    pCur-
17690 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
176a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  pCur->pNext;.  }
176b0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70  else{.    pBt->p
176c0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
176d0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
176e0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
176f0 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
17700 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
17710 72 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  rev;.  }.  relea
17720 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
17730 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  ge);.  unlockBtr
17740 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
17750 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
17760 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
17770 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17780 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61  * Make a tempora
17790 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c  ry cursor by fil
177a0 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c  ling in the fiel
177b0 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a  ds of pTempCur..
177c0 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ** The temporary
177d0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f   cursor is not o
177e0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73  n the cursor lis
177f0 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e  t for the Btree.
17800 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17810 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74  getTempCursor(Bt
17820 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74  Cursor *pCur, Bt
17830 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72  Cursor *pTempCur
17840 29 7b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  ){.  memcpy(pTem
17850 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
17860 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54  of(*pCur));.  pT
17870 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20  empCur->pNext = 
17880 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70  0;.  pTempCur->p
17890 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  Prev = 0;.  if( 
178a0 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20  pTempCur->pPage 
178b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
178c0 67 65 72 5f 72 65 66 28 70 54 65 6d 70 43 75 72  ger_ref(pTempCur
178d0 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  ->pPage->aData);
178e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
178f0 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  lete a temporary
17900 20 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20   cursor such as 
17910 77 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  was made by the 
17920 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43  CreateTemporaryC
17930 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74  ursor().** funct
17940 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  ion above..*/.st
17950 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
17960 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
17970 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
17980 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
17990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
179a0 65 72 5f 75 6e 72 65 66 28 70 43 75 72 2d 3e 70  er_unref(pCur->p
179b0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
179c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
179d0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
179e0 72 2e 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20  r.info field of 
179f0 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
17a00 20 69 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66   is valid..** If
17a10 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
17a20 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70  dy valid, call p
17a30 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
17a40 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
17a50 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
17a60 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
17a70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
17a80 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
17a90 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
17aa0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
17ab0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
17ac0 20 74 6f 20 70 61 72 73 65 43 65 6c 6c 28 29 2e   to parseCell().
17ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17ae0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
17af0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
17b00 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
17b10 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61  ize==0 ){.    pa
17b20 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
17b30 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
17b40 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
17b50 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e  }else{.#ifndef N
17b60 44 45 42 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e  DEBUG.    CellIn
17b70 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
17b80 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
17b90 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
17ba0 20 70 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d   parseCell(pCur-
17bb0 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
17bc0 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  x, &info);.    a
17bd0 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69  ssert( memcmp(&i
17be0 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
17bf0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
17c00 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  =0 );.#endif.  }
17c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
17c20 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
17c30 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
17c40 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
17c50 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
17c60 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
17c70 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
17c80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
17c90 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
17ca0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
17cb0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
17cc0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
17cd0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
17ce0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
17cf0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
17d00 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
17d10 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
17d20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17d30 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
17d40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17d50 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
17d60 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
17d70 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
17d80 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
17d90 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
17da0 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
17db0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17dc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
17dd0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17de0 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
17df0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17e00 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
17e10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
17e20 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
17e30 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
17e40 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
17e50 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
17e60 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
17e70 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
17e80 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
17e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17ea0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
17eb0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
17ec0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
17ed0 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
17ee0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
17ef0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
17f00 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
17f10 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
17f20 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
17f30 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
17f40 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
17f50 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
17f60 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
17f70 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
17f80 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
17f90 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
17fa0 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
17fb0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
17fc0 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
17fd0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
17fe0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
17ff0 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
18000 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65  int rc = restore
18010 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
18020 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a  ition(pCur, 1);.
18030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18040 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
18050 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
18060 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
18070 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
18080 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
18090 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
180a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
180b0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
180c0 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
180d0 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
180e0 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
180f0 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
18100 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
18110 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
18120 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
18130 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
18140 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
18150 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
18170 64 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  d payload inform
18180 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
18190 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
181a0 75 72 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  ur cursor is.** 
181b0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65  pointing to.  Be
181c0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 65 20  gin reading the 
181d0 70 61 79 6c 6f 61 64 20 61 74 20 22 6f 66 66 73  payload at "offs
181e0 65 74 22 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  et" and read.** 
181f0 61 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  a total of "amt"
18200 20 62 79 74 65 73 2e 20 20 50 75 74 20 74 68 65   bytes.  Put the
18210 20 72 65 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e   result in zBuf.
18220 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18230 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  ine does not mak
18240 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20  e a distinction 
18250 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20  between key and 
18260 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74  data..** It just
18270 20 72 65 61 64 73 20 62 79 74 65 73 20 66 72 6f   reads bytes fro
18280 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
18290 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
182a0 61 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65  appear.** on the
182b0 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
182c0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
182d0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
182e0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74  low pages..*/.st
182f0 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 79 6c  atic int getPayl
18300 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
18310 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
18320 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
18330 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
18340 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  from */.  int of
18350 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
18360 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
18370 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
18380 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61  yload */.  int a
18390 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
183a0 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
183b0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
183c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
183d0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
183e0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
183f0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
18400 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
18410 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e   /* offset begin
18420 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  s at data if thi
18430 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
18440 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18450 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e  *aPayload;.  Pgn
18460 6f 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 69 6e  o nextPage;.  in
18470 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
18480 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  *pPage;.  BtShar
18490 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f  ed *pBt;.  int o
184a0 76 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e  vflSize;.  u32 n
184b0 4b 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Key;..  assert( 
184c0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
184d0 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
184e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
184f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18500 44 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 43 75  D );.  pBt = pCu
18510 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a  r->pBtree->pBt;.
18520 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
18530 70 50 61 67 65 3b 0a 20 20 70 61 67 65 49 6e 74  pPage;.  pageInt
18540 65 67 72 69 74 79 28 70 50 61 67 65 29 3b 0a 20  egrity(pPage);. 
18550 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18560 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18570 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
18580 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
18590 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
185a0 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
185b0 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
185c0 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
185d0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
185e0 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
185f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
18600 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
18610 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65  nKey;.  }.  asse
18620 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
18630 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
18640 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  {.    offset += 
18650 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
18660 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
18670 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
18680 74 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ta ){.    return
18690 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
186a0 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c   }.  if( offset<
186b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
186c0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
186d0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
186e0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
186f0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
18700 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
18710 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
18720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
18730 70 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f  py(pBuf, &aPaylo
18740 61 64 5b 6f 66 66 73 65 74 5d 2c 20 61 29 3b 0a  ad[offset], a);.
18750 20 20 20 20 69 66 28 20 61 3d 3d 61 6d 74 20 29      if( a==amt )
18760 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
18770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
18780 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
18790 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
187a0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
187b0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
187c0 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
187d0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 6f 76 66  Local;.  }.  ovf
187e0 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
187f0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69  bleSize - 4;.  i
18800 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
18810 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
18820 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
18830 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
18840 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61 6d  );.    while( am
18850 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 20  t>0 && nextPage 
18860 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
18870 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
18880 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
18890 50 61 67 65 2c 20 28 76 6f 69 64 2a 2a 29 26 61  Page, (void**)&a
188a0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
188b0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
188c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
188d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
188e0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
188f0 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
18900 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 6f 76     if( offset<ov
18910 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
18920 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
18930 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
18940 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
18950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
18960 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
18970 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  set;.        }. 
18980 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42         memcpy(pB
18990 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66  uf, &aPayload[of
189a0 66 73 65 74 2b 34 5d 2c 20 61 29 3b 0a 20 20 20  fset+4], a);.   
189b0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
189c0 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
189d0 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  a;.        pBuf 
189e0 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += a;.      }els
189f0 65 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  e{.        offse
18a00 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
18a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
18a20 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
18a30 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d  aPayload);.    }
18a40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e  .  }..  if( amt>
18a50 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18a60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18a70 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
18a80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18a90 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
18aa0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
18ab0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
18ac0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
18ad0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
18ae0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
18af0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
18b00 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
18b10 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
18b20 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
18b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18b40 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
18b50 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
18b60 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18b70 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18b80 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
18b90 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18ba0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18bb0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18bc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18bd0 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
18be0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
18bf0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
18c00 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
18c10 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
18c20 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
18c30 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
18c40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18c50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18c60 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18c70 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
18c80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18c90 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  pPage!=0 );.    
18ca0 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  if( pCur->pPage-
18cb0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
18cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18cd0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
18ce0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
18cf0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
18d00 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ey==0 );.    ass
18d10 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
18d20 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
18d30 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
18d40 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  l );.    rc = ge
18d50 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  tPayload(pCur, o
18d60 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
18d70 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
18d80 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
18d90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18da0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
18db0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
18dc0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
18dd0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
18de0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18df0 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18e00 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
18e10 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
18e20 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
18e30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
18e40 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18e50 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
18e60 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
18e70 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
18e80 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
18e90 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
18ea0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
18eb0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
18ec0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
18ed0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18ee0 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
18ef0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18f00 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18f10 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pBuf){.  int rc 
18f20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18f30 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18f40 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  Cur, 1);.  if( r
18f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18f60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18f70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18f80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
18f90 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
18fa0 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e!=0 );.    asse
18fb0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
18fc0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
18fd0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18fe0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
18ff0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
19000 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
19010 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
19020 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
19030 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
19040 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
19050 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
19060 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
19070 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
19080 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
19090 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
190a0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
190b0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
190c0 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
190d0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
190e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
190f0 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
19100 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
19110 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
19120 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
19130 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
19140 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
19150 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
19160 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19170 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
19180 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
19190 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
191a0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
191b0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
191c0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
191d0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
191e0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
191f0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
19200 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
19210 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
19220 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
19230 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
19240 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
19250 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
19260 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
19270 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
19280 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
19290 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
192a0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
192b0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
192c0 65 6e 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20  en getPayload() 
192d0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
192e0 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68  reassembly.** th
192f0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
19300 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
19310 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
19320 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
19330 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
19340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
19350 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
19360 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
19370 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
19380 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
19390 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
193a0 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
193b0 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
193c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
193d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
193e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
193f0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
19400 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
19410 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
19420 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
19430 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
19440 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
19450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
19460 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
19470 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
19480 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
19490 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
194a0 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
194b0 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
194c0 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
194d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
194e0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
194f0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
19500 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  32 nKey;.  int n
19510 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
19520 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
19530 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
19540 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
19550 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19560 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  LID );.  pPage =
19570 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
19580 70 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50  pageIntegrity(pP
19590 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
195a0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
195b0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
195c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
195d0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
195e0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
195f0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
19600 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
19610 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
19620 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
19630 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
19640 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
19650 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
19660 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
19670 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
19680 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
19690 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
196a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
196b0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
196c0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
196d0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
196e0 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
196f0 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
19700 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
19710 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
19720 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
19730 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
19740 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
19750 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
19760 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
19770 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
19780 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
19790 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
197a0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
197b0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
197c0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
197d0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
197e0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
197f0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
19800 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
19810 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
19820 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
19830 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
19840 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
19850 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
19860 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
19870 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
19880 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
19890 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
198a0 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
198b0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
198c0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
198d0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
198e0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
198f0 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
19900 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
19910 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
19920 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
19930 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
19940 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19950 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
19960 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
19970 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
19980 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
19990 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
199a0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
199b0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
199c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
199d0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66  int *pAmt){.  if
199e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
199f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
19a00 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
19a10 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
19a20 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
19a30 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
19a40 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
19a50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
19a60 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
19a70 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
19a80 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
19a90 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
19aa0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
19ab0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
19ac0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
19ad0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
19ae0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
19af0 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
19b00 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
19b10 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50  pNewPage;.  MemP
19b20 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20  age *pOldPage;. 
19b30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19b40 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
19b50 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
19b60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19b70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
19b80 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
19b90 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
19ba0 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72   &pNewPage, pCur
19bb0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  ->pPage);.  if( 
19bc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19bd0 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79 28    pageIntegrity(
19be0 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 70 4e 65  pNewPage);.  pNe
19bf0 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  wPage->idxParent
19c00 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
19c10 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d  pOldPage = pCur-
19c20 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61  >pPage;.  pOldPa
19c30 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
19c40 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19c50 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75  pOldPage);.  pCu
19c60 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50  r->pPage = pNewP
19c70 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  age;.  pCur->idx
19c80 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
19c90 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
19ca0 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
19cb0 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
19cc0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19cd0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
19ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19d00 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
19d10 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c  e is the virtual
19d20 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62   root of its tab
19d30 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69  le..**.** The vi
19d40 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
19d50 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
19d60 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73   for most tables
19d70 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68  .  But.** for th
19d80 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f  e table rooted o
19d90 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69  n page 1, someti
19da0 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  me the real root
19db0 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74   page.** is empt
19dc0 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  y except for the
19dd0 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20   right-pointer. 
19de0 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74   In such cases t
19df0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f  he.** virtual ro
19e00 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70  ot page is the p
19e10 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67  age that the rig
19e20 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61  ht-pointer of pa
19e30 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74  ge.** 1 is point
19e40 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ing to..*/.stati
19e50 63 20 69 6e 74 20 69 73 52 6f 6f 74 50 61 67 65  c int isRootPage
19e60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
19e70 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
19e80 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
19e90 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
19ea0 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
19eb0 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
19ec0 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
19ed0 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
19ee0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
19ef0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
19f00 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
19f10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
19f20 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
19f30 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
19f40 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
19f50 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
19f60 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19f70 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
19f80 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
19f90 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
19fa0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
19fb0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
19fc0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
19fd0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
19fe0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
19ff0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1a000 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1a010 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1a020 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1a030 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1a040 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
1a050 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1a060 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
1a070 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
1a080 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
1a090 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
1a0a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a0b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1a0c0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1a0d0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
1a0e0 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
1a0f0 73 73 65 72 74 28 20 21 69 73 52 6f 6f 74 50 61  ssert( !isRootPa
1a100 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70  ge(pPage) );.  p
1a110 61 67 65 49 6e 74 65 67 72 69 74 79 28 70 50 61  ageIntegrity(pPa
1a120 67 65 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  ge);.  pParent =
1a130 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
1a140 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
1a150 6e 74 21 3d 30 20 29 3b 0a 20 20 70 61 67 65 49  nt!=0 );.  pageI
1a160 6e 74 65 67 72 69 74 79 28 70 50 61 72 65 6e 74  ntegrity(pParent
1a170 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d  );.  idxParent =
1a180 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
1a190 74 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t;.  sqlite3page
1a1a0 72 5f 72 65 66 28 70 50 61 72 65 6e 74 2d 3e 61  r_ref(pParent->a
1a1b0 44 61 74 61 29 3b 0a 20 20 72 65 6c 65 61 73 65  Data);.  release
1a1c0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70  Page(pPage);.  p
1a1d0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61  Cur->pPage = pPa
1a1e0 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  rent;.  pCur->in
1a1f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1a200 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1a210 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a  >idxShift==0 );.
1a220 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64    pCur->idx = id
1a230 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xParent;.}../*.*
1a240 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a250 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1a260 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1a270 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1a280 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1a290 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1a2a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a2b0 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
1a2c0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1a2d0 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 72 65 73  ree->pBt;..  res
1a2e0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
1a2f0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
1a300 30 29 3b 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43  0);.  pRoot = pC
1a310 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
1a320 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d   pRoot && pRoot-
1a330 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
1a340 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73  oRoot ){.    ass
1a350 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
1a360 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  it );.  }else{. 
1a370 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
1a380 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
1a390 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1a3a0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
1a3b0 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20  t, &pRoot, 0)). 
1a3c0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72     ){.      pCur
1a3d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1a3e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1a3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a400 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1a410 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
1a420 20 20 20 20 70 61 67 65 49 6e 74 65 67 72 69 74      pageIntegrit
1a430 79 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43  y(pRoot);.    pC
1a440 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f  ur->pPage = pRoo
1a450 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  t;.  }.  pCur->i
1a460 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
1a470 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1a480 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
1a490 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
1a4a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1a4b0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61  o subpage;.    a
1a4c0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1a4d0 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
1a4e0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
1a4f0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
1a500 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
1a510 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
1a520 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
1a530 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1a540 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
1a550 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a560 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
1a570 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  );.  }.  pCur->e
1a580 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e  State = ((pCur->
1a590 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pPage->nCell>0)?
1a5a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1a5b0 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1a5c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a5d0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1a5e0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1a5f0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
1a600 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1a610 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
1a620 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1a630 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
1a640 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
1a650 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
1a660 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
1a670 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
1a680 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
1a690 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1a6a0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
1a6b0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
1a6c0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1a6d0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
1a6e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a6f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
1a700 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a710 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1a720 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
1a730 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
1a740 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a750 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1a760 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
1a770 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
1a780 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
1a790 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1a7a0 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63  r->idx));.    rc
1a7b0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1a7c0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
1a7d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a7e0 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
1a7f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a800 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1a810 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1a820 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
1a830 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1a840 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
1a850 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1a860 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
1a870 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
1a880 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
1a890 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1a8a0 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
1a8b0 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
1a8c0 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
1a8d0 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
1a8e0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1a8f0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
1a900 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
1a910 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
1a920 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1a930 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1a940 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
1a950 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
1a960 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
1a970 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
1a980 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
1a990 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
1a9a0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1a9b0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
1a9c0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1a9d0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1a9e0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
1a9f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1aa00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1aa10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1aa20 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1aa30 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
1aa40 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
1aa50 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
1aa60 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1aa70 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1aa80 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
1aa90 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d  ur->idx = pPage-
1aaa0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
1aab0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1aac0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
1aad0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1aae0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64  ;.  }.  pCur->id
1aaf0 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
1ab00 20 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   - 1;.  pCur->in
1ab10 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1ab20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ab30 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1ab40 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
1ab50 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1ab60 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1ab70 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1ab80 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1ab90 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1aba0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1abb0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1abc0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1abd0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1abe0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1abf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ac00 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
1ac10 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1ac20 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1ac30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1ac40 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1ac50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ac60 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1ac70 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1ac80 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1ac90 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1aca0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ell==0 );.    *p
1acb0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1acc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1acd0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1ace0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
1acf0 30 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  0 );.  *pRes = 0
1ad00 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  ;.  rc = moveToL
1ad10 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1ad20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ad30 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1ad40 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
1ad50 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1ad60 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1ad70 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1ad80 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1ad90 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1ada0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1adb0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1adc0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1add0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1ade0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1adf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1ae00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ae10 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1ae20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d  int rc;.  rc = m
1ae30 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1ae40 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1ae50 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 43 55 52  rn rc;.  if( CUR
1ae60 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1ae70 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1ae80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1ae90 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
1aea0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  ;.    *pRes = 1;
1aeb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1aec0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1aed0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1aee0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1aef0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
1af00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1af10 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1af20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1af30 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1af40 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1af50 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
1af60 65 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a  ear pKey/nKey..*
1af70 2a 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65  * Return a succe
1af80 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
1af90 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
1afa0 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
1afb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
1afc0 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
1afd0 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68  gnored.  For oth
1afe0 65 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20  er tables, nKey 
1aff0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b000 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a   bytes of data.*
1b010 2a 20 69 6e 20 70 4b 65 79 2e 20 20 54 68 65 20  * in pKey.  The 
1b020 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1b030 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 77 68  ion specified wh
1b040 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  en the cursor wa
1b050 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20  s.** created is 
1b060 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
1b070 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  keys..**.** If a
1b080 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
1b090 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
1b0a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1b0b0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
1b0c0 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
1b0d0 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
1b0e0 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
1b0f0 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
1b100 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
1b110 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
1b120 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
1b130 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
1b140 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
1b150 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  y..**.** The res
1b160 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  ult of comparing
1b170 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
1b180 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
1b190 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
1b1a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52  s written to *pR
1b1b0 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c  es if pRes!=NULL
1b1c0 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
1b1d0 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20  f.** this value 
1b1e0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
1b1f0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
1b200 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1b210 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1b220 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1b230 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1b240 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
1b250 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69  r than pKey or i
1b260 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1b270 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
1b280 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
1b290 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
1b2a0 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
1b2b0 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
1b2c0 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
1b2d0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1b2e0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1b2f0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1b300 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b310 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
1b320 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  hes pKey..**.** 
1b330 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
1b340 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1b350 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1b360 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b380 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
1b390 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71   pKey..*/.int sq
1b3a0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1b3b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1b3c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1b3d0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 69 6e 74  y, i64 nKey, int
1b3e0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1b3f0 63 3b 0a 20 20 69 6e 74 20 74 72 79 52 69 67 68  c;.  int tryRigh
1b400 74 6d 6f 73 74 3b 0a 20 20 72 63 20 3d 20 6d 6f  tmost;.  rc = mo
1b410 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1b420 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1b430 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  n rc;.  assert( 
1b440 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
1b450 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1b460 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1b470 20 20 74 72 79 52 69 67 68 74 6d 6f 73 74 20 3d    tryRightmost =
1b480 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
1b490 74 4b 65 79 3b 0a 20 20 69 66 28 20 70 43 75 72  tKey;.  if( pCur
1b4a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b4b0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1b4c0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
1b4d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b4e0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1b4f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b500 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 20 66 6f  TE_OK;.  }.   fo
1b510 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
1b520 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
1b530 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
1b540 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
1b550 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1b560 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20  int c = -1;  /* 
1b570 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74  pRes return if t
1b580 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75  able is empty mu
1b590 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20  st be -1 */.    
1b5a0 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
1b5b0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
1b5c0 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  1;.    if( !pPag
1b5d0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65  e->intKey && pKe
1b5e0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  y==0 ){.      re
1b5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1b600 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1b610 20 20 20 20 70 61 67 65 49 6e 74 65 67 72 69 74      pageIntegrit
1b620 79 28 70 50 61 67 65 29 3b 0a 20 20 20 20 77 68  y(pPage);.    wh
1b630 69 6c 65 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b  ile( lwr<=upr ){
1b640 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65  .      void *pCe
1b650 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34  llKey;.      i64
1b660 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1b670 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77   pCur->idx = (lw
1b680 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 20 20  r+upr)/2;.      
1b690 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b6a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1b6b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1b6c0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65  .        u8 *pCe
1b6d0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ll;.        if( 
1b6e0 74 72 79 52 69 67 68 74 6d 6f 73 74 20 29 7b 0a  tryRightmost ){.
1b6f0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
1b700 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 20  idx = upr;.     
1b710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 65     }.        pCe
1b720 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1b730 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1b740 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1b750 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1b760 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1b770 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1b780 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1b790 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1b7a0 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1b7b0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
1b7c0 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1b7d0 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1b7e0 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20   *)&nCellKey);. 
1b7f0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1b800 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1b810 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1b820 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b830 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b  nCellKey>nKey ){
1b840 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
1b850 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79  1;.          try
1b860 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
1b870 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b880 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
1b890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b8a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1b8b0 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20  t available;.   
1b8c0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1b8d0 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79  (void *)fetchPay
1b8e0 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69  load(pCur, &avai
1b8f0 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  lable, 0);.     
1b900 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43     nCellKey = pC
1b910 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1b920 20 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c         if( avail
1b930 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29  able>=nCellKey )
1b940 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1b950 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70  pCur->xCompare(p
1b960 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c  Cur->pArg, nCell
1b970 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e  Key, pCellKey, n
1b980 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
1b990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b9a0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1b9b0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1b9c0 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20   nCellKey );.   
1b9d0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1b9e0 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
1b9f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ba00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ba10 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75  ite3BtreeKey(pCu
1ba20 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
1ba30 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79  (void *)pCellKey
1ba40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1ba50 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28   pCur->xCompare(
1ba60 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c  pCur->pArg, nCel
1ba70 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  lKey, pCellKey, 
1ba80 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20  nKey, pKey);.   
1ba90 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1baa0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
1bab0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
1bac0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1bad0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bae0 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
1baf0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1bb00 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1bb10 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bb20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1bb30 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20  ur->idx;.       
1bb40 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
1bb50 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1bb60 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1bb70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1bb80 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30  pRes ) *pRes = 0
1bb90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1bba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1bbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bbc0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1bbd0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70  .        lwr = p
1bbe0 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20  Cur->idx+1;.    
1bbf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bc00 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   upr = pCur->idx
1bc10 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1bc20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
1bc30 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
1bc40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1bc50 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
1bc60 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1bc70 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
1bc80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bc90 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
1bca0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
1bcb0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
1bcc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1bcd0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1bce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bcf0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1bd00 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1bd10 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
1bd20 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
1bd30 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1bd40 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
1bd50 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
1bd60 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1bd70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   );.      if( pR
1bd80 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a  es ) *pRes = c;.
1bd90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bda0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1bdb0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77    pCur->idx = lw
1bdc0 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
1bdd0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1bde0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1bdf0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
1be00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1be10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1be20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e      }.  }.  /* N
1be30 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a  OT REACHED */.}.
1be40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1be50 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
1be60 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
1be70 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
1be80 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
1be90 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
1bea0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
1beb0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
1bec0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
1bed0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
1bee0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1bef0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
1bf00 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
1bf10 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
1bf20 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
1bf30 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
1bf40 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1bf50 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1bf60 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
1bf70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1bf80 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
1bf90 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1bfa0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
1bfb0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
1bfc0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
1bfd0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
1bfe0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
1bff0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
1c000 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
1c010 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
1c020 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
1c030 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
1c040 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
1c050 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
1c060 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
1c070 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1c080 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1c090 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
1c0a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1c0b0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1c0c0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1c0d0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1c0e0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1c0f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1c100 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1c110 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1c120 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1c130 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1c140 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1c150 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c160 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
1c170 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1c180 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1c190 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1c1a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c1b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1c1c0 45 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  E.  rc = restore
1c1d0 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
1c1e0 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a  ition(pCur, 1);.
1c1f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c200 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1c210 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1c220 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
1c230 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1c240 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1c250 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1c260 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1c270 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23  Cur->skip = 0;.#
1c280 65 6e 64 69 66 20 0a 0a 20 20 61 73 73 65 72 74  endif ..  assert
1c290 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70  ( pRes!=0 );.  p
1c2a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1c2b0 67 65 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52  ge;.  if( CURSOR
1c2c0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1c2d0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1c2e0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1c2f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c300 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1c310 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1c320 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1c330 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
1c340 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b  ;..  pCur->idx++
1c350 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1c360 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
1c370 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65  pCur->idx>=pPage
1c380 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
1c390 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1c3a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
1c3b0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1c3c0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1c3d0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c3e0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
1c3f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1c400 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
1c410 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1c420 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  t(pCur);.      *
1c430 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1c440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c450 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
1c460 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50  f( isRootPage(pP
1c470 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1c480 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1c490 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1c4a0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1c4b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c4c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c4d0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
1c4e0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1c4f0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1c500 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68  ->pPage;.    }wh
1c510 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ile( pCur->idx>=
1c520 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1c530 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1c540 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1c550 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
1c560 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1c570 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
1c580 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c590 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c5a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
1c5b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
1c5c0 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
1c5d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c5e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c5f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
1c600 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1c610 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
1c620 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  c;.}../*.** Step
1c630 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1c640 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
1c650 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
1c660 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c670 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
1c680 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1c690 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
1c6a0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
1c6b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1c6c0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1c6d0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
1c6e0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
1c6f0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
1c700 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
1c710 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c720 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
1c730 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1c740 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1c750 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  rc;.  Pgno pgno;
1c760 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1c770 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e;..#ifndef SQLI
1c780 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1c790 41 43 48 45 0a 20 20 72 63 20 3d 20 72 65 73 74  ACHE.  rc = rest
1c7a0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
1c7b0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31  Position(pCur, 1
1c7c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c7d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1c7e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
1c7f0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
1c800 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1c810 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1c820 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1c830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c840 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1c850 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
1c860 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1c870 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1c880 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c8a0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
1c8b0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1c8c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c8d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
1c8e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
1c8f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  =0 );.  if( !pPa
1c900 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1c910 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
1c920 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1c930 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20   pCur->idx) );. 
1c940 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1c950 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1c960 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1c970 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1c980 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1c990 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
1c9a0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
1c9b0 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  r->idx==0 ){.   
1c9c0 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67     if( isRootPag
1c9d0 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1c9e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1c9f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1ca00 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
1ca10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
1ca20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ca30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
1ca40 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1ca50 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1ca60 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1ca70 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78   }.    pCur->idx
1ca80 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  --;.    pCur->in
1ca90 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1caa0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1cab0 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d  fData && !pPage-
1cac0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1cad0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1cae0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
1caf0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
1cb00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cb10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1cb20 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1cb30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cb40 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
1cb50 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
1cb60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1cb70 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
1cb80 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
1cb90 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
1cba0 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
1cbb0 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a  pager_write().**
1cbc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1cbd0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
1cbe0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
1cbf0 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
1cc00 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
1cc10 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
1cc20 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
1cc30 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1cc40 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
1cc50 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
1cc60 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
1cc70 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
1cc80 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1cc90 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1cca0 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
1ccb0 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
1ccc0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
1ccd0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
1cce0 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
1ccf0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
1cd00 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
1cd10 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
1cd20 76 6f 6b 65 20 73 71 6c 69 74 65 33 70 61 67 65  voke sqlite3page
1cd30 72 5f 75 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  r_unref() on *pp
1cd40 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
1cd50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1cd60 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
1cd70 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
1cd80 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
1cd90 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
1cda0 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
1cdb0 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
1cdc0 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
1cdd0 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
1cde0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1cdf0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
1ce00 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
1ce10 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
1ce20 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
1ce30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ce40 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
1ce50 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
1ce60 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
1ce70 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1ce80 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
1ce90 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
1cea0 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
1ceb0 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
1cec0 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
1ced0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
1cee0 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
1cef0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
1cf00 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
1cf10 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
1cf20 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1cf30 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
1cf40 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
1cf50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1cf60 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1cf70 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d  hared *pBt, .  M
1cf80 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1cf90 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c   .  Pgno *pPgno,
1cfa0 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c   .  Pgno nearby,
1cfb0 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20  .  u8 exact.){. 
1cfc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1cfd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1cfe0 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t n;     /* Numb
1cff0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1d000 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1d010 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   int k;     /* N
1d020 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
1d030 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
1d040 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1d050 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
1d060 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67  >pPage1;.  n = g
1d070 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1d080 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69  >aData[36]);.  i
1d090 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
1d0a0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
1d0b0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1d0c0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
1d0d0 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
1d0e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72      MemPage *pTr
1d0f0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e  unk = 0;.    Pgn
1d100 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 4d 65  o iTrunk;.    Me
1d110 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
1d120 6b 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 73 65  k = 0;.    u8 se
1d130 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
1d140 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
1d150 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
1d160 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
1d170 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
1d180 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
1d190 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
1d1a0 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
1d1b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
1d1c0 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
1d1d0 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
1d1e0 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
1d1f0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1d200 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
1d210 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
1d220 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
1d230 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
1d240 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1d250 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1d260 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
1d270 63 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ct ){.      u8 e
1d280 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
1d290 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
1d2a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1d2b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
1d2c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1d2d0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
1d2e0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
1d2f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1d300 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
1d310 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d320 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1d330 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1d340 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1d350 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
1d360 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
1d370 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1d380 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
1d390 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
1d3a0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
1d3b0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
1d3c0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
1d3d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
1d3e0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
1d3f0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
1d400 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d410 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1d420 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1d430 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1d440 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
1d450 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d460 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
1d470 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
1d480 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
1d490 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
1d4a0 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
1d4b0 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
1d4c0 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
1d4d0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
1d4e0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1d4f0 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
1d500 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
1d510 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
1d520 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
1d530 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
1d540 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
1d550 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
1d560 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
1d570 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1d580 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1d590 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1d5a0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
1d5b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d5c0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1d5d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1d5e0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
1d5f0 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
1d600 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
1d610 20 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20   &pTrunk);.     
1d620 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d630 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d640 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
1d650 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d660 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1d670 20 54 4f 44 4f 3a 20 54 68 69 73 20 73 68 6f 75   TODO: This shou
1d680 6c 64 20 6d 6f 76 65 20 74 6f 20 61 66 74 65 72  ld move to after
1d690 20 74 68 65 20 6c 6f 6f 70 3f 20 2a 2f 0a 20 20   the loop? */.  
1d6a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d6b0 70 61 67 65 72 5f 77 72 69 74 65 28 70 54 72 75  pager_write(pTru
1d6c0 6e 6b 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nk->aData);.    
1d6d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d6e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d6f0 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  pTrunk);.       
1d700 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1d710 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
1d720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d730 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
1d740 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1d750 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1d760 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
1d770 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
1d780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1d790 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
1d7a0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
1d7b0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
1d7c0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
1d7d0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
1d7e0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
1d7f0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
1d800 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
1d810 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
1d820 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
1d830 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
1d840 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
1d850 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
1d860 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1d870 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d880 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
1d890 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1d8a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
1d8b0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
1d8c0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1d8d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1d8e0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
1d8f0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
1d900 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
1d910 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
1d920 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62   if( k>pBt->usab
1d930 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
1d940 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1d950 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
1d960 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
1d970 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
1d980 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1d990 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1d9a0 54 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  T;.#ifndef SQLIT
1d9b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d9c0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
1d9d0 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
1d9e0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
1d9f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1da00 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
1da10 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
1da20 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
1da30 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1da40 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
1da50 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
1da60 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
1da70 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
1da80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1da90 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
1daa0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1dab0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1dac0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1dad0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
1dae0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1daf0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1db00 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1db10 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
1db20 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
1db30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1db40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1db50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1db60 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
1db70 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1db80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1db90 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1dba0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dbb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dbc0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
1dbd0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
1dbe0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
1dbf0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
1dc00 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
1dc10 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
1dc20 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
1dc30 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
1dc40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
1dc50 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1dc60 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1dc70 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1dc80 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
1dc90 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
1dca0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1dcb0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
1dcc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
1dcd0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
1dce0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
1dcf0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1dd00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dd10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1dd20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1dd30 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1dd40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1dd50 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1dd60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dd70 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1dd80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1dd90 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1dda0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  e(pNewTrunk->aDa
1ddb0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ta);.          i
1ddc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ddd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dde0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1ddf0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1de00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1de10 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  pTrunk);.       
1de20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1de30 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
1de40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1de50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1de60 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1de70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1de80 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1de90 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1dea0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1deb0 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
1dec0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1ded0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1dee0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1def0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
1df00 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
1df10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1df20 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1df30 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1df40 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1df50 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
1df60 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
1df70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1df80 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
1df90 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1dfa0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
1dfb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dfc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1dfd0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1dfe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
1dff0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1e000 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1e010 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
1e020 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
1e030 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
1e040 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
1e050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e060 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
1e070 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
1e080 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  k */.        int
1e090 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
1e0a0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
1e0b0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
1e0c0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
1e0d0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
1e0e0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
1e0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1e100 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20  t i, dist;.     
1e110 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
1e120 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
1e130 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1e140 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
1e150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
1e160 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
1e170 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1e180 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
1e190 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1e1a0 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
1e1b0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
1e1c0 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1e1d0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
1e1e0 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
1e1f0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
1e200 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
1e210 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
1e220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e230 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
1e240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e260 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
1e270 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
1e280 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
1e290 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1e2a0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
1e2b0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
1e2c0 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
1e2d0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
1e2e0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
1e2f0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
1e300 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
1e310 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
1e320 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1e330 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
1e340 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20     /* Free page 
1e350 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1e360 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  he file */.     
1e370 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1e380 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e390 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
1e3a0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
1e3b0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
1e3c0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
1e3d0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
1e3f0 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
1e400 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
1e410 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
1e420 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
1e430 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
1e440 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1e450 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
1e460 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1e470 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
1e480 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
1e490 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
1e4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e4b0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
1e4c0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1e4d0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
1e4e0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1e4f0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
1e500 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e520 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1e530 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 28  _dont_rollback((
1e540 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 29  *ppPage)->aData)
1e550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1e560 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1e570 77 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  write((*ppPage)-
1e580 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
1e590 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e5a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e5b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1e5c0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
1e5d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e5f0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1e600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e610 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
1e620 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
1e630 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  );.    }while( s
1e640 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 20  earchList );.   
1e650 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1e660 75 6e 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unk);.  }else{. 
1e670 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1e680 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
1e690 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
1e6a0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
1e6b0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
1e6c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
1e6d0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c      *pPgno = sql
1e6e0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
1e6f0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1e700 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53   + 1;..#ifndef S
1e710 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e720 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1e730 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
1e740 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1e750 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
1e760 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
1e770 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
1e780 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
1e790 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
1e7a0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1e7b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1e7c0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
1e7d0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
1e7e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
1e7f0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
1e800 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
1e810 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
1e820 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
1e830 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
1e840 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28   */.      TRACE(
1e850 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
1e860 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
1e870 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
1e880 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
1e890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
1e8a0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1e8b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1e8c0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
1e8d0 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  +;.    }.#endif.
1e8e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
1e8f0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
1e900 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
1e910 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1e920 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
1e930 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e940 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1e960 67 65 72 5f 77 72 69 74 65 28 28 2a 70 70 50 61  ger_write((*ppPa
1e970 67 65 29 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge)->aData);.   
1e980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1e9a0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
1e9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
1e9c0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1e9d0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
1e9e0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
1e9f0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
1ea00 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1ea10 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1ea20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ea30 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67  ./*.** Add a pag
1ea40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ea50 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72  e file to the fr
1ea60 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71  eelist..**.** sq
1ea70 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1ea80 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64  () is NOT called
1ea90 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
1eaa0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
1eab0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
1eac0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
1ead0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1eae0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1eaf0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1eb00 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20  1;.  int rc, n, 
1eb10 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65  k;..  /* Prepare
1eb20 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72   the page for fr
1eb30 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  eeing */.  asser
1eb40 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
1eb50 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   );.  pPage->isI
1eb60 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nit = 0;.  relea
1eb70 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50  sePage(pPage->pP
1eb80 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d  arent);.  pPage-
1eb90 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20  >pParent = 0;.. 
1eba0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1ebb0 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
1ebc0 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
1ebd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1ebe0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 31 2d  er_write(pPage1-
1ebf0 3e 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  >aData);.  if( r
1ec00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ec10 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
1ec20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1ec30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
1ec40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1ec50 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  , n+1);..#ifdef 
1ec60 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
1ec70 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
1ec80 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1ec90 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
1eca0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
1ecb0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
1ecc0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
1ecd0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
1ece0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
1ecf0 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  zeros..  */.  rc
1ed00 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1ed10 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61  write(pPage->aDa
1ed20 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ta);.  if( rc ) 
1ed30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1ed40 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
1ed50 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
1ed60 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64  >pageSize);.#end
1ed70 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1ed80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1ed90 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  UM.  /* If the d
1eda0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
1edb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
1edc0 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
1edd0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
1ede0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
1edf0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
1ee00 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
1ee10 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1ee20 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  um ){.    rc = p
1ee30 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50  trmapPut(pBt, pP
1ee40 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  age->pgno, PTRMA
1ee50 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a  P_FREEPAGE, 0);.
1ee60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ee70 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
1ee80 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  if..  if( n==0 )
1ee90 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
1eea0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
1eeb0 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  page */.    rc =
1eec0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1eed0 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  ite(pPage->aData
1eee0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1eef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d  return rc;.    m
1ef00 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1ef10 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70  ta, 0, 8);.    p
1ef20 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1ef30 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
1ef40 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52  e->pgno);.    TR
1ef50 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1ef60 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50   %d first\n", pP
1ef70 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
1ef80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
1ef90 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c  er free pages al
1efa0 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65  ready exist.  Re
1efb0 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20  trive the first 
1efc0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a  trunk page.    *
1efd0 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  * of the freelis
1efe0 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68  t and find out h
1eff0 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69  ow many leaves i
1f000 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  t has. */.    Me
1f010 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20  mPage *pTrunk;. 
1f020 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1f030 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
1f040 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1f050 29 2c 20 26 70 54 72 75 6e 6b 29 3b 0a 20 20 20  ), &pTrunk);.   
1f060 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f070 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74   rc;.    k = get
1f080 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1f090 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66  Data[4]);.    if
1f0a0 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ( k>=pBt->usable
1f0b0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
1f0c0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1f0d0 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20   is full.  Turn 
1f0e0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
1f0f0 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a  reed into a new.
1f100 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70        ** trunk p
1f110 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76  age with no leav
1f120 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  es. */.      rc 
1f130 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1f140 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  rite(pPage->aDat
1f150 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  a);.      if( rc
1f160 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f170 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1f180 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e  ge->aData, pTrun
1f190 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  k->pgno);.      
1f1a0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1f1b0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
1f1c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f1d0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1f1e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1f1f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
1f200 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
1f210 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
1f220 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20  cing %d\n",.    
1f230 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
1f240 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70  >pgno, pTrunk->p
1f250 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1f260 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74  {.      /* Add t
1f270 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70  he newly freed p
1f280 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e  age as a leaf on
1f290 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75   the current tru
1f2a0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  nk */.      rc =
1f2b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1f2c0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ite(pTrunk->aDat
1f2d0 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  a);.      if( rc
1f2e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f2f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
1f300 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
1f310 6b 2b 31 29 3b 0a 20 20 20 20 20 20 70 75 74 34  k+1);.      put4
1f320 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1f330 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67  ata[8+k*4], pPag
1f340 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  e->pgno);.#ifnde
1f350 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
1f360 44 45 4c 45 54 45 0a 20 20 20 20 20 20 73 71 6c  DELETE.      sql
1f370 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
1f380 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 72  rite(pBt->pPager
1f390 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1f3a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 54 52 41  #endif.      TRA
1f3b0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1f3c0 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
1f3d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
1f3e0 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
1f3f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
1f400 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1f410 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runk);.  }.  ret
1f420 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f430 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
1f440 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
1f450 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
1f460 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
1f470 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
1f480 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1f490 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f4a0 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
1f4b0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1f4c0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
1f4d0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
1f4e0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
1f4f0 3b 0a 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74  ;..  parseCellPt
1f500 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1f510 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
1f520 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
1f530 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1f540 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
1f550 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1f560 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
1f570 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
1f580 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
1f590 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
1f5a0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
1f5b0 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 6f 76 66  ]);.  while( ovf
1f5c0 6c 50 67 6e 6f 21 3d 30 20 29 7b 0a 20 20 20 20  lPgno!=0 ){.    
1f5d0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a  MemPage *pOvfl;.
1f5e0 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
1f5f0 3e 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61  >sqlite3pager_pa
1f600 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1f610 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ger) ){.      re
1f620 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f630 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1f640 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
1f650 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
1f660 26 70 4f 76 66 6c 29 3b 0a 20 20 20 20 69 66 28  &pOvfl);.    if(
1f670 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f680 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
1f690 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 2d 3e  get4byte(pOvfl->
1f6a0 61 44 61 74 61 29 3b 0a 20 20 20 20 72 63 20 3d  aData);.    rc =
1f6b0 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29   freePage(pOvfl)
1f6c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
1f6d0 65 72 5f 75 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  er_unref(pOvfl->
1f6e0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1f6f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f710 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f720 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
1f730 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
1f740 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
1f750 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
1f760 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1f770 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
1f780 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
1f790 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
1f7a0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
1f7b0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
1f7c0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
1f7d0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1f7e0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
1f7f0 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1f800 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
1f810 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
1f820 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
1f830 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
1f840 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
1f850 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
1f860 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
1f870 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
1f880 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
1f890 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
1f8a0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
1f8b0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
1f8c0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
1f8d0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
1f8e0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
1f8f0 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
1f900 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
1f910 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
1f920 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
1f930 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
1f940 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1f950 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1f960 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1f970 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
1f980 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
1f990 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
1f9a0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
1f9b0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
1f9c0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1f9d0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
1f9e0 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
1f9f0 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
1fa00 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
1fa10 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
1fa20 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa40 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
1fa50 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1fa60 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
1fa70 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
1fa80 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
1fa90 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
1faa0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
1fab0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
1fac0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
1fad0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1fae0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
1faf0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
1fb00 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
1fb10 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1fb20 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
1fb30 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
1fb40 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
1fb50 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46  fo info;..  /* F
1fb60 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
1fb70 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
1fb80 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
1fb90 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
1fba0 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
1fbb0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
1fbc0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
1fbd0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
1fbe0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
1fbf0 5d 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c  ], nData);.  }el
1fc00 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
1fc10 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
1fc20 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
1fc30 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
1fc40 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
1fc50 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
1fc60 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1fc70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
1fc80 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
1fc90 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1fca0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
1fcb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
1fcc0 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 20 29  o.nData==nData )
1fcd0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
1fce0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
1fcf0 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
1fd00 61 74 61 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ata;.  if( pPage
1fd10 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1fd20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
1fd30 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
1fd40 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
1fd50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
1fd60 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
1fd70 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
1fd80 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a     nSrc = nKey;.
1fd90 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
1fda0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
1fdb0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
1fdc0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
1fdd0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
1fde0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
1fdf0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1fe00 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
1fe10 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
1fe20 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
1fe30 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
1fe40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fe50 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
1fe60 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
1fe70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
1fe80 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
1fe90 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
1fea0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
1feb0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50 61   rc = allocatePa
1fec0 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
1fed0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
1fee0 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
1fef0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1ff00 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
1ff10 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1ff20 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
1ff30 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
1ff40 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
1ff50 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
1ff60 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
1ff70 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
1ff80 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
1ff90 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1ffa0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
1ffb0 20 70 61 67 65 20 6e 6f 77 2e 20 54 68 65 20 65   page now. The e
1ffc0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
1ffd0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
1ffe0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a   will be.      *
1fff0 2a 20 61 64 64 65 64 20 6c 61 74 65 72 2c 20 62  * added later, b
20000 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c  y the insertCell
20010 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  () routine..    
20020 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
20030 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
20040 26 20 70 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20  & pgnoPtrmap!=0 
20050 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
20060 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20070 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
20080 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
20090 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f  _OVERFLOW2, pgno
200a0 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d  Ptrmap);.      }
200b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
200c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
200d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
200e0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
200f0 20 2f 2a 20 63 6c 65 61 72 43 65 6c 6c 28 70 50   /* clearCell(pP
20100 61 67 65 2c 20 70 43 65 6c 6c 29 3b 20 2a 2f 0a  age, pCell); */.
20110 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20120 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
20130 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
20140 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
20150 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20160 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
20170 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
20180 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
20190 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
201a0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
201b0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
201c0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
201d0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
201e0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
201f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
20200 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
20210 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
20220 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
20230 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
20240 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 3e 6e  eft;.    if( n>n
20250 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
20260 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20270 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   );.    memcpy(p
20280 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
20290 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  );.    nPayload 
202a0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
202b0 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
202c0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
202d0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
202e0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
202f0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
20300 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
20310 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
20320 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
20330 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
20340 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
20350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20360 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
20370 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  he MemPage.pPare
20380 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68  nt pointer on th
20390 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d  e page whose num
203a0 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20  ber is.** given 
203b0 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
203c0 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d  gument so that M
203d0 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68  emPage.pParent h
203e0 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e  olds the.** poin
203f0 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72 64  ter in the third
20400 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
20410 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e  atic int reparen
20420 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  tPage(BtShared *
20430 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pBt, Pgno pgno, 
20440 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72  MemPage *pNewPar
20450 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  ent, int idx){. 
20460 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b   MemPage *pThis;
20470 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
20480 20 2a 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65   *aData;..  asse
20490 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d  rt( pNewParent!=
204a0 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  0 );.  if( pgno=
204b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
204c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
204d0 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20   pBt->pPager!=0 
204e0 29 3b 0a 20 20 61 44 61 74 61 20 3d 20 73 71 6c  );.  aData = sql
204f0 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
20500 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
20510 6e 6f 29 3b 0a 20 20 69 66 28 20 61 44 61 74 61  no);.  if( aData
20520 20 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20   ){.    pThis = 
20530 28 4d 65 6d 50 61 67 65 2a 29 26 61 44 61 74 61  (MemPage*)&aData
20540 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  [pBt->pageSize];
20550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68  .    assert( pTh
20560 69 73 2d 3e 61 44 61 74 61 3d 3d 61 44 61 74 61  is->aData==aData
20570 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69   );.    if( pThi
20580 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  s->isInit ){.   
20590 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
205a0 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
205b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
205c0 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
205d0 29 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  ) sqlite3pager_u
205e0 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72  nref(pThis->pPar
205f0 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ent->aData);.   
20600 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72       pThis->pPar
20610 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74  ent = pNewParent
20620 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20630 33 70 61 67 65 72 5f 72 65 66 28 70 4e 65 77 50  3pager_ref(pNewP
20640 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20  arent->aData);. 
20650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68       }.      pTh
20660 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  is->idxParent = 
20670 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  idx;.    }.    s
20680 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
20690 66 28 61 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 23  f(aData);.  }..#
206a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
206b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
206c0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
206d0 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uum ){.    retur
206e0 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  n ptrmapPut(pBt,
206f0 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
20700 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d  REE, pNewParent-
20710 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64  >pgno);.  }.#end
20720 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
20730 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
20740 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61  * Change the pPa
20750 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  rent pointer of 
20760 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
20770 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62  pPage to point b
20780 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e  ack.** to pPage.
20790 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
207a0 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79  words, for every
207b0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c   child of pPage,
207c0 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74   invoke reparent
207d0 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b  Page().** to mak
207e0 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68  e sure that each
207f0 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61   child knows tha
20800 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70  t pPage is its p
20810 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  arent..**.** Thi
20820 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
20830 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20  alled after you 
20840 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67  memcpy() one pag
20850 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65  e into.** anothe
20860 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
20870 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
20880 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ges(MemPage *pPa
20890 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ge){.  int i;.  
208a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
208b0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
208c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
208d0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ;..  if( pPage->
208e0 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53 51  leaf ) return SQ
208f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28  LITE_OK;..  for(
20900 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
20910 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
20920 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
20930 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
20940 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
20950 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
20960 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70  = reparentPage(p
20970 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
20980 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a  ll), pPage, i);.
20990 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
209a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
209b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
209c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
209d0 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  f ){.    rc = re
209e0 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
209f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
20a00 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
20a10 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20  rOffset+8]), .  
20a20 20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a       pPage, i);.
20a30 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68      pPage->idxSh
20a40 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ift = 0;.  }.  r
20a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20a60 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
20a70 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
20a80 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
20a90 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
20aa0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
20ab0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
20ac0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
20ad0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
20ae0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
20af0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
20b00 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
20b10 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
20b20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
20b30 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
20b40 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
20b50 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
20b60 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
20b70 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
20b80 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
20b90 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
20ba0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
20bb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
20bc0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
20bd0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
20be0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20bf0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
20c00 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
20c10 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
20c20 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
20c30 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
20c40 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
20c50 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
20c60 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
20c70 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
20c80 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
20c90 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
20ca0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
20cb0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
20cc0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
20cd0 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
20ce0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
20cf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20d00 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
20d10 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20  e(pPage->aData) 
20d20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
20d30 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
20d40 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
20d50 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
20d60 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
20d70 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73 65  yte(ptr);.  asse
20d80 72 74 28 20 70 63 3e 31 30 20 26 26 20 70 63 2b  rt( pc>10 && pc+
20d90 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz<=pPage->pBt->
20da0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
20db0 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
20dc0 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28   pc, sz);.  for(
20dd0 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65  i=idx+1; i<pPage
20de0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74  ->nCell; i++, pt
20df0 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30  r+=2){.    ptr[0
20e00 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20  ] = ptr[2];.    
20e10 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b  ptr[1] = ptr[3];
20e20 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
20e30 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74  ell--;.  put2byt
20e40 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
20e50 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
20e60 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
20e70 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
20e80 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
20e90 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ft = 1;.}../*.**
20ea0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
20eb0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
20ec0 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
20ed0 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
20ee0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
20ef0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
20f00 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
20f10 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
20f20 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
20f30 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
20f40 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
20f50 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
20f60 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
20f70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
20f80 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
20f90 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
20fa0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
20fb0 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
20fc0 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
20fd0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
20fe0 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
20ff0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
21000 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
21010 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
21020 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
21030 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
21040 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
21050 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
21060 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
21070 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
21080 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
21090 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
210a0 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
210b0 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
210c0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
210d0 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
210e0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
210f0 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
21100 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
21110 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
21120 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
21130 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
21140 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
21150 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
21160 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
21170 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
21180 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
21190 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
211a0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
211b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
211c0 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
211d0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
211e0 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
211f0 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
21200 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
21210 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
21220 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
21230 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
21240 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
21250 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
21260 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
21270 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
21280 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
21290 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
212a0 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
212b0 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
212c0 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
212d0 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
212e0 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
212f0 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20  .  u8 nSkip     
21300 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77       /* Do not w
21310 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e  rite the first n
21320 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
21330 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  e cell */.){.  i
21340 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
21350 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
21360 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
21370 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
21380 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
21390 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
213a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
213b0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  p;          /* F
213c0 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e  irst byte of con
213d0 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c  tent for any cel
213e0 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  l in data[] */. 
213f0 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20   int end;       
21400 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
21410 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63   past the last c
21420 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
21430 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ata[] */.  int i
21440 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ns;          /* 
21450 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20  Index in data[] 
21460 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70  where new cell p
21470 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74  ointer is insert
21480 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ed */.  int hdr;
21490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
214a0 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20  set into data[] 
214b0 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64  of the page head
214c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
214d0 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64  Offset;   /* Add
214e0 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65  ress of first ce
214f0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
21500 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ta[] */.  u8 *da
21510 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
21520 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
21530 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
21540 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
21550 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20      /* Used for 
21560 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  moving informati
21570 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74  on around in dat
21580 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  a[] */..  assert
21590 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
215a0 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
215b0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
215c0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
215d0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
215e0 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
215f0 74 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t( sqlite3pager_
21600 69 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  iswriteable(pPag
21610 65 2d 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 69  e->aData) );.  i
21620 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
21630 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
21640 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
21650 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
21660 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
21670 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
21680 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
21690 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
216a0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
216b0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
216c0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
216d0 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65  ( j<sizeof(pPage
216e0 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
216f0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
21700 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
21710 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
21720 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
21730 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
21740 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   i;.    pPage->n
21750 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
21760 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  e{.    data = pP
21770 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
21780 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
21790 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
217a0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
217b0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
217c0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
217d0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
217e0 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
217f0 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
21800 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
21810 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
21820 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
21830 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
21840 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 64 65       int rc = de
21850 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
21860 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
21870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
21880 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
21890 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
218a0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
218b0 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
218c0 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  + sz <= top );. 
218d0 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61     }.    idx = a
218e0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
218f0 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73  ge, sz);.    ass
21900 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20  ert( idx>0 );.  
21910 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d    assert( end <=
21920 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
21930 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70  hdr+5]) );.    p
21940 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
21950 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
21960 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
21970 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
21980 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
21990 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
219a0 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
219b0 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
219c0 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
219d0 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
219e0 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
219f0 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
21a00 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
21a10 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
21a20 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
21a30 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
21a40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
21a50 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
21a60 66 74 20 3d 20 31 3b 0a 20 20 20 20 70 61 67 65  ft = 1;.    page
21a70 49 6e 74 65 67 72 69 74 79 28 70 50 61 67 65 29  Integrity(pPage)
21a80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21a90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21aa0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
21ab0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
21ac0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
21ad0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
21ae0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
21af0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
21b00 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
21b10 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
21b20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
21b30 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
21b40 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
21b50 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
21b60 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
21b70 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
21b80 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
21b90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  );.      if( (in
21ba0 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
21bb0 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
21bc0 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
21bd0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  l ){.        Pgn
21be0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
21bf0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
21c00 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
21c10 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
21c20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
21c30 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
21c40 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
21c50 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
21c60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21c70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
21c80 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21c90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
21ca0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21cb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
21cc0 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
21cd0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
21ce0 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
21cf0 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
21d00 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
21d10 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
21d20 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
21d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21d40 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
21d50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
21d60 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
21d70 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
21d80 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
21d90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
21da0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
21db0 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
21dc0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
21dd0 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
21de0 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
21df0 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53  ies */.  int *aS
21e00 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
21e10 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
21e20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
21e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21e40 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21e50 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
21e60 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
21e70 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
21e80 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
21e90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
21ea0 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
21eb0 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
21ec0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
21ed0 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
21ee0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
21ef0 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
21f00 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
21f10 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
21f20 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
21f30 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
21f40 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
21f50 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
21f60 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53  w==0 );.  totalS
21f70 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ize = 0;.  for(i
21f80 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
21f90 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65  ){.    totalSize
21fa0 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
21fb0 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61  }.  assert( tota
21fc0 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70  lSize+2*nCell<=p
21fd0 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20  Page->nFree );. 
21fe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
21ff0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65  nCell==0 );.  ce
22000 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63  llptr = pPage->c
22010 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  ellOffset;.  dat
22020 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
22030 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
22040 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75  >hdrOffset;.  pu
22050 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
22060 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69  +3], nCell);.  i
22070 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  f( nCell ){.    
22080 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63  cellbody = alloc
22090 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
220a0 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20  totalSize);.    
220b0 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
220c0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
220d0 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e  ( pPage->nFree >
220e0 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  = 2*nCell );.   
220f0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
22100 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f   2*nCell;.    fo
22110 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
22120 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32  i++){.      put2
22130 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70  byte(&data[cellp
22140 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  tr], cellbody);.
22150 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
22160 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
22170 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
22180 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74  ]);.      cellpt
22190 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65  r += 2;.      ce
221a0 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b  llbody += aSize[
221b0 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  i];.    }.    as
221c0 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d  sert( cellbody==
221d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
221e0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20  leSize );.  }.  
221f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e  pPage->nCell = n
22200 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
22210 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
22220 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
22230 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
22240 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
22250 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
22260 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
22270 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
22280 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
22290 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
222a0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
222b0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
222c0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
222d0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
222e0 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
222f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
22300 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
22310 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
22320 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
22330 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
22340 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
22350 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
22360 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
22370 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
22380 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
22390 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
223a0 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
223b0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
223c0 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
223d0 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
223e0 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
223f0 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
22400 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
22410 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
22420 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
22430 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
22440 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
22450 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
22460 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
22470 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
22480 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22490 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
224a0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
224b0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
224c0 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
224d0 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
224e0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
224f0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
22500 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
22510 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
22520 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a  balance(MemPage*
22530 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66  , int);..#ifndef
22540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
22550 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
22560 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
22570 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
22580 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
22590 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
225a0 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
225b0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
225c0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
225d0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
225e0 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
225f0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
22600 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
22610 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
22620 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
22630 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
22640 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
22650 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
22660 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
22670 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
22680 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
22690 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
226a0 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
226b0 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
226c0 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
226d0 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
226e0 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
226f0 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
22700 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
22710 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
22720 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
22730 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
22740 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
22750 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
22760 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
22770 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
22780 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
22790 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
227a0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
227b0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
227c0 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
227d0 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
227e0 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
227f0 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
22800 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
22810 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
22820 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
22830 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
22840 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
22850 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
22860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
22870 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
22880 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61  ge *pPage, MemPa
22890 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20  ge *pParent){.  
228a0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
228b0 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20  e *pNew;.  Pgno 
228c0 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70  pgnoNew;.  u8 *p
228d0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65  Cell;.  int szCe
228e0 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ll;.  CellInfo i
228f0 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20  nfo;.  BtShared 
22900 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
22910 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49  t;.  int parentI
22920 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  dx = pParent->nC
22930 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e  ell;   /* pParen
22940 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  t new divider ce
22950 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
22960 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20  t parentSize;   
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64  /* Size of new d
22990 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
229a0 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36   u8 parentCell[6
229b0 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
229c0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
229d0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
229e0 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  cell */..  /* Al
229f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
22a00 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
22a10 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
22a20 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
22a30 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
22a40 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
22a50 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
22a60 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
22a70 61 74 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  atePage(pBt, &pN
22a80 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
22a90 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
22aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22ac0 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   pCell = pPage->
22ad0 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
22ae0 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53    szCell = cellS
22af0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
22b00 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ell);.  zeroPage
22b10 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44  (pNew, pPage->aD
22b20 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d  ata[0]);.  assem
22b30 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
22b40 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
22b50 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
22b60 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a  rflow = 0;..  /*
22b70 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20   Set the parent 
22b80 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c  of the newly all
22b90 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70  ocated page to p
22ba0 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65  Parent. */.  pNe
22bb0 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  w->pParent = pPa
22bc0 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 70  rent;.  sqlite3p
22bd0 61 67 65 72 5f 72 65 66 28 70 50 61 72 65 6e 74  ager_ref(pParent
22be0 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 2f 2a 20  ->aData);..  /* 
22bf0 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e 74  pPage is current
22c00 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  ly the right-chi
22c10 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43  ld of pParent. C
22c20 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20  hange this.  ** 
22c30 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
22c40 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
22c50 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
22c60 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a  d above and.  **
22c70 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65   pPage is the ne
22c80 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c  xt-to-right chil
22c90 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d. .  */.  asser
22ca0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
22cb0 30 20 29 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c  0 );.  parseCell
22cc0 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43  Ptr(pPage, findC
22cd0 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
22ce0 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26 69 6e 66  ->nCell-1), &inf
22cf0 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  o);.  rc = fillI
22d00 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
22d10 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e  arentCell, 0, in
22d20 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26  fo.nKey, 0, 0, &
22d30 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69  parentSize);.  i
22d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22d60 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
22d70 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29   parentSize<64 )
22d80 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43  ;.  rc = insertC
22d90 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
22da0 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65  entIdx, parentCe
22db0 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20  ll, parentSize, 
22dc0 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 4);.  if( rc!
22dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
22df0 0a 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64  .  put4byte(find
22e00 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
22e10 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c  rent,parentIdx),
22e20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
22e30 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
22e40 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
22e50 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
22e60 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e   pgnoNew);..#ifn
22e70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22e80 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
22e90 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
22ea0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
22eb0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
22ec0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20  ointer map.  ** 
22ed0 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
22ee0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
22ef0 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
22f00 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65  rom the .  ** ce
22f10 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
22f20 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
22f30 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
22f40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
22f50 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
22f60 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
22f70 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
22f80 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
22f90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22fa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22fb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
22fc0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
22fd0 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29  PutOvfl(pNew, 0)
22fe0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
22ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23000 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23010 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
23020 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
23030 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
23040 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c  new page and bal
23050 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
23060 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61  page,.  ** in ca
23070 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63  se the divider c
23080 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75  ell inserted cau
23090 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65  sed it to become
230a0 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a   overfull..  */.
230b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
230c0 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61  ew);.  return ba
230d0 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
230e0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
230f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
23100 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  BALANCE */../*.*
23110 2a 20 54 68 65 20 49 53 41 55 54 4f 56 41 43 55  * The ISAUTOVACU
23120 55 4d 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  UM macro is used
23130 20 77 69 74 68 69 6e 20 62 61 6c 61 6e 63 65 5f   within balance_
23140 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 64 65 74  nonroot() to det
23150 65 72 6d 69 6e 65 0a 2a 2a 20 69 66 20 74 68 65  ermine.** if the
23160 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
23170 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  ts auto-vacuum o
23180 72 20 6e 6f 74 2e 20 42 65 63 61 75 73 65 20 69  r not. Because i
23190 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 77 69 74  t is used.** wit
231a0 68 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hin an expressio
231b0 6e 20 74 68 61 74 20 69 73 20 61 6e 20 61 72 67  n that is an arg
231c0 75 6d 65 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72  ument to another
231d0 20 6d 61 63 72 6f 20 0a 2a 2a 20 28 73 71 6c 69   macro .** (sqli
231e0 74 65 4d 61 6c 6c 6f 63 52 61 77 29 2c 20 69 74  teMallocRaw), it
231f0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
23200 20 74 6f 20 75 73 65 20 63 6f 6e 64 69 74 69 6f   to use conditio
23210 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e  nal compilation.
23220 0a 2a 2a 20 53 6f 2c 20 74 68 69 73 20 6d 61 63  .** So, this mac
23230 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20 69 6e  ro is defined in
23240 73 74 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stead..*/.#ifnde
23250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23260 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
23270 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 28 70   ISAUTOVACUUM (p
23280 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 0a  Bt->autoVacuum).
23290 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 49 53  #else.#define IS
232a0 41 55 54 4f 56 41 43 55 55 4d 20 30 0a 23 65 6e  AUTOVACUUM 0.#en
232b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
232c0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
232d0 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70  butes Cells on p
232e0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
232f0 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  N*2 siblings.** 
23300 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74  of pPage so that
23310 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
23320 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61  about the same a
23330 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
23340 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ace..** Usually 
23350 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
23360 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
23370 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74  age is used in t
23380 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a  he balancing,.**
23390 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62   though more sib
233a0 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
233b0 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69   from one side i
233c0 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66  f pPage is the f
233d0 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20  irst.** or last 
233e0 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
233f0 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68  ent.  If pPage h
23400 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a  as fewer than 2*
23410 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28  NN siblings.** (
23420 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
23430 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
23440 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
23450 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a  root page or a .
23460 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74  ** child of root
23470 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
23480 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61  able siblings pa
23490 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
234a0 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
234b0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
234c0 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
234d0 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
234e0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
234f0 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74  d by one or.** t
23500 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
23510 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
23520 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
23530 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65  t over full. The
23540 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
23550 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20   special and is 
23560 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65  allowed to be ne
23570 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70  arly empty. If p
23580 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
23590 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
235a0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
235b0 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
235c0 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
235d0 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
235e0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
235f0 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
23600 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
23610 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63  ** overfull or c
23620 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
23630 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
23640 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
23650 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
23660 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
23670 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
23680 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
23690 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
236a0 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69  e->aData[].  Thi
236b0 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
236c0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
236d0 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f  verfull.  Part o
236e0 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  f the job of thi
236f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a  s routine is to.
23700 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** make sure all
23710 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65   Cells for pPage
23720 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20   once again fit 
23730 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
23740 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ]..**.** In the 
23750 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
23760 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ing the siblings
23770 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70   of pPage, the p
23780 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a  arent of pPage.*
23790 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f  * might become o
237a0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
237b0 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68  full.  If that h
237c0 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69  appens, then thi
237d0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
237e0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
237f0 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ly on the parent
23800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
23810 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
23820 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
23830 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
23840 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
23850 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
23860 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
23870 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
23880 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
23890 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
238a0 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
238b0 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
238c0 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ot(MemPage *pPag
238d0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
238e0 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
238f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
23900 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42   of pPage */.  B
23910 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23930 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
23940 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
23950 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
23960 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23970 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
23980 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
23990 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
239a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
239b0 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
239c0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
239d0 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  om. */.  int nOl
239e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
239f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23a00 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
23a10 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  d[] */.  int nNe
23a20 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
23a30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23a40 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
23a50 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  w[] */.  int nDi
23a60 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
23a70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23a80 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69  of cells in apDi
23a90 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  v[] */.  int i, 
23aa0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
23ab0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23ac0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
23ad0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
23ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
23af0 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50  x of pPage in pP
23b00 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
23b10 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
23b40 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
23b50 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
23b60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23b80 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
23b90 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72  /.  int leafCorr
23ba0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
23bb0 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
23bc0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
23bd0 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
23be0 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
23bf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
23c00 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
23c10 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
23c20 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
23c30 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
23c40 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
23c50 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
23c60 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
23c70 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
23c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
23c90 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
23ca0 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
23cb0 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
23cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
23cd0 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
23ce0 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
23cf0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
23d00 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
23d10 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
23d20 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
23d30 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pace[] */.  MemP
23d40 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
23d50 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
23d60 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
23d70 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
23d80 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
23d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23da0 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
23db0 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
23dc0 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
23dd0 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
23de0 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
23df0 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
23e00 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
23e10 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
23e20 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
23e30 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
23e40 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
23e50 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
23e60 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
23e70 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
23e80 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
23e90 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
23ea0 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
23eb0 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
23ec0 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
23ed0 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
23ee0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
23ef0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
23f00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
23f10 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
23f20 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
23f30 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
23f40 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
23f50 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
23f60 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
23f70 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
23f80 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
23f90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23fa0 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
23fb0 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
23fc0 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20  .  int *szCell; 
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fe0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
23ff0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
24000 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
24010 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
24020 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24030 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61  e for holding da
24040 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a  ta of apCopy[] *
24050 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 3b 20  /.  u8 *aSpace; 
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
24080 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  d copies of divi
24090 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69  ders cells */.#i
240a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
240b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75  T_AUTOVACUUM.  u
240c0 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  8 *aFrom = 0;.#e
240d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  ndif..  /* .  **
240e0 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
240f0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
24100 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
24110 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
24120 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
24130 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
24140 3e 61 44 61 74 61 29 20 29 3b 0a 20 20 70 42 74  >aData) );.  pBt
24150 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
24160 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
24170 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73  ->pParent;.  ass
24180 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a  ert( pParent );.
24190 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
241a0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61  =(rc = sqlite3pa
241b0 67 65 72 5f 77 72 69 74 65 28 70 50 61 72 65 6e  ger_write(pParen
241c0 74 2d 3e 61 44 61 74 61 29 29 20 29 7b 0a 20 20  t->aData)) ){.  
241d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
241e0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
241f0 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25  CE: begin page %
24200 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22  d child of %d\n"
24210 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
24220 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a  Parent->pgno));.
24230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24240 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
24250 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70  E.  /*.  ** A sp
24260 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
24270 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20  a new entry has 
24280 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74  just been insert
24290 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ed into a.  ** t
242a0 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61  able (that is, a
242b0 20 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65   btree with inte
242c0 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c  ger keys and all
242d0 20 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61   data at the lea
242e0 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ves).  ** and th
242f0 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74  e new entry is t
24300 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24310 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20  try in the tree 
24320 28 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a  (it has the.  **
24330 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68   largest key) th
24340 65 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69  en use the speci
24350 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  al balance_quick
24360 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20  () routine for. 
24370 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20   ** balancing.  
24380 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
24390 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61  is much faster a
243a0 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  nd results in a 
243b0 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63  tighter.  ** pac
243c0 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20  king of data in 
243d0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
243e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
243f0 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20  e->leaf &&.     
24400 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
24410 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c  &.      pPage->l
24420 65 61 66 44 61 74 61 20 26 26 0a 20 20 20 20 20  eafData &&.     
24430 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24440 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50  w==1 &&.      pP
24450 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  age->aOvfl[0].id
24460 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x==pPage->nCell 
24470 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
24480 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
24490 20 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79   &&.      get4by
244a0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
244b0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
244c0 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65  ffset+8])==pPage
244d0 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20  ->pgno.  ){.    
244e0 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20  /*.    ** TODO: 
244f0 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e  Check the siblin
24500 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  gs to the left o
24510 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20  f pPage. It may 
24520 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  be that.    ** t
24530 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c  hey are not full
24540 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65   and no new page
24550 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
24560 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
24570 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
24580 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
24590 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
245a0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65    ** Find the ce
245b0 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ll in the parent
245c0 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74   page whose left
245d0 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61   child points ba
245e0 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65  ck.  ** to pPage
245f0 2e 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72  .  The "idx" var
24600 69 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64  iable is the ind
24610 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e  ex of that cell.
24620 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20    If pPage.  ** 
24630 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  is the rightmost
24640 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
24650 74 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74  t then set idx t
24660 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  o pParent->nCell
24670 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61   .  */.  if( pPa
24680 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29  rent->idxShift )
24690 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
246a0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67  .    pgno = pPag
246b0 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  e->pgno;.    ass
246c0 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74  ert( pgno==sqlit
246d0 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  e3pager_pagenumb
246e0 65 72 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  er(pPage->aData)
246f0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d   );.    for(idx=
24700 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  0; idx<pParent->
24710 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20  nCell; idx++){. 
24720 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
24730 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
24740 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20  nt, idx))==pgno 
24750 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
24760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24770 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c      assert( idx<
24780 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20  pParent->nCell. 
24790 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67              || g
247a0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
247b0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
247c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
247d0 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno );.  }else{
247e0 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65  .    idx = pPage
247f0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d  ->idxParent;.  }
24800 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74  ..  /*.  ** Init
24810 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73  ialize variables
24820 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
24830 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70   be safe to jump
24840 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74  .  ** directly t
24850 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
24860 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e  p at any moment.
24870 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e  .  */.  nOld = n
24880 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  New = 0;.  sqlit
24890 65 33 70 61 67 65 72 5f 72 65 66 28 70 50 61 72  e3pager_ref(pPar
248a0 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ent->aData);..  
248b0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62  /*.  ** Find sib
248c0 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50  ling pages to pP
248d0 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  age and the cell
248e0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61  s in pParent tha
248f0 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68  t divide.  ** th
24900 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20  e siblings.  An 
24910 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
24920 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
24930 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20  ngs on either.  
24940 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  ** side of pPage
24950 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  .  More siblings
24960 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
24970 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
24980 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65  r, if.  ** pPage
24990 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
249a0 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
249b0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
249c0 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74  ide.  If pParent
249d0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
249e0 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
249f0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
24a00 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
24a10 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
24a20 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a  Div = idx - NN;.
24a30 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42    if( nxDiv + NB
24a40 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   > pParent->nCel
24a50 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  l ){.    nxDiv =
24a60 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
24a70 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  - NB + 1;.  }.  
24a80 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20  if( nxDiv<0 ){. 
24a90 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
24aa0 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20  }.  nDiv = 0;.  
24ab0 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76  for(i=0, k=nxDiv
24ac0 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b  ; i<NB; i++, k++
24ad0 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61  ){.    if( k<pPa
24ae0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
24af0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
24b00 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
24b10 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76  , k);.      nDiv
24b20 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
24b30 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
24b40 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
24b50 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
24b60 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
24b70 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
24b80 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
24b90 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
24ba0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
24bb0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
24bc0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
24bd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24bf0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
24c00 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
24c10 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
24c20 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  i], pParent);.  
24c30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
24c40 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
24c50 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69  .    apOld[i]->i
24c60 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20  dxParent = k;.  
24c70 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
24c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
24c90 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
24ca0 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
24cb0 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
24cc0 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
24cd0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
24ce0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
24cf0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
24d00 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 2 in order to
24d10 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
24d20 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
24d30 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
24d40 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29   (nMaxCells + 1)
24d50 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~1;..  /*.  ** 
24d60 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
24d70 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
24d80 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65  ures.  */.  apCe
24d90 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
24da0 63 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d  cRaw( .       nM
24db0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
24dc0 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24de0 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
24df0 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
24e00 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20  of(int)         
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
24e30 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a      + ROUND8(siz
24e40 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42  eof(MemPage))*NB
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a        /* aCopy *
24e70 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
24e80 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20  geSize*(5+NB)   
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
24eb0 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53  ce */.     + (IS
24ec0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61  AUTOVACUUM ? nMa
24ed0 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20  xCells : 0)     
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ef0 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20  aFrom */.  );.  
24f00 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
24f10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
24f20 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
24f30 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
24f40 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
24f50 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e   (int*)&apCell[n
24f60 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
24f70 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
24f80 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
24f90 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f  .  assert( ((aCo
24fa0 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[0] - (u8*)apC
24fb0 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
24fc0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
24fd0 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
24fe0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b    for(i=1; i<NB;
24ff0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79   i++){.    aCopy
25000 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31  [i] = &aCopy[i-1
25010 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
25020 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
25030 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73  mPage))];.    as
25040 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d  sert( ((aCopy[i]
25050 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
25060 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
25070 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
25080 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
25090 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79   aSpace = &aCopy
250a0 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
250b0 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
250c0 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
250d0 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63   assert( ((aSpac
250e0 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  e - (u8*)apCell)
250f0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
25100 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
25110 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e  required */.#ifn
25120 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25130 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
25140 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25150 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20   ){.    aFrom = 
25160 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70  &aSpace[5*pBt->p
25170 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65  ageSize];.  }.#e
25180 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  ndif.  .  /*.  *
25190 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
251a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
251b0 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
251c0 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
251d0 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
251e0 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
251f0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
25200 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
25210 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
25220 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
25230 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
25240 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
25250 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
25260 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
25270 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
25280 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
25290 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
252a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
252b0 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
252c0 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70  age*)&aCopy[i][p
252d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
252e0 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
252f0 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
25300 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d  geSize];.    mem
25310 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
25320 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
25330 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73  Bt->pageSize + s
25340 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
25350 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63  .    /* The memc
25360 70 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67  py() above chang
25370 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
25380 70 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68  p->aData so we h
25390 61 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ave to.    ** se
253a0 74 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  t it again. */. 
253b0 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
253c0 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
253d0 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20  geSize];.  }..  
253e0 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
253f0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
25400 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
25410 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
25420 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
25430 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
25440 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
25450 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
25460 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
25470 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
25480 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
25490 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  pace[] and remov
254a0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
254b0 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
254c0 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
254d0 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
254e0 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
254f0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
25500 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
25510 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
25520 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
25530 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
25540 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
25550 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
25560 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e  * into aSpace[].
25570 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
25580 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
25590 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
255a0 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
255b0 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
255c0 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
255d0 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
255e0 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
255f0 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
25600 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
25610 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
25620 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
25630 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
25640 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
25650 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
25660 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
25670 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
25680 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
25690 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
256a0 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
256b0 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
256c0 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
256d0 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
256e0 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
256f0 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
25700 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
25710 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
25720 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
25730 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
25740 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
25750 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
25760 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
25770 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
25780 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
25790 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
257a0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
257b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
257c0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
257d0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
257e0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
257f0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
25800 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
25810 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
25820 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
25830 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
25840 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25850 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25860 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
25870 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25880 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
25890 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
258a0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
258b0 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
258c0 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
258d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
258e0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
258f0 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
25900 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
25910 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
25920 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
25930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25950 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25960 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
25970 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
25980 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ld-1 ){.      in
25990 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  t sz = cellSizeP
259a0 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
259b0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
259c0 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
259d0 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
259e0 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
259f0 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
25a00 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
25a10 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
25a20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
25a30 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
25a40 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
25a50 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
25a60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
25a70 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
25a80 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
25a90 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
25aa0 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
25ab0 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
25ac0 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
25ad0 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
25ae0 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
25af0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25b00 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
25b10 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
25b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25b30 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
25b40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25b50 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
25b60 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
25b70 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
25b80 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
25b90 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
25ba0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
25bb0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
25bc0 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
25bd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
25be0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
25bf0 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
25c00 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
25c10 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
25c20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
25c30 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51  tion;.#ifndef SQ
25c40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
25c50 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
25c60 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
25c80 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
25c90 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  F;.        }.#en
25ca0 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70  dif.        drop
25cb0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
25cc0 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
25cd0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
25ce0 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
25cf0 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
25d00 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
25d10 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
25d20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
25d30 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
25d40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
25d50 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
25d60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
25d70 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
25d80 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
25d90 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
25da0 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
25db0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
25dc0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
25dd0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
25de0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
25df0 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
25e00 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
25e10 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
25e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25e30 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
25e40 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
25e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25e60 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
25e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25e80 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
25e90 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
25ea0 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
25eb0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
25ec0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
25ed0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
25ee0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
25ef0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
25f00 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
25f10 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
25f20 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
25f30 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
25f40 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
25f50 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
25f60 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
25f70 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
25f80 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
25f90 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
25fa0 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
25fb0 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
25fc0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
25fd0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
25fe0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
25ff0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
26000 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
26010 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
26020 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
26030 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
26040 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
26050 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
26060 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
26070 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
26080 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
26090 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
260a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
260b0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
260c0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
260d0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
260e0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
260f0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
26100 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
26110 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
26120 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
26130 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
26140 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
26150 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
26160 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
26170 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
26180 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
26190 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
261a0 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
261b0 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
261c0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
261d0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
261e0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
261f0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
26200 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
26210 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
26220 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
26230 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
26240 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
26250 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
26260 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
26270 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
26280 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
26290 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
262a0 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
262b0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
262c0 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
262d0 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
262e0 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
262f0 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
26300 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
26310 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
26320 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
26330 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
26340 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
26350 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
26360 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
26370 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
26380 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
26390 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
263a0 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
263b0 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
263c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
263d0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
263e0 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
263f0 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
26400 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
26410 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
26420 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
26430 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
26440 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
26450 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
26460 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
26470 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
26480 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
26490 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
264a0 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
264b0 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
264c0 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
264d0 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
264e0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
264f0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
26500 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
26510 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
26520 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
26530 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
26540 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
26550 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26560 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
26570 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
26580 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
265a0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
265b0 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
265c0 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
265d0 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
265e0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
265f0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
26600 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
26610 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
26620 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26630 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
26640 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
26650 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
26660 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
26670 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
26680 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
26690 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
266a0 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
266b0 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
266c0 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
266d0 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
266e0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
266f0 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
26700 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
26710 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
26720 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
26730 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
26740 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
26750 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
26760 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
26770 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
26780 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
26790 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
267a0 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
267b0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
267c0 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
267d0 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
267e0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
267f0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
26800 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
26810 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26820 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
26830 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
26840 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
26850 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
26860 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
26870 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
26880 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
26890 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
268a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
268b0 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
268c0 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
268d0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
268e0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
268f0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
26900 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
26910 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
26920 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
26930 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
26940 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
26950 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
26960 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
26970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
26980 65 72 5f 77 72 69 74 65 28 70 4e 65 77 2d 3e 61  er_write(pNew->a
26990 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
269a0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
269b0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
269c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
269d0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
269e0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 50    rc = allocateP
269f0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
26a00 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e  &pgnoNew[i], pgn
26a10 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20  oNew[i-1], 0);. 
26a20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
26a30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26a40 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
26a50 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  i] = pNew;.    }
26a60 0a 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20  .    nNew++;.   
26a70 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
26a80 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pageFlags);.  }.
26a90 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
26aa0 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
26ab0 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
26ac0 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
26ad0 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
26ae0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
26af0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
26b00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
26b10 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26b20 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
26b30 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
26b40 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
26b50 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
26b60 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
26b70 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
26b80 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
26b90 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
26ba0 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
26bb0 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
26bc0 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
26bd0 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
26be0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
26bf0 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
26c00 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
26c10 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
26c20 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
26c30 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
26c40 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
26c50 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
26c60 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
26c70 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
26c80 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
26c90 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
26ca0 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
26cb0 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
26cc0 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
26cd0 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
26ce0 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
26cf0 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
26d00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
26d10 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
26d20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
26d30 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
26d40 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
26d50 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
26d60 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
26d70 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
26d80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
26d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
26da0 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69  minV = pgnoNew[i
26db0 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  ];.    int minI 
26dc0 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
26dd0 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
26de0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77       if( pgnoNew
26df0 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  [j]<(unsigned)mi
26e00 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
26e10 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
26e20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a  minV = pgnoNew[j
26e30 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
26e40 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
26e50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
26e60 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
26e70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e  T;.      t = pgn
26e80 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  oNew[i];.      p
26e90 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
26ea0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
26eb0 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   pgnoNew[minI];.
26ec0 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
26ed0 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
26ee0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49      pgnoNew[minI
26ef0 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e  ] = t;.      apN
26f00 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
26f10 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
26f20 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
26f30 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20   %d %d %d  new: 
26f40 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
26f50 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
26f60 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f  d)\n",.    pgnoO
26f70 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64  ld[0], .    nOld
26f80 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d  >=2 ? pgnoOld[1]
26f90 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
26fa0 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a  3 ? pgnoOld[2] :
26fb0 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b   0,.    pgnoNew[
26fc0 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  0], szNew[0],.  
26fd0 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f    nNew>=2 ? pgno
26fe0 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[1] : 0, nNew
26ff0 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
27000 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
27010 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30  ? pgnoNew[2] : 0
27020 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
27030 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
27040 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=4 ? pgnoNew[
27050 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  3] : 0, nNew>=4 
27060 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
27070 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67      nNew>=5 ? pg
27080 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e  noNew[4] : 0, nN
27090 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
270a0 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20   : 0));..  /*.  
270b0 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
270c0 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
270d0 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
270e0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
270f0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
27100 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
27110 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
27120 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
27130 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
27140 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
27150 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
27160 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
27170 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
27180 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
27190 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
271a0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
271b0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
271c0 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d  pgno==pgnoNew[i]
271d0 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65   );.    assemble
271e0 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
271f0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
27200 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
27210 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
27220 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
27230 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
27240 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
27250 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
27260 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69  erflow==0 );..#i
27270 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27280 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
27290 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
272a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
272b0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
272c0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
272d0 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68  ntries.    ** th
272e0 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  at point to the 
272f0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
27300 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54  re rearranged. T
27310 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66  hese can be: lef
27320 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65  t.    ** childre
27330 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20  n of cells, the 
27340 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
27350 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72  he page, or over
27360 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
27370 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
27380 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  cells..    */.  
27390 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
273a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66  acuum ){.      f
273b0 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77  or(k=j; k<cntNew
273c0 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  [i]; k++){.     
273d0 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61     assert( k<nMa
273e0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
273f0 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
27400 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
27410 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
27420 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
27430 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
27440 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
27450 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
27460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27480 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
27490 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
274a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
274b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
274c0 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  if..    j = cntN
274d0 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
274e0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
274f0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
27500 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
27510 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
27520 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
27530 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
27540 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
27550 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
27560 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
27570 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
27580 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
27590 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
275a0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
275b0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
275c0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
275d0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
275e0 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
275f0 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
27600 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
27610 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
27620 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
27630 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
27640 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
27650 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
27660 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27670 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09 2f 2a   leafData ){../*
27680 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
27690 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
276a0 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
276b0 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
276c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
276d0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
276e0 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
276f0 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
27700 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
27710 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
27720 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
27730 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
27740 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
27750 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
27760 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
27770 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
27780 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
27790 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
277a0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
277b0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 61 72  j--;.        par
277c0 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
277d0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
277e0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
277f0 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
27800 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c  e];.        fill
27810 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
27820 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
27830 4b 65 79 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  Key, 0, 0, &sz);
27840 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
27850 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
27860 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
27870 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
27880 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
27890 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
278a0 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
278b0 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70 54  -= 4;.        pT
278c0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53  emp = &aSpace[iS
278d0 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  pace];.        i
278e0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
278f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
27900 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
27910 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ze*5 );.      }.
27920 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
27930 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
27940 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
27950 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
27960 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27970 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
27980 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27990 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
279a0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
279b0 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77  ent,nxDiv), pNew
279c0 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
279d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
279e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
279f0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
27a00 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
27a10 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c  ase, and not a l
27a20 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20  eaf-data tree,. 
27a30 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64       ** then upd
27a40 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
27a50 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72  map with an entr
27a60 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
27a70 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
27a80 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a   that the cell j
27a90 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69  ust inserted poi
27aa0 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e  nts to (if any).
27ab0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27ac0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
27ad0 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61  uum && !leafData
27ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27af0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
27b00 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
27b10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27b30 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
27b40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
27b60 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b  endif.      j++;
27b70 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
27b80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
27b90 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
27ba0 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
27bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
27bc0 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
27bd0 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
27be0 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  EAF)==0 ){.    m
27bf0 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
27c00 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
27c10 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
27c20 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
27c30 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d   }.  if( nxDiv==
27c40 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
27c50 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
27c60 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
27c70 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
27c80 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
27c90 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
27ca0 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
27cb0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
27cc0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
27cd0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
27ce0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
27cf0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
27d00 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
27d10 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
27d20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
27d30 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
27d40 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
27d50 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
27d60 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
27d70 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
27d80 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
27d90 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
27da0 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
27db0 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65    /*.  ** Repare
27dc0 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61  nt children of a
27dd0 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  ll cells..  */. 
27de0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
27df0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
27e00 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
27e10 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ges(apNew[i]);. 
27e20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27e30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
27e40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
27e50 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
27e60 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
27e70 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
27e80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27e90 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27ea0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
27eb0 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
27ec0 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
27ed0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
27ee0 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
27ef0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
27f00 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
27f10 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
27f20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
27f30 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
27f40 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
27f50 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
27f60 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
27f70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
27f80 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
27f90 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50  .  /* assert( pP
27fa0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 20 2f  age->isInit ); /
27fb0 2f 20 4e 6f 21 20 70 50 61 67 65 20 6d 69 67 68  / No! pPage migh
27fc0 74 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  t have been adde
27fd0 64 20 74 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f  d to freelist */
27fe0 0a 20 20 2f 2a 20 70 61 67 65 49 6e 74 65 67 72  .  /* pageIntegr
27ff0 69 74 79 28 70 50 61 67 65 29 3b 20 20 20 20 2f  ity(pPage);    /
28000 2f 20 4e 6f 21 20 70 50 61 67 65 20 6d 69 67 68  / No! pPage migh
28010 74 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  t have been adde
28020 64 20 74 6f 20 66 72 65 65 6c 69 73 74 20 2a 2f  d to freelist */
28030 20 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65   .  rc = balance
28040 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
28050 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
28060 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
28070 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
28080 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
28090 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  iteFree(apCell);
280a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
280b0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
280c0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
280d0 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
280e0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
280f0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
28100 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
28110 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
28120 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45  Parent);.  TRACE
28130 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
28140 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
28150 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
28160 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
28170 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
28180 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
28190 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l));.  return rc
281a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
281b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
281c0 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
281d0 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
281e0 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
281f0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
28200 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
28210 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
28220 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
28230 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
28240 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
28250 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
28260 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
28270 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
28280 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
28290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
282a0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
282b0 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
282c0 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
282f0 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
28300 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28320 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
28330 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
28340 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
28370 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
28380 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
28390 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
283a0 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
283b0 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
283c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
283d0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
283e0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
283f0 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
28400 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
28410 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28430 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
28440 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
28450 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
28460 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
28470 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
28480 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d  ll==0 );.  pBt =
28490 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
284a0 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
284b0 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
284c0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pCell = sqliteMa
284d0 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50  llocRaw( mxCellP
284e0 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
284f0 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  8*)+sizeof(int))
28500 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
28510 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
28520 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
28530 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
28540 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
28550 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
28560 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
28570 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
28580 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
28590 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
285a0 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
285b0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
285c0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
285d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
285e0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
285f0 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
28600 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
28610 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
28620 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
28630 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
28640 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
28650 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
28660 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
28670 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
28680 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
28690 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
286a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
286b0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
286c0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
286d0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
286e0 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
286f0 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
28700 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
28710 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
28720 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
28730 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
28740 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
28750 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
28760 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
28770 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
28780 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
28790 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
287a0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
287b0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
287c0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
287d0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
287e0 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
287f0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
28800 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
28810 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
28820 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
28830 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
28840 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
28850 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
28860 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
28870 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
28880 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
28890 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
288a0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
288b0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
288c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
288d0 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
288e0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
288f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
28900 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
28910 20 67 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e   getPage(pPage->
28920 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
28930 26 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 69 66  &pChild);.    if
28940 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
28950 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
28960 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
28970 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
28980 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70   rc = initPage(p
28990 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20  Child, pPage);. 
289a0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
289b0 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
289c0 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73  alance;.      as
289d0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f  sert( pChild->nO
289e0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
289f0 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
28a00 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20  nFree>=100 ){.  
28a10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
28a20 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ld information w
28a30 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
28a40 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20  oot page, so do 
28a50 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
28a60 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  opy */.        i
28a70 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65  nt i;.        ze
28a80 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
28a90 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  hild->aData[0]);
28aa0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
28ab0 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
28ac0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
28ad0 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66     apCell[i] = f
28ae0 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69  indCell(pChild,i
28af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  );.          szC
28b00 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  ell[i] = cellSiz
28b10 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43  ePtr(pChild, apC
28b20 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ell[i]);.       
28b30 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d   }.        assem
28b40 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70  blePage(pPage, p
28b50 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70  Child->nCell, ap
28b60 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20  Cell, szCell);. 
28b70 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
28b80 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
28b90 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f   of the child to
28ba0 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
28bb0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
28bc0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
28bd0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28be0 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  8], .           
28bf0 20 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c   get4byte(&pChil
28c00 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d  d->aData[pChild-
28c10 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
28c20 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67  .        freePag
28c30 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
28c40 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
28c50 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61  CE: child %d tra
28c60 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c  nsfer to page 1\
28c70 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
28c80 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
28c90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28ca0 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69  child has more i
28cb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
28cc0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
28cd0 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  root..        **
28ce0 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72   The tree is alr
28cf0 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20  eady balanced.  
28d00 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  Do nothing. */. 
28d10 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
28d20 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
28d30 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
28d40 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
28d50 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
28d60 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
28d70 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
28d80 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64  e->aData, pChild
28d90 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  ->aData, pPage->
28da0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
28db0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  ;.      pPage->i
28dc0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
28dd0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
28de0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
28df0 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  initPage(pPage, 
28e00 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
28e10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28e20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
28e30 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
28e40 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
28e50 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
28e60 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
28e70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28e80 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
28e90 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
28ea0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
28eb0 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
28ec0 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73  s(pPage);.    as
28ed0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
28ee0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
28ef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28f00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28f10 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28f20 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  uum ){.      int
28f30 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
28f40 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
28f50 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  l; i++){ .      
28f60 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
28f70 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Ovfl(pPage, i);.
28f80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28fa0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28fb0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
28fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28fd0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
28fe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28ff0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
29000 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
29010 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
29020 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65  e(pChild);.  }.e
29030 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
29040 63 65 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  ce:.  sqliteFree
29050 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
29060 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
29070 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
29080 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
29090 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
290a0 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
290b0 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
290c0 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
290d0 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
290e0 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
290f0 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
29100 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
29110 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
29120 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
29130 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
29140 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
29150 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
29160 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
29170 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
29180 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
29190 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
291a0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
291b0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
291c0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
291d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
291e0 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
291f0 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
29200 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
29210 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
29220 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
29230 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
29240 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
29250 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
29260 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
29270 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
29280 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f   *pBt;         /
29290 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20  * The BTree */. 
292a0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
292b0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73       /* Total us
292c0 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70  able size of a p
292d0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  age */.  u8 *dat
292e0 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
292f0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
29300 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
29310 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20  u8 *cdata;      
29320 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
29330 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
29340 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
29350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
29360 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
29370 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  er in parent */.
29380 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20    int brk;      
29390 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
293a0 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  to content of fi
293b0 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65  rst cell in pare
293c0 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
293d0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
293e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
293f0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29400 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  >0 );.  pBt = pP
29410 61 67 65 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d  age->pBt;.  rc =
29420 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
29430 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
29440 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
29450 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
29460 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29480 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
29490 65 28 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 29  e(pChild->aData)
294a0 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
294b0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
294c0 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  ze;.  data = pPa
294d0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
294e0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
294f0 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74  set;.  brk = get
29500 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
29510 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70  5]);.  cdata = p
29520 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20  Child->aData;.  
29530 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64  memcpy(cdata, &d
29540 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d  ata[hdr], pPage-
29550 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
29560 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b  age->nCell-hdr);
29570 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61  .  memcpy(&cdata
29580 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b  [brk], &data[brk
29590 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72  ], usableSize-br
295a0 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  k);.  assert( pC
295b0 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  hild->isInit==0 
295c0 29 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61  );.  rc = initPa
295d0 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
295e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
295f0 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72  to balancedeeper
29600 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _out;.  memcpy(p
29610 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50  Child->aOvfl, pP
29620 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  age->aOvfl, pPag
29630 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  e->nOverflow*siz
29640 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
29650 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
29660 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61  >nOverflow = pPa
29670 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ge->nOverflow;. 
29680 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76   if( pChild->nOv
29690 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43  erflow ){.    pC
296a0 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  hild->nFree = 0;
296b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
296c0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50  Child->nCell==pP
296d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
296e0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
296f0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
29700 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
29710 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
29720 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29730 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
29740 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45  oChild);.  TRACE
29750 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
29760 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
29770 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
29780 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
29790 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
297a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
297b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
297c0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e  Vacuum ){.    in
297d0 74 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  t i;.    rc = pt
297e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68  rmapPut(pBt, pCh
297f0 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  ild->pgno, PTRMA
29800 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e  P_BTREE, pPage->
29810 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
29820 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
29830 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20  deeper_out;.    
29840 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
29850 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
29860 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29870 70 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c  pPutOvfl(pChild,
29880 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   i);.      if( r
29890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
298a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
298b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
298c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63  .  }.#endif.  rc
298d0 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
298e0 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c  ot(pChild);..bal
298f0 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a  ancedeeper_out:.
29900 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
29910 68 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  hild);.  return 
29920 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
29930 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20  ide if the page 
29940 70 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62  pPage needs to b
29950 65 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20  e balanced.  If 
29960 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20  balancing is.** 
29970 72 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74  required, call t
29980 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
29990 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
299a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
299b0 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20  balance(MemPage 
299c0 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65  *pPage, int inse
299d0 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rt){.  int rc = 
299e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
299f0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
29a00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
29a10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
29a20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
29a30 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
29a40 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
29a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29a60 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K && pPage->nCel
29a70 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
29a80 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c   = balance_shall
29a90 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20  ower(pPage);.   
29aa0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
29ab0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
29ac0 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20  flow>0 || .     
29ad0 20 20 20 28 21 69 6e 73 65 72 74 20 26 26 20 70     (!insert && p
29ae0 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67  Page->nFree>pPag
29af0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
29b00 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20  ze*2/3) ){.     
29b10 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
29b20 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20  nroot(pPage);.  
29b30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
29b50 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
29b60 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68  s all cursors th
29b70 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c  at point to tabl
29b80 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49  e pgnoRoot..** I
29b90 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63  f any of those c
29ba0 75 72 73 6f 72 73 20 6f 74 68 65 72 20 74 68 61  ursors other tha
29bb0 6e 20 70 45 78 63 6c 75 64 65 20 77 65 72 65 20  n pExclude were 
29bc0 6f 70 65 6e 65 64 20 77 69 74 68 20 0a 2a 2a 20  opened with .** 
29bd0 77 72 46 6c 61 67 3d 3d 30 20 74 68 65 6e 20 74  wrFlag==0 then t
29be0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29bf0 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
29c00 44 2e 20 20 49 66 20 61 6c 6c 0a 2a 2a 20 63 75  D.  If all.** cu
29c10 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
29c20 20 74 6f 20 70 67 6e 6f 52 6f 6f 74 20 77 65 72   to pgnoRoot wer
29c30 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  e opened with wr
29c40 46 6c 61 67 3d 3d 31 0a 2a 2a 20 74 68 65 6e 20  Flag==1.** then 
29c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
29c60 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
29c70 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f  **.** In additio
29c80 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f  n to checking fo
29c90 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68  r read-locks (wh
29ca0 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ere a read-lock 
29cb0 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73  .** means a curs
29cc0 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  or opened with w
29cd0 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72  rFlag==0) this r
29ce0 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65  outine also move
29cf0 73 0a 2a 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73  s.** all cursors
29d00 20 6f 74 68 65 72 20 74 68 61 6e 20 70 45 78 63   other than pExc
29d10 6c 75 64 65 20 73 6f 20 74 68 61 74 20 74 68 65  lude so that the
29d20 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74  y are pointing t
29d30 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  o the .** first 
29d40 43 65 6c 6c 20 6f 6e 20 72 6f 6f 74 20 70 61 67  Cell on root pag
29d50 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
29d60 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6e  ssary because an
29d70 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64   insert .** or d
29d80 65 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e  elete might chan
29d90 67 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ge the number of
29da0 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65   cells on a page
29db0 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20   or delete.** a 
29dc0 70 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e  page entirely an
29dd0 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  d we do not want
29de0 20 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75   to leave any cu
29df0 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  rsors .** pointi
29e00 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61  ng to non-exista
29e10 6e 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c  nt pages or cell
29e20 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
29e30 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
29e40 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
29e50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74  gno pgnoRoot, Bt
29e60 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65  Cursor *pExclude
29e70 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
29e80 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
29e90 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
29ea0 70 4e 65 78 74 29 7b 0a 20 20 20 20 75 33 32 20  pNext){.    u32 
29eb0 66 6c 61 67 73 20 3d 20 28 70 2d 3e 70 42 74 72  flags = (p->pBtr
29ec0 65 65 2d 3e 70 53 71 6c 69 74 65 20 3f 20 70 2d  ee->pSqlite ? p-
29ed0 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65  >pBtree->pSqlite
29ee0 2d 3e 66 6c 61 67 73 20 3a 20 30 29 3b 0a 20 20  ->flags : 0);.  
29ef0 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
29f00 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 7c 7c 20 70  t!=pgnoRoot || p
29f10 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e  ==pExclude ) con
29f20 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
29f30 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 26 26 20 66  ->wrFlag==0 && f
29f40 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
29f50 55 6e 63 6f 6d 6d 69 74 74 65 64 20 29 20 63 6f  Uncommitted ) co
29f60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
29f70 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 20 72  p->wrFlag==0 ) r
29f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
29f90 4b 45 44 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  KED;.    if( p->
29fa0 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e  pPage->pgno!=p->
29fb0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
29fc0 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b    moveToRoot(p);
29fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29ff0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2a000 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
2a010 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
2a020 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
2a030 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
2a040 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
2a050 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
2a060 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
2a070 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
2a080 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
2a090 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
2a0a0 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
2a0b0 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
2a0c0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2a0d0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2a0e0 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
2a0f0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
2a100 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
2a110 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
2a120 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
2a130 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
2a140 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
2a150 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
2a160 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
2a170 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
2a180 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
2a190 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
2a1a0 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
2a1b0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2a1c0 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
2a1d0 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
2a1e0 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
2a1f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2a200 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2a210 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2a220 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2a230 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
2a240 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
2a250 61 74 61 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ata   /* The dat
2a260 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
2a270 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
2a280 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2a290 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
2a2a0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2a2b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a2c0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2a2d0 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2a2e0 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
2a2f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
2a300 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66  wCell = 0;..  if
2a310 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2a320 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2a330 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2a340 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2a350 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2a360 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  g an insert */. 
2a370 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2a380 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2a390 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2a3a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2a3b0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2a3c0 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
2a3d0 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b  !pCur->wrFlag ){
2a3e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a3f0 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75  TE_PERM;   /* Cu
2a400 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f  rsor not open fo
2a410 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
2a420 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
2a430 4c 6f 63 6b 73 28 70 42 74 2c 20 70 43 75 72 2d  Locks(pBt, pCur-
2a440 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2a450 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a460 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2a470 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2a480 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2a490 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2a4a0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2a4b0 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2a4c0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2a4d0 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2a4e0 65 20 2a 2f 0a 20 20 72 65 73 74 6f 72 65 4f 72  e */.  restoreOr
2a4f0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2a500 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ion(pCur, 0);.  
2a510 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f  if( .    SQLITE_
2a520 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2a530 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2a540 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2a550 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49  ur)) ||.    SQLI
2a560 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
2a570 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
2a580 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  pCur, pKey, nKey
2a590 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
2a5a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2a5b0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2a5c0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2a5d0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2a5e0 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
2a5f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a600 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
2a610 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52  leafData );.  TR
2a620 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2a630 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
2a640 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
2a650 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2a660 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2a670 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
2a680 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
2a690 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
2a6a0 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
2a6b0 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
2a6c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2a6d0 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73  Init );.  rc = s
2a6e0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
2a6f0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
2a700 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2a710 72 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c  rn rc;.  newCell
2a720 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2a730 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  aw( MX_CELL_SIZE
2a740 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e  (pBt) );.  if( n
2a750 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
2a760 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a770 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
2a780 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
2a790 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
2a7a0 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 26 73 7a  Data, nData, &sz
2a7b0 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
2a7c0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2a7d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2a7e0 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
2a7f0 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
2a800 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2a810 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
2a820 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f  pBt) );.  if( lo
2a830 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
2a840 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a850 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  te ){.    int sz
2a860 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
2a870 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
2a880 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
2a890 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f  ->nCell );.    o
2a8a0 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
2a8b0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2a8c0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
2a8d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2a8e0 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
2a8f0 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
2a900 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
2a910 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2a920 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2a930 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2a940 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
2a950 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2a960 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2a970 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2a980 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2a990 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20  szOld);.  }else 
2a9a0 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
2a9b0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
2a9c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a9d0 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43  ->leaf );.    pC
2a9e0 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70  ur->idx++;.    p
2a9f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2aa00 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2aa10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2aa20 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
2aa30 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2aa40 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2aa50 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
2aa60 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2aa70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2aa80 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2aa90 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2aaa0 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71  age, 1);.  /* sq
2aab0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75  lite3BtreePageDu
2aac0 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43  mp(pCur->pBt, pC
2aad0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ur->pgnoRoot, 1)
2aae0 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68  ; */.  /* fflush
2aaf0 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69  (stdout); */.  i
2ab00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ab10 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2ab20 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e  ot(pCur);.  }.en
2ab30 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69  d_insert:.  sqli
2ab40 74 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b  teFree(newCell);
2ab50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ab60 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2ab70 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2ab80 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2ab90 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
2aba0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2abb0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2abc0 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
2abd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2abe0 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2abf0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2ac00 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2ac10 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
2ac20 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2ac30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
2ac40 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
2ac50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2ac60 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
2ac70 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2ac80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2ac90 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
2aca0 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
2acb0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
2acc0 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
2acd0 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72  ransaction befor
2ace0 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65  e doing a delete
2acf0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
2ad00 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2ad10 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2ad20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2ad30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2ad40 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2ad50 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e   if( pCur->idx >
2ad60 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  = pPage->nCell )
2ad70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ad80 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
2ad90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2ada0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
2adb0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2adc0 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67  f( !pCur->wrFlag
2add0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ade0 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a  QLITE_PERM;   /*
2adf0 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68   Did not open th
2ae00 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72  is cursor for wr
2ae10 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
2ae20 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
2ae30 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
2ae40 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a  oRoot, pCur) ){.
2ae50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ae60 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
2ae70 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
2ae80 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
2ae90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20   lock */.  }..  
2aea0 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  /* Restore the c
2aeb0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2aec0 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20  sition (a no-op 
2aed0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2aee0 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55   not in .  ** CU
2aef0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2af00 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65   state) and save
2af10 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2af20 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
2af30 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ors .  ** open o
2af40 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
2af50 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  . Then call sqli
2af60 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
2af70 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a   on the page.  *
2af80 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  * that the entry
2af90 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
2afa0 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   from..  */.  if
2afb0 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73  ( .    (rc = res
2afc0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2afd0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20  rPosition(pCur, 
2afe0 31 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  1))!=0 ||.    (r
2aff0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2b000 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2b010 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d  noRoot, pCur))!=
2b020 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2b030 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
2b040 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 29  e(pPage->aData))
2b050 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
2b060 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2b070 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
2b080 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70 61  l within it's pa
2b090 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65  ge and leave pCe
2b0a0 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ll pointing to t
2b0b0 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68  he.  ** data. Th
2b0c0 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61  e clearCell() ca
2b0d0 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65  ll frees any ove
2b0e0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2b0f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
2b100 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63    ** cell. The c
2b110 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74  ell itself is st
2b120 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f  ill intact..  */
2b130 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
2b140 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2b150 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50  >idx);.  if( !pP
2b160 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b170 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2b180 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2b190 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
2b1a0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2b1b0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2b1c0 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
2b1d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b1e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2b1f0 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2b200 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2b210 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2b220 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2b230 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2b240 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2b250 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2b260 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2b270 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2b280 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2b290 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2b2a0 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2b2b0 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2b2c0 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2b2d0 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2b2e0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2b2f0 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2b300 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2b310 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2b320 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2b330 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2b340 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2b350 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e  ext;.    int szN
2b360 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ext;  /* The com
2b370 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73  piler warning is
2b380 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69   wrong: szNext i
2b390 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20  s always .      
2b3a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
2b3b0 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
2b3c0 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e   use.  Adding an
2b3d0 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2b3e0 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
2b3f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c         ** to sil
2b400 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  ence the compile
2b410 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65  r slows down the
2b420 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   code. */.    in
2b430 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75  t notUsed;.    u
2b440 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
2b450 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  mpCell = 0;.    
2b460 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e  assert( !pPage->
2b470 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20  leafData );.    
2b480 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  getTempCursor(pC
2b490 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
2b4a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2b4b0 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
2b4c0 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
2b4d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b4e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
2b4f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
2b500 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  M ){.        rc 
2b510 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2b520 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
2b530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b560 33 70 61 67 65 72 5f 77 72 69 74 65 28 6c 65 61  3pager_write(lea
2b570 66 43 75 72 2e 70 50 61 67 65 2d 3e 61 44 61 74  fCur.pPage->aDat
2b580 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
2b590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b5a0 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  ){.      TRACE((
2b5b0 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
2b5c0 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
2b5d0 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
2b5e0 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
2b5f0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
2b600 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2b610 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72  e->pgno, leafCur
2b620 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a  .pPage->pgno));.
2b630 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
2b640 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b650 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2b660 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2b670 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
2b680 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
2b690 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b  e, leafCur.idx);
2b6a0 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
2b6b0 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66  cellSizePtr(leaf
2b6c0 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74  Cur.pPage, pNext
2b6d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2b6e0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2b6f0 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
2b700 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
2b710 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
2b720 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
2b730 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Bt) );.      if(
2b740 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a   tempCell==0 ){.
2b750 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2b760 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2b770 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2b780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b790 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  {.      rc = ins
2b7a0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2b7b0 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
2b7c0 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
2b7d0 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pCell, 0);.    }
2b7e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b800 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2b810 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
2b820 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e   pCur->idx), pgn
2b830 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72  oChild);.      r
2b840 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2b850 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
2b860 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70  OK ){.      drop
2b880 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61  Cell(leafCur.pPa
2b890 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c  ge, leafCur.idx,
2b8a0 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   szNext);.      
2b8b0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
2b8c0 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
2b8d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b8e0 46 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a  Free(tempCell);.
2b8f0 20 20 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43      releaseTempC
2b900 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
2b910 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
2b920 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2b930 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
2b940 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
2b950 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2b960 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2b970 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  o));.    dropCel
2b980 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2b990 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2b9a0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2b9b0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2b9c0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a  (pPage, 0);.  }.
2b9d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b9e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2b9f0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2ba00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ba10 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2ba20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
2ba30 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2ba40 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
2ba50 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
2ba60 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2ba70 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
2ba80 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
2ba90 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
2baa0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
2bab0 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
2bac0 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
2bad0 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
2bae0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2baf0 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
2bb00 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
2bb10 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
2bb20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
2bb30 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
2bb40 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
2bb50 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
2bb60 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
2bb70 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
2bb80 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
2bb90 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
2bba0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69  SQL indices.*/.i
2bbb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2bbc0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2bbd0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2bbe0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2bbf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2bc00 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
2bc10 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
2bc20 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
2bc30 74 20 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d  t rc;.  if( pBt-
2bc40 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2bc50 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2bc60 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2bc70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
2bc80 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  irst */.    retu
2bc90 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2bca0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2bcb0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2bcc0 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2bcd0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2bce0 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69  );..  /* It is i
2bcf0 6c 6c 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65  llegal to create
2bd00 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20   a table if any 
2bd10 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
2bd20 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
2bd30 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62  abase. This is b
2bd40 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76  ecause in auto-v
2bd50 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62  acuum mode the b
2bd60 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20  ackend may.  ** 
2bd70 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64  need to move a d
2bd80 61 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20  atabase page to 
2bd90 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2bda0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e  e new root-page.
2bdb0 0a 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e  .  ** If an open
2bdc0 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
2bdd0 67 20 74 68 65 20 70 61 67 65 20 61 20 70 72 6f  g the page a pro
2bde0 62 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72  blem would occur
2bdf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2be00 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2be10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2be20 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64  OCKED;.  }..#ifd
2be30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2be40 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2be50 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 42   allocatePage(pB
2be60 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2be70 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2be80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2be90 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70  c;.#else.  if( p
2bea0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2beb0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
2bec0 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
2bed0 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
2bee0 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
2bef0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
2bf00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2bf10 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
2bf20 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
2bf30 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
2bf40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
2bf50 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61  a[3] from the da
2bf60 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d  tabase to determ
2bf70 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20  ine where the.  
2bf80 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f    ** root page o
2bf90 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
2bfa0 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b  should go. meta[
2bfb0 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  3] is the larges
2bfc0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2bfd0 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61  ** created so fa
2bfe0 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f  r, so the new ro
2bff0 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61  ot-page is (meta
2c000 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20  [3]+1)..    */. 
2c010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2c020 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
2c030 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
2c040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c050 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2c060 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
2c070 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
2c080 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
2c090 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
2c0a0 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
2c0b0 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
2c0c0 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2c0d0 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
2c0e0 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d     if( pgnoRoot=
2c0f0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2c100 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
2c110 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
2c120 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
2c130 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
2c140 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
2c150 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2c160 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
2c170 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
2c180 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
2c190 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
2c1a0 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
2c1b0 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
2c1c0 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
2c1d0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2c1e0 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
2c1f0 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
2c200 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
2c210 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
2c220 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2c230 3d 20 61 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  = allocatePage(p
2c240 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
2c250 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
2c260 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
2c270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c280 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2c290 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2c2a0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
2c2b0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 75 38  Root ){.      u8
2c2c0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67   eType;.      Pg
2c2d0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
2c2e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c2f0 70 50 61 67 65 4d 6f 76 65 29 3b 0a 20 20 20 20  pPageMove);.    
2c300 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2c310 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
2c320 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Root);.      if(
2c330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c340 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2c350 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2c360 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
2c370 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
2c380 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
2c390 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2c3a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2c3b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
2c3c0 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
2c3d0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2c3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2c3f0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2c400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c410 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2c420 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
2c430 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
2c440 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2c450 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
2c460 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
2c470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2c480 65 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e  er_write(pRoot->
2c490 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  aData);.      if
2c4a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c4b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2c4c0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2c4d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c4e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c4f0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2c500 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
2c510 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
2c520 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  gnoMove);.      
2c530 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2c540 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2c550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c580 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
2c590 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
2c5a0 6f 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ot);.      if( r
2c5b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c5c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c5d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2c5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2c5f0 65 72 5f 77 72 69 74 65 28 70 52 6f 6f 74 2d 3e  er_write(pRoot->
2c600 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  aData);.      if
2c610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c620 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2c630 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2c640 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c660 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2c670 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2c680 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2c690 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2c6a0 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2c6b0 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2c6c0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2c6d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2c6e0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2c6f0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2c700 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2c710 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2c720 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c730 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2c740 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2c750 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2c760 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2c770 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2c780 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2c790 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2c7a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2c7b0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2c7c0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2c7d0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 26  ocatePage(pBt, &
2c7e0 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
2c7f0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
2c800 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2c810 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
2c820 73 65 72 74 28 20 73 71 6c 69 74 65 33 70 61 67  sert( sqlite3pag
2c830 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 70  er_iswriteable(p
2c840 52 6f 6f 74 2d 3e 61 44 61 74 61 29 20 29 3b 0a  Root->aData) );.
2c850 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
2c860 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
2c870 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  AF);.  sqlite3pa
2c880 67 65 72 5f 75 6e 72 65 66 28 70 52 6f 6f 74 2d  ger_unref(pRoot-
2c890 3e 61 44 61 74 61 29 3b 0a 20 20 2a 70 69 54 61  >aData);.  *piTa
2c8a0 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
2c8b0 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
2c8c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2c8d0 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
2c8e0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
2c8f0 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
2c900 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
2c910 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
2c920 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
2c930 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
2c940 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
2c950 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2c960 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2c970 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
2c980 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
2c990 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
2c9a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2c9b0 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
2c9c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2c9d0 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
2c9e0 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20  ent page.  NULL 
2c9f0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a  for the root */.
2ca00 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
2ca10 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag      /* Deall
2ca20 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
2ca30 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ue */.){.  MemPa
2ca40 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
2ca50 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
2ca60 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2ca70 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
2ca80 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 70 61 67   pgno>sqlite3pag
2ca90 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 42 74  er_pagecount(pBt
2caa0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
2cab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2cac0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2cad0 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
2cae0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2caf0 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
2cb00 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
2cb10 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2cb20 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 72 63  sepage_out;.  rc
2cb30 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
2cb40 77 72 69 74 65 28 70 50 61 67 65 2d 3e 61 44 61  write(pPage->aDa
2cb50 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ta);.  if( rc ) 
2cb60 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2cb70 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
2cb80 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2cb90 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2cba0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2cbb0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
2cbc0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2cbd0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2cbe0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2cbf0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2cc00 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70  pCell), pPage->p
2cc10 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2cc20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2cc30 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2cc40 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2cc50 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2cc60 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2cc70 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2cc80 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2cc90 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2cca0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2ccb0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2ccc0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2ccd0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2cce0 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50  e->aData[8]), pP
2ccf0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2cd00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2cd10 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2cd20 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2cd30 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
2cd40 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
2cd50 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2cd60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 65 72 6f   }else{.    zero
2cd70 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
2cd80 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
2cd90 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
2cda0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2cdb0 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2cdc0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
2cdd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2cde0 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
2cdf0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
2ce00 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2ce10 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
2ce20 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
2ce30 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2ce40 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2ce50 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
2ce60 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2ce70 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
2ce80 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
2ce90 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
2cea0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ceb0 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2cec0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2ced0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2cee0 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
2cef0 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2cf00 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
2cf10 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
2cf20 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
2cf30 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
2cf40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2cf50 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
2cf60 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2cf70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
2cf80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
2cf90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2cfa0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
2cfb0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 53 71 6c  e3 *db = p->pSql
2cfc0 69 74 65 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ite;.  if( p->in
2cfd0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2cfe0 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
2cff0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2d000 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2d010 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2d020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2d030 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  is connection is
2d040 20 6e 6f 74 20 69 6e 20 72 65 61 64 2d 75 6e 63   not in read-unc
2d050 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 61 6e  ommitted mode an
2d060 64 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 0a  d currently has.
2d070 20 20 2a 2a 20 61 20 72 65 61 64 2d 63 75 72 73    ** a read-curs
2d080 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  or open on the t
2d090 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72  able being clear
2d0a0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
2d0b0 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20  E_LOCKED..  */. 
2d0c0 20 69 66 28 20 30 3d 3d 64 62 20 7c 7c 20 30 3d   if( 0==db || 0=
2d0d0 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  =(db->flags&SQLI
2d0e0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2d0f0 65 64 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ed) ){.    for(p
2d100 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
2d110 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
2d120 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
2d130 20 69 66 28 20 70 43 75 72 2d 3e 70 42 74 72 65   if( pCur->pBtre
2d140 65 3d 3d 70 20 26 26 20 70 43 75 72 2d 3e 70 67  e==p && pCur->pg
2d150 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
2d160 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
2d170 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 77 72 46  if( 0==pCur->wrF
2d180 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
2d190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2d1a0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 20 20 7d  OCKED;.        }
2d1b0 0a 20 20 20 20 20 20 20 20 6d 6f 76 65 54 6f 52  .        moveToR
2d1c0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  oot(pCur);.     
2d1d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2d1e0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
2d1f0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73  tion of all curs
2d200 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
2d210 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
2d220 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2d230 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2d240 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
2d250 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2d260 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
2d270 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2d280 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2d290 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  able, 0, 0);.}..
2d2a0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2d2b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2d2c0 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2d2d0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2d2e0 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2d2f0 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2d300 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2d310 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2d320 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2d330 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2d340 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2d350 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2d360 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2d370 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2d380 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2d390 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2d3a0 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2d3b0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2d3c0 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2d3d0 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2d3e0 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2d3f0 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2d400 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2d410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2d420 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2d430 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2d440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d450 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2d460 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2d470 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2d480 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2d490 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2d4a0 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2d4b0 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2d4c0 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2d4d0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2d4e0 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2d4f0 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2d500 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2d510 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2d520 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2d530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d540 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2d550 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2d560 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2d570 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2d580 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2d590 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2d5a0 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2d5b0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2d5c0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2d5d0 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2d5e0 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2d5f0 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2d600 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2d610 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2d620 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2d630 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2d640 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2d650 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2d660 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2d670 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dure..*/.int sql
2d680 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2d690 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2d6a0 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2d6b0 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2d6c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2d6d0 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2d6e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2d6f0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
2d700 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2d710 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2d720 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2d730 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2d740 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2d750 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2d760 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2d770 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2d780 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2d790 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2d7a0 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2d7b0 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2d7c0 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2d7d0 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2d7e0 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
2d7f0 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
2d800 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
2d810 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
2d820 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
2d830 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2d840 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
2d850 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2d860 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
2d870 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2d880 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2d890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2d8a0 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
2d8b0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2d8c0 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
2d8d0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2d8e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
2d8f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d900 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
2d910 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20  able);.  if( rc 
2d920 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2d930 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2d940 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2d950 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a   *piMoved = 0;..
2d960 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29    if( iTable>1 )
2d970 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2d980 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2d990 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2d9a0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
2d9b0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2d9c0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
2d9d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2d9e0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61  ){.      Pgno ma
2d9f0 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2da00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2da10 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2da20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20  &maxRootPgno);. 
2da30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2da40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2da50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2da60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2da70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2da80 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ..      if( iTab
2da90 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20  le==maxRootPgno 
2daa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2dab0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2dac0 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20   dropped is the 
2dad0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  table with the l
2dae0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2daf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2db00 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2db10 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74  se, put the root
2db20 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65   page on the fre
2db30 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  e list. .       
2db40 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2db50 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2db60 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2db70 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2db80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2db90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dba0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2dbb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dbc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2dbd0 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2dbe0 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e  g dropped does n
2dbf0 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67  ot have the larg
2dc00 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2dc10 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
2dc20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2dc30 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67   So move the pag
2dc40 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f  e that does into
2dc50 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2dc60 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2dc70 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61   deleted root-pa
2dc80 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ge..        */. 
2dc90 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2dca0 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72  pMove;.        r
2dcb0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2dcc0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2dcd0 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  getPage(pBt, max
2dce0 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
2dcf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2dd00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dd10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2dd20 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2dd30 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
2dd40 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
2dd50 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
2dd60 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29  PAGE, 0, iTable)
2dd70 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2dd80 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2dd90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dda0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ddb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ddc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ddd0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2dde0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2ddf0 20 26 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20   &pMove);.      
2de00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2de10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2de20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2de30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2de40 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
2de50 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
2de60 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
2de70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2de80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2de90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2dea0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2deb0 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
2dec0 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2ded0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
2dee0 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
2def0 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
2df00 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2df10 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
2df20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
2df30 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
2df40 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
2df50 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
2df60 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
2df70 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2df80 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
2df90 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
2dfa0 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
2dfb0 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
2dfc0 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
2dfd0 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2dfe0 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2dff0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2e000 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
2e010 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2e020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e030 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
2e040 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2e050 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
2e060 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2e070 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2e080 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2e090 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45   maxRootPgno!=PE
2e0a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2e0b0 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72  pBt) );..      r
2e0c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e0d0 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2e0e0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20   maxRootPgno);. 
2e0f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e100 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2e110 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  age);.      rele
2e120 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2e130 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2e140 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2e150 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2e160 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64  Table was called
2e170 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2e180 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2e190 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  e, PTF_INTKEY|PT
2e1a0 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65  F_LEAF );.    re
2e1b0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e1c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e1d0 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  c;  .}.../*.** R
2e1e0 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
2e1f0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
2e200 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
2e210 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
2e220 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
2e230 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
2e240 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
2e250 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
2e260 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
2e270 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
2e280 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
2e290 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
2e2a0 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
2e2b0 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
2e2c0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
2e2d0 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
2e2e0 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
2e2f0 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
2e300 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
2e310 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
2e320 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
2e330 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
2e340 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
2e350 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
2e360 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
2e370 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
2e380 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
2e390 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
2e3a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
2e3b0 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
2e3c0 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
2e3d0 4d 65 74 61 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Meta){.  int rc;
2e3e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2e3f0 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
2e400 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2e410 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
2e420 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
2e430 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
2e440 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
2e450 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
2e460 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2e470 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
2e480 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
2e490 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2e4a0 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
2e4b0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2e4c0 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
2e4d0 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
2e4e0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
2e4f0 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
2e500 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
2e510 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c  e by queryTableL
2e520 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61  ock() and lockTa
2e530 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ble())..  */.  r
2e540 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
2e550 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  ck(p, 1, READ_LO
2e560 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
2e570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e580 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e590 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2e5a0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
2e5b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
2e5c0 65 72 5f 67 65 74 28 70 42 74 2d 3e 70 50 61 67  er_get(pBt->pPag
2e5d0 65 72 2c 20 31 2c 20 28 76 6f 69 64 2a 2a 29 26  er, 1, (void**)&
2e5e0 70 50 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pP1);.  if( rc )
2e5f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
2e600 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
2e610 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
2e620 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
2e630 72 5f 75 6e 72 65 66 28 70 50 31 29 3b 0a 0a 20  r_unref(pP1);.. 
2e640 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75   /* If autovacuu
2e650 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20  med is disabled 
2e660 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75  in this build bu
2e670 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
2e680 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20  to .  ** access 
2e690 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  an autovacuumed 
2e6a0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d  database, then m
2e6b0 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ake the database
2e6c0 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f   readonly. .  */
2e6d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2e6e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e6f0 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a   if( idx==4 && *
2e700 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72  pMeta>0 ) pBt->r
2e710 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e  eadOnly = 1;.#en
2e720 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  dif..  /* Grab t
2e730 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  he read-lock on 
2e740 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20  page 1. */.  rc 
2e750 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31  = lockTable(p, 1
2e760 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
2e770 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e780 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69  .** Write meta-i
2e790 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20  nformation back 
2e7a0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
2e7b0 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a  e.  Meta[0] is.*
2e7c0 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  * read-only and 
2e7d0 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74  may not be writt
2e7e0 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
2e7f0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2e800 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
2e810 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b  idx, u32 iMeta){
2e820 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e830 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2e840 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
2e850 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
2e860 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69  ert( idx>=1 && i
2e870 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20  dx<=15 );.  if( 
2e880 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2e890 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2e8a0 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
2e8b0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2e8c0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2e8d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
2e8e0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21  rt( pBt->pPage1!
2e8f0 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42  =0 );.  pP1 = pB
2e900 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
2e910 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2e920 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 31 29  pager_write(pP1)
2e930 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2e940 75 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62 79  urn rc;.  put4by
2e950 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
2e960 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72  *4], iMeta);.  r
2e970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e990 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61   the flag byte a
2e9a0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2e9b0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2e9c0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   the cursor.** i
2e9d0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2e9e0 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ting to..*/.int 
2e9f0 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67  sqlite3BtreeFlag
2ea00 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2ea10 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2ea20 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f  at about CURSOR_
2ea30 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2ea40 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64  e? Probably need
2ea50 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65   to call.  ** re
2ea60 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2ea70 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72  orPosition() her
2ea80 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  e..  */.  MemPag
2ea90 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2eaa0 3e 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e  >pPage;.  return
2eab0 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e   pPage ? pPage->
2eac0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2ead0 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a  Offset] : 0;.}..
2eae0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2eaf0 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
2eb00 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66  a disassembly of
2eb10 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2eb20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  on standard outp
2eb30 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
2eb40 65 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72  e.** is used for
2eb50 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74   debugging and t
2eb60 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  esting only..*/.
2eb70 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2eb80 50 61 67 65 44 75 6d 70 28 42 74 53 68 61 72 65  PageDump(BtShare
2eb90 64 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e 6f  d *pBt, int pgno
2eba0 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 2c  , int recursive,
2ebb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2ebc0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
2ebd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2ebe0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a 20    int i, j, c;. 
2ebf0 20 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75 31   int nFree;.  u1
2ec00 36 20 69 64 78 3b 0a 20 20 69 6e 74 20 68 64 72  6 idx;.  int hdr
2ec10 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
2ec20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75   int isInit;.  u
2ec30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
2ec40 74 61 3b 0a 20 20 63 68 61 72 20 72 61 6e 67 65  ta;.  char range
2ec50 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  [20];.  unsigned
2ec60 20 63 68 61 72 20 70 61 79 6c 6f 61 64 5b 32 30   char payload[20
2ec70 5d 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61  ];..  rc = getPa
2ec80 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 70 67  ge(pBt, (Pgno)pg
2ec90 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69  no, &pPage);.  i
2eca0 73 49 6e 69 74 20 3d 20 70 50 61 67 65 2d 3e 69  sInit = pPage->i
2ecb0 73 49 6e 69 74 3b 0a 20 20 69 66 28 20 70 50 61  sInit;.  if( pPa
2ecc0 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  ge->isInit==0 ){
2ecd0 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50  .    initPage(pP
2ece0 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  age, pParent);. 
2ecf0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
2ed00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ed10 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  }.  hdr = pPage-
2ed20 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
2ed30 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2ed40 61 3b 0a 20 20 63 20 3d 20 64 61 74 61 5b 68 64  a;.  c = data[hd
2ed50 72 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74  r];.  pPage->int
2ed60 4b 65 79 20 3d 20 28 63 20 26 20 28 50 54 46 5f  Key = (c & (PTF_
2ed70 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2ed80 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67  ATA))!=0;.  pPag
2ed90 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 63  e->zeroData = (c
2eda0 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29   & PTF_ZERODATA)
2edb0 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  !=0;.  pPage->le
2edc0 61 66 44 61 74 61 20 3d 20 28 63 20 26 20 50 54  afData = (c & PT
2edd0 46 5f 4c 45 41 46 44 41 54 41 29 21 3d 30 3b 0a  F_LEAFDATA)!=0;.
2ede0 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
2edf0 28 63 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d  (c & PTF_LEAF)!=
2ee00 30 3b 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44  0;.  pPage->hasD
2ee10 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a  ata = !(pPage->z
2ee20 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61  eroData || (!pPa
2ee30 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67  ge->leaf && pPag
2ee40 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 20  e->leafData));. 
2ee50 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
2ee60 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
2ee70 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
2ee80 72 69 6e 74 66 28 22 50 41 47 45 20 25 64 3a 20  rintf("PAGE %d: 
2ee90 20 66 6c 61 67 73 3d 30 78 25 30 32 78 20 20 66   flags=0x%02x  f
2eea0 72 61 67 3d 25 64 20 20 20 70 61 72 65 6e 74 3d  rag=%d   parent=
2eeb0 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20  %d\n", pgno,.   
2eec0 20 64 61 74 61 5b 68 64 72 5d 2c 20 64 61 74 61   data[hdr], data
2eed0 5b 68 64 72 2b 37 5d 2c 20 0a 20 20 20 20 28 70  [hdr+7], .    (p
2eee0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 26 26 20  Page->isInit && 
2eef0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 20  pPage->pParent) 
2ef00 3f 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ? pPage->pParent
2ef10 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b 0a 20 20 61  ->pgno : 0);.  a
2ef20 73 73 65 72 74 28 20 68 64 72 20 3d 3d 20 28 70  ssert( hdr == (p
2ef30 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
2ef40 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 68 64 72  ) );.  idx = hdr
2ef50 20 2b 20 31 32 20 2d 20 70 50 61 67 65 2d 3e 6c   + 12 - pPage->l
2ef60 65 61 66 2a 34 3b 0a 20 20 66 6f 72 28 69 3d 30  eaf*4;.  for(i=0
2ef70 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
2ef80 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
2ef90 66 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69  fo;.    Pgno chi
2efa0 6c 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ld;.    unsigned
2efb0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2efc0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 69 6e    int sz;.    in
2efd0 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 61 64 64  t addr;..    add
2efe0 72 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  r = get2byte(&da
2eff0 74 61 5b 69 64 78 20 2b 20 32 2a 69 5d 29 3b 0a  ta[idx + 2*i]);.
2f000 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 64 61 74      pCell = &dat
2f010 61 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 61 72  a[addr];.    par
2f020 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2f030 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2f040 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 53      sz = info.nS
2f050 69 7a 65 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  ize;.    sprintf
2f060 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c  (range,"%d..%d",
2f070 20 61 64 64 72 2c 20 61 64 64 72 2b 73 7a 2d 31   addr, addr+sz-1
2f080 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2f090 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2f0a0 63 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 7d  child = 0;.    }
2f0b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 69 6c  else{.      chil
2f0c0 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2f0d0 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
2f0e0 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
2f0f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2f100 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
2f110 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 69 66  nfo.nKey;.    if
2f120 28 20 73 7a 3e 73 69 7a 65 6f 66 28 70 61 79 6c  ( sz>sizeof(payl
2f130 6f 61 64 29 2d 31 20 29 20 73 7a 20 3d 20 73 69  oad)-1 ) sz = si
2f140 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 3b  zeof(payload)-1;
2f150 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 61 79 6c  .    memcpy(payl
2f160 6f 61 64 2c 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  oad, &pCell[info
2f170 2e 6e 48 65 61 64 65 72 5d 2c 20 73 7a 29 3b 0a  .nHeader], sz);.
2f180 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
2f190 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  z; j++){.      i
2f1a0 66 28 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c 30 78  f( payload[j]<0x
2f1b0 32 30 20 7c 7c 20 70 61 79 6c 6f 61 64 5b 6a 5d  20 || payload[j]
2f1c0 3e 30 78 37 66 20 29 20 70 61 79 6c 6f 61 64 5b  >0x7f ) payload[
2f1d0 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7d 0a  j] = '.';.    }.
2f1e0 20 20 20 20 70 61 79 6c 6f 61 64 5b 73 7a 5d 20      payload[sz] 
2f1f0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2f200 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
2f210 20 20 20 22 63 65 6c 6c 20 25 32 64 3a 20 69 3d     "cell %2d: i=
2f220 25 2d 31 30 73 20 63 68 6c 64 3d 25 2d 34 64 20  %-10s chld=%-4d 
2f230 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25 2d 34  nk=%-4lld nd=%-4
2f240 64 20 70 61 79 6c 6f 61 64 3d 25 73 5c 6e 22 2c  d payload=%s\n",
2f250 0a 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c  .      i, range,
2f260 20 63 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e 4b 65   child, info.nKe
2f270 79 2c 20 69 6e 66 6f 2e 6e 44 61 74 61 2c 20 70  y, info.nData, p
2f280 61 79 6c 6f 61 64 0a 20 20 20 20 29 3b 0a 20 20  ayload.    );.  
2f290 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2f2a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  leaf ){.    sqli
2f2b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2f2c0 72 69 67 68 74 5f 63 68 69 6c 64 3a 20 25 64 5c  right_child: %d\
2f2d0 6e 22 2c 20 67 65 74 34 62 79 74 65 28 26 64 61  n", get4byte(&da
2f2e0 74 61 5b 68 64 72 2b 38 5d 29 29 3b 0a 20 20 7d  ta[hdr+8]));.  }
2f2f0 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  .  nFree = 0;.  
2f300 69 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67  i = 0;.  idx = g
2f310 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2f320 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20  r+1]);.  while( 
2f330 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61  idx>0 && idx<pPa
2f340 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2f350 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ize ){.    int s
2f360 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
2f370 74 61 5b 69 64 78 2b 32 5d 29 3b 0a 20 20 20 20  ta[idx+2]);.    
2f380 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25  sprintf(range,"%
2f390 64 2e 2e 25 64 22 2c 20 69 64 78 2c 20 69 64 78  d..%d", idx, idx
2f3a0 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 6e 46 72 65  +sz-1);.    nFre
2f3b0 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 73 71 6c  e += sz;.    sql
2f3c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f3d0 22 66 72 65 65 62 6c 6f 63 6b 20 25 32 64 3a 20  "freeblock %2d: 
2f3e0 69 3d 25 2d 31 30 73 20 73 69 7a 65 3d 25 2d 34  i=%-10s size=%-4
2f3f0 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
2f400 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65 2c 20        i, range, 
2f410 73 7a 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  sz, nFree);.    
2f420 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26  idx = get2byte(&
2f430 64 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 20 20  data[idx]);.    
2f440 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  i++;.  }.  if( i
2f450 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx!=0 ){.    sql
2f460 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2f470 22 45 52 52 4f 52 3a 20 6e 65 78 74 20 66 72 65  "ERROR: next fre
2f480 65 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f 75 74  eblock index out
2f490 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c 6e 22   of range: %d\n"
2f4a0 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20 69 66  , idx);.  }.  if
2f4b0 28 20 72 65 63 75 72 73 69 76 65 20 26 26 20 21  ( recursive && !
2f4c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f4d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2f4e0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
2f4f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f500 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2f510 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2f520 20 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28    btreePageDump(
2f530 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2f540 65 6c 6c 29 2c 20 31 2c 20 70 50 61 67 65 29 3b  ell), 1, pPage);
2f550 0a 20 20 20 20 20 20 69 64 78 20 3d 20 67 65 74  .      idx = get
2f560 32 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  2byte(pCell);.  
2f570 20 20 7d 0a 20 20 20 20 62 74 72 65 65 50 61 67    }.    btreePag
2f580 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62  eDump(pBt, get4b
2f590 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d  yte(&data[hdr+8]
2f5a0 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20  ), 1, pPage);.  
2f5b0 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  }.  pPage->isIni
2f5c0 74 20 3d 20 69 73 49 6e 69 74 3b 0a 20 20 73 71  t = isInit;.  sq
2f5d0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
2f5e0 28 64 61 74 61 29 3b 0a 20 20 66 66 6c 75 73 68  (data);.  fflush
2f5f0 28 73 74 64 6f 75 74 29 3b 0a 20 20 72 65 74 75  (stdout);.  retu
2f600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f610 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2f620 50 61 67 65 44 75 6d 70 28 42 74 72 65 65 20 2a  PageDump(Btree *
2f630 70 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74  p, int pgno, int
2f640 20 72 65 63 75 72 73 69 76 65 29 7b 0a 20 20 72   recursive){.  r
2f650 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 44  eturn btreePageD
2f660 75 6d 70 28 70 2d 3e 70 42 74 2c 20 70 67 6e 6f  ump(p->pBt, pgno
2f670 2c 20 72 65 63 75 72 73 69 76 65 2c 20 30 29 3b  , recursive, 0);
2f680 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
2f690 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2f6a0 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
2f6b0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
2f6c0 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c 74 5b  ** Fill aResult[
2f6d0 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  ] with informati
2f6e0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 65 6e 74  on about the ent
2f6f0 72 79 20 61 6e 64 20 70 61 67 65 20 74 68 61 74  ry and page that
2f700 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
2f710 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
2f720 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  * .**   aResult[
2f730 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65 20 6e  0] =  The page n
2f740 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
2f750 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e 74  lt[1] =  The ent
2f760 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ry number.**   a
2f770 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74  Result[2] =  Tot
2f780 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  al number of ent
2f790 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ries on this pag
2f7a0 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 33  e.**   aResult[3
2f7b0 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65 20 28  ] =  Cell size (
2f7c0 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20  local payload + 
2f7d0 68 65 61 64 65 72 29 0a 2a 2a 20 20 20 61 52 65  header).**   aRe
2f7e0 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65  sult[4] =  Numbe
2f7f0 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
2f800 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2f810 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20    aResult[5] =  
2f820 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
2f830 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70 61 67  locks on the pag
2f840 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 36  e.**   aResult[6
2f850 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f  ] =  Total paylo
2f860 61 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b  ad size (local +
2f870 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20   overflow).**   
2f880 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65  aResult[7] =  He
2f890 61 64 65 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ader size in byt
2f8a0 65 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  es.**   aResult[
2f8b0 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c  8] =  Local payl
2f8c0 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52  oad size.**   aR
2f8d0 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65  esult[9] =  Pare
2f8e0 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a  nt page number.*
2f8f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f900 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
2f910 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
2f920 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  ing only..*/.int
2f930 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
2f940 73 6f 72 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  sorInfo(BtCursor
2f950 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 61 52 65   *pCur, int *aRe
2f960 73 75 6c 74 2c 20 69 6e 74 20 75 70 43 6e 74 29  sult, int upCnt)
2f970 7b 0a 20 20 69 6e 74 20 63 6e 74 2c 20 69 64 78  {.  int cnt, idx
2f980 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2f990 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2f9a0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 74 6d 70  ;.  BtCursor tmp
2f9b0 43 75 72 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  Cur;..  int rc =
2f9c0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2f9d0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2f9e0 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
2f9f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fa00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2fa10 7d 0a 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69  }..  pageIntegri
2fa20 74 79 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73  ty(pPage);.  ass
2fa30 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2fa40 69 74 20 29 3b 0a 20 20 67 65 74 54 65 6d 70 43  it );.  getTempC
2fa50 75 72 73 6f 72 28 70 43 75 72 2c 20 26 74 6d 70  ursor(pCur, &tmp
2fa60 43 75 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 75  Cur);.  while( u
2fa70 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f  pCnt-- ){.    mo
2fa80 76 65 54 6f 50 61 72 65 6e 74 28 26 74 6d 70 43  veToParent(&tmpC
2fa90 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ur);.  }.  pPage
2faa0 20 3d 20 74 6d 70 43 75 72 2e 70 50 61 67 65 3b   = tmpCur.pPage;
2fab0 0a 20 20 70 61 67 65 49 6e 74 65 67 72 69 74 79  .  pageIntegrity
2fac0 28 70 50 61 67 65 29 3b 0a 20 20 61 52 65 73 75  (pPage);.  aResu
2fad0 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 70  lt[0] = sqlite3p
2fae0 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
2faf0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
2fb00 20 61 73 73 65 72 74 28 20 61 52 65 73 75 6c 74   assert( aResult
2fb10 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  [0]==pPage->pgno
2fb20 20 29 3b 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d   );.  aResult[1]
2fb30 20 3d 20 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20   = tmpCur.idx;. 
2fb40 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50   aResult[2] = pP
2fb50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  age->nCell;.  if
2fb60 28 20 74 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20  ( tmpCur.idx>=0 
2fb70 26 26 20 74 6d 70 43 75 72 2e 69 64 78 3c 70 50  && tmpCur.idx<pP
2fb80 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2fb90 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74    getCellInfo(&t
2fba0 6d 70 43 75 72 29 3b 0a 20 20 20 20 61 52 65 73  mpCur);.    aRes
2fbb0 75 6c 74 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e  ult[3] = tmpCur.
2fbc0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20  info.nSize;.    
2fbd0 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70  aResult[6] = tmp
2fbe0 43 75 72 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  Cur.info.nData;.
2fbf0 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d      aResult[7] =
2fc00 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65   tmpCur.info.nHe
2fc10 61 64 65 72 3b 0a 20 20 20 20 61 52 65 73 75 6c  ader;.    aResul
2fc20 74 5b 38 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e  t[8] = tmpCur.in
2fc30 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  fo.nLocal;.  }el
2fc40 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  se{.    aResult[
2fc50 33 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73  3] = 0;.    aRes
2fc60 75 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[6] = 0;.    
2fc70 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a  aResult[7] = 0;.
2fc80 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d      aResult[8] =
2fc90 20 30 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c   0;.  }.  aResul
2fca0 74 5b 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46  t[4] = pPage->nF
2fcb0 72 65 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a  ree;.  cnt = 0;.
2fcc0 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
2fcd0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2fce0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2fcf0 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  1]);.  while( id
2fd00 78 3e 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  x>0 && idx<pPage
2fd10 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2fd20 65 20 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a  e ){.    cnt++;.
2fd30 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62 79      idx = get2by
2fd40 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2fd50 5b 69 64 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52  [idx]);.  }.  aR
2fd60 65 73 75 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a  esult[5] = cnt;.
2fd70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
2fd80 72 65 6e 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f  rent==0 || isRoo
2fd90 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
2fda0 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d      aResult[9] =
2fdb0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2fdc0 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50   aResult[9] = pP
2fdd0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
2fde0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  no;.  }.  releas
2fdf0 65 54 65 6d 70 43 75 72 73 6f 72 28 26 74 6d 70  eTempCursor(&tmp
2fe00 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Cur);.  return S
2fe10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
2fe20 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2fe30 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
2fe40 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
2fe50 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
2fe60 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
2fe70 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
2fe80 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
2fe90 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
2fea0 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
2feb0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
2fec0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
2fed0 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63  /*.** This struc
2fee0 74 75 72 65 20 69 73 20 70 61 73 73 65 64 20 61  ture is passed a
2fef0 72 6f 75 6e 64 20 74 68 72 6f 75 67 68 20 61 6c  round through al
2ff00 6c 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  l the sanity che
2ff10 63 6b 69 6e 67 20 72 6f 75 74 69 6e 65 73 0a 2a  cking routines.*
2ff20 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  * in order to ke
2ff30 65 70 20 74 72 61 63 6b 20 6f 66 20 73 6f 6d 65  ep track of some
2ff40 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 69 6e   global state in
2ff50 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  formation..*/.ty
2ff60 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 74  pedef struct Int
2ff70 65 67 72 69 74 79 43 6b 20 49 6e 74 65 67 72 69  egrityCk Integri
2ff80 74 79 43 6b 3b 0a 73 74 72 75 63 74 20 49 6e 74  tyCk;.struct Int
2ff90 65 67 72 69 74 79 43 6b 20 7b 0a 20 20 42 74 53  egrityCk {.  BtS
2ffa0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 2f  hared *pBt;    /
2ffb0 2a 20 54 68 65 20 74 72 65 65 20 62 65 69 6e 67  * The tree being
2ffc0 20 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f 0a   checked out */.
2ffd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
2ffe0 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74   /* The associat
2fff0 65 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20  ed pager.  Also 
30000 61 63 63 65 73 73 69 62 6c 65 20 62 79 20 70 42  accessible by pB
30010 74 2d 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20 69  t->pPager */.  i
30020 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 2f 2a  nt nPage;     /*
30030 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30040 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30050 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65 66   */.  int *anRef
30060 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
30070 66 20 74 69 6d 65 73 20 65 61 63 68 20 70 61 67  f times each pag
30080 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 20  e is referenced 
30090 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
300a0 73 67 3b 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20  sg; /* An error 
300b0 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20 6f  message.  NULL o
300c0 66 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65 6e  f no errors seen
300d0 2e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  . */.};..#ifndef
300e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
300f0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
30100 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
30110 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
30120 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
30130 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30140 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
30150 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
30160 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
30170 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
30180 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
30190 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
301a0 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
301b0 32 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  2;.  va_start(ap
301c0 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d  , zFormat);.  zM
301d0 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  sg2 = sqlite3VMP
301e0 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
301f0 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
30200 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30  ;.  if( zMsg1==0
30210 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20   ) zMsg1 = "";. 
30220 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72   if( pCheck->zEr
30230 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72  rMsg ){.    char
30240 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d   *zOld = pCheck-
30250 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43  >zErrMsg;.    pC
30260 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  heck->zErrMsg = 
30270 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
30280 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
30290 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20  >zErrMsg, zOld, 
302a0 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  "\n", zMsg1, zMs
302b0 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
302c0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4f     sqliteFree(zO
302d0 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ld);.  }else{.  
302e0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
302f0 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
30300 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67  Msg, zMsg1, zMsg
30310 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
30320 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  }.  sqliteFree(z
30330 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Msg2);.}.#endif 
30340 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
30350 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
30360 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
30370 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
30380 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
30390 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
303a0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
303b0 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
303c0 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
303d0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
303e0 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
303f0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
30400 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
30410 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
30420 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
30430 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
30440 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
30450 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
30460 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
30470 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
30480 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
30490 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
304a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
304b0 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
304c0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
304d0 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
304e0 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65  Check, int iPage
304f0 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74  , char *zContext
30500 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  ){.  if( iPage==
30510 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
30520 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b  if( iPage>pCheck
30530 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65  ->nPage || iPage
30540 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  <0 ){.    checkA
30550 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30560 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61   zContext, "inva
30570 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
30580 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30590 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
305a0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52   if( pCheck->anR
305b0 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a  ef[iPage]==1 ){.
305c0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
305d0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
305e0 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65  ext, "2nd refere
305f0 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c  nce to page %d",
30600 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
30610 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
30620 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e  urn  (pCheck->an
30630 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b  Ref[iPage]++)>1;
30640 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
30650 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30660 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  UM./*.** Check t
30670 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e  hat the entry in
30680 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
30690 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64   for page iChild
306a0 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67   maps to .** pag
306b0 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74  e iParent, point
306c0 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e  er type ptrType.
306d0 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20   If not, append 
306e0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
306f0 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a  .** to pCheck..*
30700 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
30710 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74  eckPtrmap(.  Int
30720 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
30730 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  ,   /* Integrity
30740 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a   check context *
30750 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
30760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
30770 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ild page number 
30780 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
30790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
307a0 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
307b0 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67  map type */.  Pg
307c0 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20  no iParent,     
307d0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
307e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72   pointer map par
307f0 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
30800 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
30810 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ext         /* C
30820 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69  ontext descripti
30830 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72  on (used for err
30840 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20  or msg) */.){.  
30850 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74  int rc;.  u8 ePt
30860 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f  rmapType;.  Pgno
30870 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a   iPtrmapParent;.
30880 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65  .  rc = ptrmapGe
30890 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69  t(pCheck->pBt, i
308a0 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54  Child, &ePtrmapT
308b0 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72  ype, &iPtrmapPar
308c0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
308d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
308e0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
308f0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
30900 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61  , "Failed to rea
30910 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22  d ptrmap key=%d"
30920 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  , iChild);.    r
30930 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
30940 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65  ( ePtrmapType!=e
30950 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50  Type || iPtrmapP
30960 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29  arent!=iParent )
30970 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
30980 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30990 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42  ntext, .      "B
309a0 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79  ad ptr map entry
309b0 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64   key=%d expected
309c0 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64  =(%d,%d) got=(%d
309d0 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43  ,%d)", .      iC
309e0 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61  hild, eType, iPa
309f0 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70  rent, ePtrmapTyp
30a00 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  e, iPtrmapParent
30a10 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
30a20 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
30a30 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
30a40 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66  e freelist or of
30a50 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
30a60 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66  e list..** Verif
30a70 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
30a80 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
30a90 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a  e list is N..*/.
30aa0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
30ab0 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69  kList(.  Integri
30ac0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
30ad0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
30ae0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  king context */.
30af0 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74    int isFreeList
30b00 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
30b10 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20  for a freelist. 
30b20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66   False for overf
30b30 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  low page list */
30b40 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
30b50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
30b60 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73   number for firs
30b70 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  t page in the li
30b80 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  st */.  int N,  
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30ba0 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
30bb0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
30bc0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
30bd0 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
30be0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
30bf0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
30c00 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
30c10 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e  int expected = N
30c20 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d  ;.  int iFirst =
30c30 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28   iPage;.  while(
30c40 20 4e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   N-- > 0 ){.    
30c50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
30c60 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 69 50  Ovfl;.    if( iP
30c70 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
30c80 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
30c90 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
30ca0 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
30cb0 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
30cc0 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
30cd0 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
30ce0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
30cf0 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
30d00 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
30d10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
30d20 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
30d30 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
30d40 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
30d50 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
30d60 72 5f 67 65 74 28 70 43 68 65 63 6b 2d 3e 70 50  r_get(pCheck->pP
30d70 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67  ager, (Pgno)iPag
30d80 65 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4f 76 66  e, (void**)&pOvf
30d90 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  l) ){.      chec
30da0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30db0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61  k, zContext, "fa
30dc0 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65  iled to get page
30dd0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
30de0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
30df0 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c  .    if( isFreeL
30e00 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
30e10 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
30e20 4f 76 66 6c 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Ovfl[4]);.#ifnde
30e30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30e40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
30e50 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
30e60 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
30e70 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
30e80 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
30e90 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30ea0 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30eb0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30ec0 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
30ed0 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
30ee0 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20  ze/4-8 ){.      
30ef0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30f00 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30f10 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
30f20 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
30f30 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
30f40 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
30f50 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
30f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30f70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
30f80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30f90 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
30fa0 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
30fb0 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65  [8+i*4]);.#ifnde
30fc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30fd0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
30fe0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
30ff0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31000 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
31010 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31020 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52  , iFreePage, PTR
31030 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
31040 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31050 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31060 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65           checkRe
31070 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  f(pCheck, iFreeP
31080 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
310a0 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20    N -= n;.      
310b0 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
310c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
310d0 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b  VACUUM.    else{
310e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
310f0 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  s database suppo
31100 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  rts auto-vacuum 
31110 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74  and iPage is not
31120 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20   the last.      
31130 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
31140 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63  overflow list, c
31150 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f  heck that the po
31160 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
31170 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
31180 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20   following page 
31190 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20  matches iPage.. 
311a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
311b0 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
311c0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30  utoVacuum && N>0
311d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
311e0 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 29 3b  get4byte(pOvfl);
311f0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
31200 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
31210 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
31220 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31230 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
31240 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
31250 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
31260 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vfl);.    sqlite
31270 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4f 76  3pager_unref(pOv
31280 66 6c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  fl);.  }.}.#endi
31290 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
312a0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
312b0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
312c0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
312d0 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44  TY_CHECK./*.** D
312e0 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79  o various sanity
312f0 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e   checks on a sin
31300 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72  gle page of a tr
31310 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ee.  Return.** t
31320 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20  he tree depth.  
31330 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72  Root pages retur
31340 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66  n 0.  Parents of
31350 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72   root pages.** r
31360 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20  eturn 1, and so 
31370 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  forth..** .** Th
31380 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64  ese checks are d
31390 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  one:.**.**      
313a0 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  1.  Make sure th
313b0 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65  at cells and fre
313c0 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f  eblocks do not o
313d0 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20  verlap.**       
313e0 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74     but combine t
313f0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76  o completely cov
31400 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  er the page..** 
31410 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75   NO  2.  Make su
31420 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65  re cell keys are
31430 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e   in order..**  N
31440 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  3.  Make sure
31450 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20   no key is less 
31460 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
31470 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zLowerBound..**
31480 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73    NO  4.  Make s
31490 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72  ure no key is gr
314a0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
314b0 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75  ual to zUpperBou
314c0 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20  nd..**      5.  
314d0 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
314e0 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ity of overflow 
314f0 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36  pages..**      6
31500 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  .  Recursively c
31510 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67  all checkTreePag
31520 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  e on all childre
31530 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56  n..**      7.  V
31540 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
31550 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c  epth of all chil
31560 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65  dren is the same
31570 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61  ..**      8.  Ma
31580 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67  ke sure this pag
31590 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33  e is at least 33
315a0 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69  % full or else i
315b0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  t is.**         
315c0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
315d0 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
315e0 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61   int checkTreePa
315f0 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ge(.  IntegrityC
31600 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43  k *pCheck,  /* C
31610 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73  ontext for the s
31620 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
31630 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
31640 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
31650 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
31660 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
31670 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
31680 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
31690 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  page */.  char *
316a0 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20  zParentContext  
316b0 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78  /* Parent contex
316c0 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  t */.){.  MemPag
316d0 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
316e0 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32  i, rc, depth, d2
316f0 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69  , pgno, cnt;.  i
31700 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72  nt hdr, cellStar
31710 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  t;.  int nCell;.
31720 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74    u8 *data;.  Bt
31730 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69  Shared *pBt;.  i
31740 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
31750 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31   char zContext[1
31760 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74  00];.  char *hit
31770 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6f  ;..  sprintf(zCo
31780 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a  ntext, "Page %d:
31790 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f   ", iPage);..  /
317a0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
317b0 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a   page exists.  *
317c0 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b  /.  pBt = pCheck
317d0 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53  ->pBt;.  usableS
317e0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
317f0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61  eSize;.  if( iPa
31800 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
31810 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66  ;.  if( checkRef
31820 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
31830 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20  zParentContext) 
31840 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
31850 28 20 28 72 63 20 3d 20 67 65 74 50 61 67 65 28  ( (rc = getPage(
31860 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  pBt, (Pgno)iPage
31870 2c 20 26 70 50 61 67 65 29 29 21 3d 30 20 29 7b  , &pPage))!=0 ){
31880 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31890 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
318a0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
318b0 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
318c0 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
318d0 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
318e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
318f0 66 28 20 28 72 63 20 3d 20 69 6e 69 74 50 61 67  f( (rc = initPag
31900 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
31910 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
31920 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31930 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
31940 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e  nitPage() return
31950 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22  s error code %d"
31960 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61  , rc);.    relea
31970 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
31980 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
31990 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74  ..  /* Check out
319a0 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a   all the cells..
319b0 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30    */.  depth = 0
319c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
319d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
319e0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
319f0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20  ;.    int sz;.  
31a00 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
31a10 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70  ..    /* Check p
31a20 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20  ayload overflow 
31a30 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20  pages.    */.   
31a40 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78   sprintf(zContex
31a50 74 2c 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65  t, "On tree page
31a60 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20   %d cell %d: ", 
31a70 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  iPage, i);.    p
31a80 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
31a90 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 70 61  pPage,i);.    pa
31aa0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
31ab0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
31ac0 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e  .    sz = info.n
31ad0 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70  Data;.    if( !p
31ae0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73  Page->intKey ) s
31af0 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  z += info.nKey;.
31b00 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e      if( sz>info.
31b10 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
31b20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20  int nPage = (sz 
31b30 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
31b40 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f  usableSize - 5)/
31b50 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  (usableSize - 4)
31b60 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  ;.      Pgno pgn
31b70 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
31b80 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
31b90 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65  erflow]);.#ifnde
31ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31bb0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
31bc0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31bd0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
31be0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31bf0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
31c00 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50  AP_OVERFLOW1, iP
31c10 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31c20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31c30 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70       checkList(p
31c40 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76  Check, 0, pgnoOv
31c50 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74  fl, nPage, zCont
31c60 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
31c70 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79   /* Check sanity
31c80 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70   of left child p
31c90 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
31ca0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
31cb0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d   ){.      pgno =
31cc0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
31cd0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31ce0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31cf0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
31d00 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31d10 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
31d20 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
31d30 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
31d40 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31d50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31d60 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54       d2 = checkT
31d70 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70  reePage(pCheck,p
31d80 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65  gno,pPage,zConte
31d90 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  xt);.      if( i
31da0 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20  >0 && d2!=depth 
31db0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
31dc0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31dd0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69  , zContext, "Chi
31de0 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69  ld page depth di
31df0 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d  ffers");.      }
31e00 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64  .      depth = d
31e10 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
31e20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
31e30 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
31e40 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
31e50 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
31e60 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73  ffset+8]);.    s
31e70 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c  printf(zContext,
31e80 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20   "On page %d at 
31e90 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20  right child: ", 
31ea0 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
31eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31ec0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
31ed0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31ee0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72  {.      checkPtr
31ef0 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
31f00 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
31f10 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  iPage, 0);.    }
31f20 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
31f30 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
31f40 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a  , pgno, pPage, z
31f50 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a  Context);.  }. .
31f60 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
31f70 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65  omplete coverage
31f80 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a   of the page.  *
31f90 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  /.  data = pPage
31fa0 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
31fb0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
31fc0 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74  t;.  hit = sqlit
31fd0 65 4d 61 6c 6c 6f 63 28 20 75 73 61 62 6c 65 53  eMalloc( usableS
31fe0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74  ize );.  if( hit
31ff0 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68   ){.    memset(h
32000 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28  it, 1, get2byte(
32010 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a  &data[hdr+5]));.
32020 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32      nCell = get2
32030 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
32040 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72  ]);.    cellStar
32050 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
32060 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
32070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
32080 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
32090 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
320a0 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72  e(&data[cellStar
320b0 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69  t+i*2]);.      i
320c0 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69  nt size = cellSi
320d0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
320e0 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69  ta[pc]);.      i
320f0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
32100 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61  (pc+size-1)>=usa
32110 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20  bleSize || pc<0 
32120 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
32130 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32140 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
32150 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
32160 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
32170 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
32180 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
32190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
321a0 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20  or(j=pc+size-1; 
321b0 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b  j>=pc; j--) hit[
321c0 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j]++;.      }.  
321d0 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d    }.    for(cnt=
321e0 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64  0, i=get2byte(&d
321f0 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30  ata[hdr+1]); i>0
32200 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65   && i<usableSize
32210 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a   && cnt<10000; .
32220 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
32230 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
32240 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
32250 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ta[i+2]);.      
32260 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
32270 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61   (i+size-1)>=usa
32280 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29  bleSize || i<0 )
32290 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
322a0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
322b0 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20   0,  .          
322c0 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
322d0 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
322e0 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
322f0 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
32300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
32310 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a  or(j=i+size-1; j
32320 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  >=i; j--) hit[j]
32330 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
32340 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
32350 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  data[i]);.    }.
32360 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b      for(i=cnt=0;
32370 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69   i<usableSize; i
32380 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
32390 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  it[i]==0 ){.    
323a0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
323b0 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69   }else if( hit[i
323c0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ]>1 ){.        c
323d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
323e0 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20  heck, 0,.       
323f0 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65     "Multiple use
32400 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66  s for byte %d of
32410 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50   page %d", i, iP
32420 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
32430 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
32440 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
32450 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20  data[hdr+7] ){. 
32460 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
32470 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a  Msg(pCheck, 0, .
32480 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d            "Fragm
32490 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25  ented space is %
324a0 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20  d byte reported 
324b0 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  as %d on page %d
324c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  ",.          cnt
324d0 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69  , data[hdr+7], i
324e0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
324f0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 68 69  .  sqliteFree(hi
32500 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61  t);..  releasePa
32510 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
32520 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23  urn depth+1;.}.#
32530 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32540 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
32550 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
32560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
32570 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
32580 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
32590 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  does a complete 
325a0 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76  check of the giv
325b0 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20  en BTree file.  
325c0 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e  aRoot[] is.** an
325d0 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20   array of pages 
325e0 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63  numbers were eac
325f0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  h page number is
32600 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
32610 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e  f.** a table.  n
32620 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62  Root is the numb
32630 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
32640 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   aRoot..**.** If
32650 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63   everything chec
32660 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75  ks out, this rou
32670 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
32680 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  L.  If something
32690 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e   is.** amiss, an
326a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
326b0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  s written into m
326c0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
326d0 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  rom malloc().** 
326e0 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
326f0 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73   that error mess
32700 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
32710 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
32720 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
32730 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
32740 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  eing the error m
32750 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69  essage when it i
32760 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20  s done..*/.char 
32770 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
32780 65 67 72 69 74 79 43 68 65 63 6b 28 42 74 72 65  egrityCheck(Btre
32790 65 20 2a 70 2c 20 69 6e 74 20 2a 61 52 6f 6f 74  e *p, int *aRoot
327a0 2c 20 69 6e 74 20 6e 52 6f 6f 74 29 7b 0a 20 20  , int nRoot){.  
327b0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65  int i;.  int nRe
327c0 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  f;.  IntegrityCk
327d0 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61   sCheck;.  BtSha
327e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
327f0 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 2a 73 71  t;..  nRef = *sq
32800 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
32810 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
32820 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69   if( lockBtreeWi
32830 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49  thRetry(p)!=SQLI
32840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32850 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75 70  urn sqliteStrDup
32860 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75  ("Unable to acqu
32870 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ire a read lock 
32880 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22  on the database"
32890 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  );.  }.  sCheck.
328a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68  pBt = pBt;.  sCh
328b0 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74  eck.pPager = pBt
328c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65  ->pPager;.  sChe
328d0 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  ck.nPage = sqlit
328e0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
328f0 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
32900 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  ;.  if( sCheck.n
32910 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Page==0 ){.    u
32920 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
32930 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65 74  ed(pBt);.    ret
32940 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
32950 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
32960 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43  teMallocRaw( (sC
32970 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
32980 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
32990 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
329a0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
329b0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
329c0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
329d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
329e0 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65 20  MPrintf("Unable 
329f0 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74  to malloc %d byt
32a00 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73  es", .        (s
32a10 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
32a20 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
32a30 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66  ef[0]));.  }.  f
32a40 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63  or(i=0; i<=sChec
32a50 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73  k.nPage; i++){ s
32a60 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d  Check.anRef[i] =
32a70 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44   0; }.  i = PEND
32a80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
32a90 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68  t);.  if( i<=sCh
32aa0 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20  eck.nPage ){.   
32ab0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32ac0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65   = 1;.  }.  sChe
32ad0 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  ck.zErrMsg = 0;.
32ae0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
32af0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
32b00 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
32b10 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
32b20 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
32b30 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
32b40 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
32b50 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
32b60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
32b70 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
32b80 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
32b90 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
32ba0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
32bb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
32bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
32bd0 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
32be0 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
32bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32c00 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
32c10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
32c20 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
32c30 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
32c40 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
32c50 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
32c60 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
32c70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
32c80 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
32c90 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
32ca0 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
32cb0 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
32cc0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
32cd0 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
32ce0 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
32cf0 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
32d00 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
32d10 61 67 65 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  age; i++){.#ifde
32d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32d30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
32d40 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32d50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
32d60 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
32d70 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
32d80 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
32d90 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
32da0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
32db0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
32dc0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
32dd0 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
32de0 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
32df0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
32e00 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
32e10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32e20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
32e30 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
32e40 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
32e50 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
32e60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
32e70 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
32e80 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
32e90 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
32ea0 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
32eb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
32ec0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
32ed0 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
32ee0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
32ef0 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
32f00 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
32f10 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32f20 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
32f30 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
32f40 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
32f50 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
32f60 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
32f70 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
32f80 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
32f90 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
32fa0 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
32fb0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
32fc0 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
32fd0 20 21 3d 20 2a 73 71 6c 69 74 65 33 70 61 67 65   != *sqlite3page
32fe0 72 5f 73 74 61 74 73 28 70 42 74 2d 3e 70 50 61  r_stats(pBt->pPa
32ff0 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63  ger) ){.    chec
33000 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
33010 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f  ck, 0, .      "O
33020 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
33030 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20  count goes from 
33040 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20  %d to %d during 
33050 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a  this analysis",.
33060 20 20 20 20 20 20 6e 52 65 66 2c 20 2a 73 71 6c        nRef, *sql
33070 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
33080 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20  pBt->pPager).   
33090 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   );.  }..  /* Cl
330a0 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f  ean  up and repo
330b0 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  rt errors..  */.
330c0 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 43 68    sqliteFree(sCh
330d0 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 72 65  eck.anRef);.  re
330e0 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72  turn sCheck.zErr
330f0 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Msg;.}.#endif /*
33100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
33110 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
33120 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33130 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
33140 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
33150 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
33160 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
33170 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
33180 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
33190 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
331a0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
331b0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
331c0 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
331d0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
331e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
331f0 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
33200 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
33210 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
33220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33230 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
33240 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
33250 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  irname(Btree *p)
33260 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
33270 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
33280 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
33290 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 70  3pager_dirname(p
332a0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
332b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
332c0 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
332d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
332e0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
332f0 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  se. The return.*
33300 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
33310 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73  routine is the s
33320 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ame regardless o
33330 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f  f whether the jo
33340 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61  urnal file.** ha
33350 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  s been created o
33360 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  r not..*/.const 
33370 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
33380 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
33390 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
333a0 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
333b0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
333c0 75 72 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  urn sqlite3pager
333d0 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e  _journalname(p->
333e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
333f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33400 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
33410 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c  * Copy the compl
33420 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  ete content of p
33430 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54  BtFrom into pBtT
33440 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  o.  A transactio
33450 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74  n.** must be act
33460 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c  ive for both fil
33470 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  es..**.** The si
33480 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74 46 72  ze of file pBtFr
33490 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75 63 65  om may be reduce
334a0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
334b0 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ion..** If anyth
334c0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
334d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
334e0 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20 72 6f  on pBtFrom is ro
334f0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e  lled back..*/.in
33500 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
33510 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54  pyFile(Btree *pT
33520 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29  o, Btree *pFrom)
33530 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33540 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69  ITE_OK;.  Pgno i
33550 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67 65  , nPage, nToPage
33560 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74 53 68  , iSkip;..  BtSh
33570 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54  ared *pBtTo = pT
33580 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72  o->pBt;.  BtShar
33590 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46  ed *pBtFrom = pF
335a0 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28  rom->pBt;..  if(
335b0 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54   pTo->inTrans!=T
335c0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46  RANS_WRITE || pF
335d0 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  rom->inTrans!=TR
335e0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
335f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
33600 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
33610 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29  pBtTo->pCursor )
33620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
33630 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65 20 3d  USY;.  nToPage =
33640 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
33650 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70  gecount(pBtTo->p
33660 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65 20  Pager);.  nPage 
33670 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  = sqlite3pager_p
33680 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d  agecount(pBtFrom
33690 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b  ->pPager);.  iSk
336a0 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  ip = PENDING_BYT
336b0 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20  E_PAGE(pBtTo);. 
336c0 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
336d0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50  LITE_OK && i<=nP
336e0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  age; i++){.    v
336f0 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
33700 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63  if( i==iSkip ) c
33710 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20  ontinue;.    rc 
33720 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
33730 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  et(pBtFrom->pPag
33740 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
33750 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
33760 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ak;.    rc = sql
33770 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72  ite3pager_overwr
33780 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ite(pBtTo->pPage
33790 72 2c 20 69 2c 20 70 50 61 67 65 29 3b 0a 20 20  r, i, pPage);.  
337a0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
337b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
337c0 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
337d0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 50 61  .  }.  for(i=nPa
337e0 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ge+1; rc==SQLITE
337f0 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67  _OK && i<=nToPag
33800 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69  e; i++){.    voi
33810 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 69 66  d *pPage;.    if
33820 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e  ( i==iSkip ) con
33830 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20  tinue;.    rc = 
33840 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
33850 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
33860 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
33870 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
33880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33890 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
338a0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70  e);.    sqlite3p
338b0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
338c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  );.    sqlite3pa
338d0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 70  ger_dont_write(p
338e0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 29  BtTo->pPager, i)
338f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20  ;.  }.  if( !rc 
33900 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65  && nPage<nToPage
33910 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
33920 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
33930 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  te(pBtTo->pPager
33940 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  , nPage);.  }.  
33950 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
33960 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
33970 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72  ck(pTo);.  }.  r
33980 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 23 65  eturn rc;  .}.#e
33990 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
339a0 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  MIT_VACUUM */../
339b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
339c0 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61  zero if a transa
339d0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
339e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
339f0 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74  treeIsInTrans(Bt
33a00 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
33a10 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72  n (p && (p->inTr
33a20 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
33a30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
33a40 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
33a50 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
33a60 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
33a70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
33a80 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42  3BtreeIsInStmt(B
33a90 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
33aa0 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d  rn (p->pBt && p-
33ab0 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d  >pBt->inStmt);.}
33ac0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ../*.** This cal
33ad0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
33ae0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33af0 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
33b00 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
33b10 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
33b20 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
33b30 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
33b40 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
33b50 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
33b60 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
33b70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
33b80 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
33b90 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
33ba0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
33bb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
33bc0 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
33bd0 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
33be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
33bf0 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
33c00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
33c10 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
33c20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
33c30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
33c40 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
33c50 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
33c60 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
33c70 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
33c80 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
33c90 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
33ca0 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
33cb0 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
33cc0 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
33cd0 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
33ce0 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
33cf0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
33d00 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
33d10 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
33d20 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
33d30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
33d40 72 65 65 53 79 6e 63 28 42 74 72 65 65 20 2a 70  reeSync(Btree *p
33d50 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
33d60 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
33d70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33d80 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
33d90 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
33da0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
33db0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50   = p->pBt;.    P
33dc0 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  gno nTrunc = 0;.
33dd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33de0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33df0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33e00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33e10 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
33e20 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75  ommit(pBt, &nTru
33e30 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  nc); .      if( 
33e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33e50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33e60 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
33e70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
33e80 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
33e90 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ync(pBt->pPager,
33ea0 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
33eb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33ec0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
33ed0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
33ee0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
33ef0 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  a blob of memory
33f00 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33f10 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61  .** a single sha
33f20 72 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d  red-btree. The m
33f30 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79  emory is used by
33f40 20 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72   client code for
33f50 20 69 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72   it's own.** pur
33f60 70 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70  poses (for examp
33f70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68  le, to store a h
33f80 69 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61  igh-level schema
33f90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33fa0 20 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d   .** the shared-
33fb0 62 74 72 65 65 29 2e 20 54 68 65 20 62 74 72 65  btree). The btre
33fc0 65 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20  e layer manages 
33fd0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69  reference counti
33fe0 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a  ng issues..**.**
33ff0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
34000 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f  this is called o
34010 6e 20 61 20 73 68 61 72 65 64 2d 62 74 72 65 65  n a shared-btree
34020 2c 20 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f  , nBytes bytes o
34030 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20  f memory.** are 
34040 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65  allocated, zeroe
34050 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20  d, and returned 
34060 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46  to the caller. F
34070 6f 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65  or each subseque
34080 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20  nt .** call the 
34090 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65 72  nBytes parameter
340a0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   is ignored and 
340b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
340c0 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66   same blob.** of
340d0 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64   memory returned
340e0 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65  . .**.** Just be
340f0 66 6f 72 65 20 74 68 65 20 73 68 61 72 65 64 2d  fore the shared-
34100 62 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c  btree is closed,
34110 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61   the function pa
34120 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20  ssed as the .** 
34130 78 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77  xFree argument w
34140 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  hen the memory a
34150 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61  llocation was ma
34160 64 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  de is invoked on
34170 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66   the .** blob of
34180 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
34190 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
341a0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c   should not call
341b0 20 73 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a   sqliteFree().**
341c0 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   on the memory, 
341d0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
341e0 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f  does that..*/.vo
341f0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
34200 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c  Schema(Btree *p,
34210 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69   int nBytes, voi
34220 64 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a  d(*xFree)(void *
34230 29 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  )){.  BtShared *
34240 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
34250 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d  if( !pBt->pSchem
34260 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53  a ){.    pBt->pS
34270 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61  chema = sqliteMa
34280 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20  lloc(nBytes);.  
34290 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
342a0 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a  ma = xFree;.  }.
342b0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
342c0 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
342d0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
342e0 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
342f0 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
34300 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
34310 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
34320 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
34330 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
34340 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
34350 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
34360 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
34370 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
34380 72 65 74 75 72 6e 20 28 71 75 65 72 79 54 61 62  return (queryTab
34390 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
343a0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
343b0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d  )!=SQLITE_OK);.}
343c0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
343d0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
343e0 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  CHE./*.** Obtain
343f0 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
34400 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  able whose root 
34410 70 61 67 65 20 69 73 20 69 54 61 62 2e 20 20 54  page is iTab.  T
34420 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20  he.** lock is a 
34430 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73  write lock if is
34440 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75  Writelock is tru
34450 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b  e or a read lock
34460 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c  .** if it is fal
34470 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
34480 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65  e3BtreeLockTable
34490 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
344a0 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c  Tab, u8 isWriteL
344b0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
344c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
344d0 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57   lockType = (isW
344e0 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c  riteLock?WRITE_L
344f0 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OCK:READ_LOCK);.
34500 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c    rc = queryTabl
34510 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c  eLock(p, iTab, l
34520 6f 63 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20  ockType);.  if( 
34530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34540 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61  .    rc = lockTa
34550 62 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ble(p, iTab, loc
34560 6b 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65  kType);.  }.  re
34570 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
34580 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
34590 6c 6f 77 69 6e 67 20 64 65 62 75 67 67 69 6e 67  lowing debugging
345a0 20 69 6e 74 65 72 66 61 63 65 20 68 61 73 20 74   interface has t
345b0 6f 20 62 65 20 69 6e 20 74 68 69 73 20 66 69 6c  o be in this fil
345c0 65 20 28 72 61 74 68 65 72 0a 2a 2a 20 74 68 61  e (rather.** tha
345d0 6e 20 69 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  n in, for exampl
345e0 65 2c 20 74 65 73 74 31 2e 63 29 20 73 6f 20 74  e, test1.c) so t
345f0 68 61 74 20 69 74 20 63 61 6e 20 67 65 74 20 61  hat it can get a
34600 63 63 65 73 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ccess to.** the 
34610 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 42 74  definition of Bt
34620 53 68 61 72 65 64 2e 0a 2a 2f 0a 23 69 66 20 64  Shared..*/.#if d
34630 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
34640 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
34650 54 43 4c 53 48 29 0a 23 69 6e 63 6c 75 64 65 20  TCLSH).#include 
34660 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c 69  <tcl.h>.int sqli
34670 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
34680 5f 72 65 70 6f 72 74 28 0a 20 20 76 6f 69 64 20  _report(.  void 
34690 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
346a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
346b0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
346c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
346d0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
346e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
346f0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 63 6f  HARED_CACHE.  co
34700 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a  nst ThreadData *
34710 70 54 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  pTd = sqlite3Thr
34720 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
34730 29 3b 0a 20 20 69 66 28 20 70 54 64 2d 3e 75 73  );.  if( pTd->us
34740 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20  eSharedData ){. 
34750 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
34760 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
34770 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
34780 28 29 3b 0a 20 20 20 20 66 6f 72 28 70 42 74 3d  ();.    for(pBt=
34790 70 54 64 2d 3e 70 42 74 72 65 65 3b 20 70 42 74  pTd->pBtree; pBt
347a0 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
347b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
347c0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  har *zFile = sql
347d0 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
347e0 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  me(pBt->pPager);
347f0 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
34800 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
34810 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
34820 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
34830 46 69 6c 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  File, -1));.    
34840 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
34850 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
34860 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
34870 49 6e 74 4f 62 6a 28 70 42 74 2d 3e 6e 52 65 66  IntObj(pBt->nRef
34880 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ));.    }.    Tc
34890 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
348a0 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
348b0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
348c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
348d0 69 66 0a                                         if.