/ Hex Artifact Content
Login

Artifact 6aa61c0e3d20d1d1acc8fb33d8f0ebd675305d3c:


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 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1850: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1870: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1880: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1890: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
18a0: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
18b0: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
18c0: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
18d0: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
18e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
18f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1900: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1910: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1920: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1930: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1940: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1950: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1960: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1970: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1990: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
19a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
19b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
19c0: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
19d0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
19e0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
19f0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1a00: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1a10: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1a20: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1a30: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1a40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1a60: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1a70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1a80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ac0: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1ad0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ae0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1af0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b00: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1b10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b20: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1b30: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1b40: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1b60: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1b70: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1b80: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1b90: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1ba0: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1bb0: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1bc0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1bd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1be0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1bf0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1c00: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1c10: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1c20: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1c30: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1c40: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1c50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1c60: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1c70: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1c80: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1c90: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1cb0: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1cc0: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1cd0: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ce0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1cf0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d00: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1d10: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1d20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d30: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1d40: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1d50: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1d60: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1d70: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d80: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1d90: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1da0: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1db0: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1dc0: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1dd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1de0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1df0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e10: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e20: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1e30: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
1e40: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
1e50: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
1e60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
1e70: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
1e80: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1eb0: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
1ec0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
1ee0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
1ef0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
1f00: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f10: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
1f20: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
1f30: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
1f40: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1f50: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
1f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1f70: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
1f80: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
1f90: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
1fa0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
1fb0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
1fc0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
1fd0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
1fe0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ff0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2000: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
2010: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2020: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2030: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2050: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2060: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2070: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2080: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2090: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20a0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
20b0: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
20c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
20d0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
20e0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
20f0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
2100: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
2110: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
2120: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
2130: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2140: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2150: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2160: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2170: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2180: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2190: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
21a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
21d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
21e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
21f0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
2200: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
2210: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
2220: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2230: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2240: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2250: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2260: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2280: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2290: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
22a0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
22b0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
22c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
22e0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
22f0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
2300: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2310: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
2320: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
2330: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2350: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2360: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2370: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2380: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2390: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
23a0: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
23b0: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
23d0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
23e0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
23f0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2400: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2410: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
2420: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
2430: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2440: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2450: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2460: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2470: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2480: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2490: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
24a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
24b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
24c0: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
24d0: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
24e0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
24f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
2500: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
2510: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
2520: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
2530: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2540: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2550: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2560: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2570: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2580: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2590: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
25a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
25b0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
25c0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
25d0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
25e0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
25f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
2600: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
2610: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
2620: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
2630: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2640: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2650: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2670: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2680: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2690: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
26a0: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
26b0: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
26c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
26d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
26e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
26f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
2700: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
2710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2720: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2730: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2760: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2770: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2790: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
27a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
27b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
27c0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
27d0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
27e0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
27f0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2800: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
2810: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2820: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2830: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2850: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2860: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2870: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2880: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2890: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
28a0: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
28b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
28c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
28d0: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
28e0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
28f0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2900: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2910: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2920: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2930: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2950: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2960: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2970: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2980: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2990: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
29a0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
29b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29c0: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
29d0: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
29e0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
29f0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2a00: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2a10: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2a30: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2a40: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2a50: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2a60: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2a70: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a80: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2a90: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2aa0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2ab0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2ac0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2ad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ae0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2af0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b10: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2b30: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2b40: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2b50: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2b60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2b70: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2b80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2b90: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2ba0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2bb0: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2bc0: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2bd0: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2be0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bf0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2c00: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2c10: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2c20: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2c30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2c40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2c50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2c60: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2c70: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ca0: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2cb0: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2cc0: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2cd0: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ce0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2cf0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2d00: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2d10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2d20: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2d30: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2d40: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2d50: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2d60: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2d70: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2d80: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2da0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2db0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2dc0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2dd0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2de0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2df0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2e00: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2e10: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2e20: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
2e50: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
2e60: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
2e70: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
2e80: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
2e90: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
2ea0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
2eb0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
2ec0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
2ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
2ee0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
2ef0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
2f00: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
2f10: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
2f20: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f50: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
2f60: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2f70: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
2f80: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
2f90: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
2fa0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
2fb0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
2fc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
2fd0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
2fe0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
2ff0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
3000: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
3010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3020: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
3030: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3040: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3050: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3060: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3070: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3080: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3090: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
30a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
30b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
30c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
30d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
30e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
30f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3110: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3120: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3130: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3150: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3160: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3170: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3180: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3190: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
31a0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
31b0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
31c0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
31d0: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
31e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
3200: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
3210: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
3220: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
3230: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3240: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3250: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3260: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3270: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3280: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3290: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
32a0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
32b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
32d0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
32e0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
32f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
3300: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
3310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3320: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
3330: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3340: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3350: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3360: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3370: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3380: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3390: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
33a0: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
33b0: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
33c0: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
33d0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
33e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
33f0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
3400: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
3410: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
3420: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
3430: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3440: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3460: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3470: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3480: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3490: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34b0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
34c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d0: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
34e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
34f0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
3500: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3510: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
3520: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
3530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3540: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3550: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3560: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3570: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3580: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3590: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
35a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
35b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
35c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35d0: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
35e0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
35f0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
3600: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
3610: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
3620: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
3630: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3640: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3660: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3680: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3690: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
36a0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
36b0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
36c0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
36d0: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
36e0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
36f0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
3700: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
3710: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
3720: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
3730: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3740: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3750: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3760: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3770: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3780: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3790: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
37a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
37c0: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
37d0: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
37e0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
37f0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
3800: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
3810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3820: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3850: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3860: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3870: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3880: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3890: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
38a0: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
38b0: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
38c0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
38d0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
38e0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
38f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3900: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3910: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3920: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3930: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3940: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3950: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3970: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3980: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3990: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
39a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
39b0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
39c0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
39d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39e0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
39f0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3a00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3a10: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3a20: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3a30: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3a40: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3a50: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3a60: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3a70: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3a90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3ab0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3ac0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3ad0: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ae0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3af0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3b00: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3b10: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3b20: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3b30: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3b40: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3b50: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3b60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3b70: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3b80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3b90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3ba0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3bb0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3bc0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3bd0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3be0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3bf0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3c00: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3c10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3c20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3c60: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3c70: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3c80: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3c90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3cb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3cc0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3cd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ce0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3cf0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3d00: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3d10: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3d20: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3d30: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3d40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3d50: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3d60: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3d80: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3d90: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3da0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3db0: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3dc0: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3dd0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3de0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3df0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3e00: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3e10: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3e20: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3e30: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3e40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3e50: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3e60: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e70: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3e80: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3e90: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3ea0: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3eb0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3ec0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
3ed0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
3ee0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
3ef0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
3f00: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
3f10: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3f20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3f30: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3f40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3f50: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3f60: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3f70: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f90: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
3fa0: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
3fb0: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
3fc0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
3fd0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
3fe0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
3ff0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
4000: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
4010: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
4020: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
4030: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4040: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4050: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4060: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4070: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4080: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4090: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 26  F_Incrblob)!=0 &
40a0: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
40b0: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
40c0: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
40d0: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
40e0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
40f0: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
4100: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
4110: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
4120: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
4130: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
4140: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
4150: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  s(x,y,z).#endif 
4160: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
4170: 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
4180: 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f  * Set bit pgno o
4190: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  f the BtShared.p
41a0: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
41b0: 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  c. This is calle
41c0: 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67  d .** when a pag
41d0: 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c  e that previousl
41e0: 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61  y contained data
41f0: 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
4200: 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61  list leaf .** pa
4210: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74  ge..**.** The Bt
4220: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4230: 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73  nt bitvec exists
4240: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
4250: 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75  an obscure.** bu
4260: 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20  g caused by the 
4270: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74  interaction of t
4280: 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74  wo useful IO opt
4290: 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f  imizations surro
42a0: 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c  unding.** free-l
42b0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a  ist leaf pages:.
42c0: 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
42d0: 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  all data is dele
42e0: 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20  ted from a page 
42f0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63  and the page bec
4300: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66  omes.**      a f
4310: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4320: 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20  ge, the page is 
4330: 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
4340: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
4350: 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73      (as free-lis
4360: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e  t leaf pages con
4370: 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66  tain no meaningf
4380: 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69  ul data). Someti
4390: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68  mes.**      such
43a0: 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65   a page is not e
43b0: 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28  ven journalled (
43c0: 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
43d0: 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20  e modified,.**  
43e0: 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a      why bother j
43f0: 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e  ournalling it?).
4400: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
4410: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4420: 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64  f page is reused
4430: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73  , its content is
4440: 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20   not read.**    
4450: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62    from the datab
4460: 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74  ase or written t
4470: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
4480: 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69  le (why should i
4490: 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66  t.**      be, if
44a0: 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c   it is not at al
44b0: 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a  l meaningful?)..
44c0: 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c  **.** By themsel
44d0: 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d  ves, these optim
44e0: 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69  izations work fi
44f0: 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61  ne and provide a
4500: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
4510: 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62  mance boost to b
4520: 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e  ulk delete or in
4530: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  sert operations.
4540: 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20   However, if.** 
4550: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
4560: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4570: 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64   and then reused
4580: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
4590: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  .** transaction,
45a0: 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73   a problem comes
45b0: 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65   up. If the page
45c0: 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c   is not journall
45d0: 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73  ed when.** it is
45e0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
45f0: 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69  ee-list and it i
4600: 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e  s also not journ
4610: 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a  alled when it.**
4620: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4630: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4640: 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65   and reused, the
4650: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  n the original d
4660: 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f  ata.** may be lo
4670: 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74  st. In the event
4680: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20   of a rollback, 
4690: 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  it may not be po
46a0: 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73  ssible.** to res
46b0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
46c0: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
46d0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l configuration.
46e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74  .**.** The solut
46f0: 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61  ion is the BtSha
4700: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4710: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
4720: 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d   a page is .** m
4730: 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  oved to become a
4740: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4750: 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73  page, the corres
4760: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a  ponding bit is.*
4770: 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74  * set in the bit
4780: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4790: 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74  leaf page is ext
47a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
47b0: 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70  free-list,.** op
47c0: 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f  timization 2 abo
47d0: 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  ve is omitted if
47e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
47f0: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
4800: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
4810: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4820: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
4830: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
4840: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
4850: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
4860: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
4870: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4880: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
4890: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
48a0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
48b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
48c0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
48d0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  ontent ){.    as
48e0: 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d  sert( pgno<=pBt-
48f0: 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42  >nPage );.    pB
4900: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
4910: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
4920: 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29  eate(pBt->nPage)
4930: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
4940: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4950: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4960: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
4970: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
4980: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
4990: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
49a0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
49b0: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
49c0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
49d0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49e0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
49f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4a00: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
4a10: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4a20: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
4a30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4a40: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
4a50: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4a60: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
4a70: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
4a80: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
4a90: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
4aa0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
4ab0: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
4ac0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
4ad0: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
4ae0: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
4af0: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
4b00: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4b10: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
4b20: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4b30: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4b40: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
4b50: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
4b60: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
4b70: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
4b80: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
4b90: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
4ba0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
4bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
4bc0: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
4bd0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4be0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4bf0: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
4c00: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
4c10: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
4c20: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
4c30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4c40: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
4c50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4c60: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
4c70: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
4c80: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
4c90: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
4ca0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
4cb0: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  * Release all of
4cc0: 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61   the apPage[] pa
4cd0: 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ges for a cursor
4ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4cf0: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
4d00: 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75  CursorPages(BtCu
4d10: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
4d20: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
4d30: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
4d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
4d50: 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
4d60: 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75  age[i]);.    pCu
4d70: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  r->apPage[i] = 0
4d80: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50  ;.  }.  pCur->iP
4d90: 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  age = -1;.}.../*
4da0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
4db0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
4dc0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
4dd0: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
4de0: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
4df0: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
4e00: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
4e10: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
4e20: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
4e30: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
4e40: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
4e50: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
4e60: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
4e70: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
4e80: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
4e90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
4ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4eb0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
4ec0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
4ed0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
4ee0: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
4ef0: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
4f00: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
4f10: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
4f20: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
4f30: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
4f40: 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
4f50: 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
4f60: 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b  (pCur, &pCur->nK
4f70: 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
4f80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
4f90: 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61   /* KeySize() ca
4fa0: 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20  nnot fail */..  
4fb0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
4fc0: 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74   intKey table, t
4fd0: 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61  hen the above ca
4fe0: 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69  ll to BtreeKeySi
4ff0: 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  ze().  ** stores
5000: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
5010: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20   in pCur->nKey. 
5020: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
5030: 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20  s value is.  ** 
5040: 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
5050: 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ired. Otherwise,
5060: 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20   if pCur is not 
5070: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65  open on an intKe
5080: 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68  y.  ** table, th
5090: 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20  en malloc space 
50a0: 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  for and store th
50b0: 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  e pCur->nKey byt
50c0: 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20  es of key .  ** 
50d0: 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  data..  */.  if(
50e0: 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65   0==pCur->apPage
50f0: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
5100: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
5110: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70  sqlite3Malloc( p
5120: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
5130: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
5140: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5150: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
5160: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
5170: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
5180: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5190: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
51a0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
51b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
51c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
51d0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
51e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
51f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
5200: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
5210: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
5220: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5230: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5240: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
5250: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62  LITE_OK ){.    b
5260: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
5270: 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b  rsorPages(pCur);
5280: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
5290: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
52a0: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69  RESEEK;.  }..  i
52b0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
52c0: 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
52d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
52e0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
52f0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
5300: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5310: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5320: 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e  st(BtCursor*,Pgn
5330: 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f  o,BtCursor*);../
5340: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
5350: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
5360: 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70  ursors (except p
5370: 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65  Except) that are
5380: 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
5390: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
53a0: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61  page iRoot.  "Sa
53b0: 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ving the cursor 
53c0: 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20  position" means 
53d0: 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61  that.** the loca
53e0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65  tion in the btre
53f0: 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20  e is remembered 
5400: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
5410: 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20  at it can be.** 
5420: 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68  moved back to th
5430: 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65  e same spot afte
5440: 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20  r the btree has 
5450: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
5460: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
5470: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
5480: 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78  efore cursor pEx
5490: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
54a0: 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61  modify the.** ta
54b0: 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ble, for example
54c0: 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28   in BtreeDelete(
54d0: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
54e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ()..**.** Implem
54f0: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5510: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5520: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5530: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5540: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5550: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5560: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5570: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5580: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5590: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
55a0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
55b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
55c0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
55d0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
55e0: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
55f0: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5600: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5610: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5620: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5630: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5640: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5650: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5660: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5670: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5680: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5690: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
56a0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
56b0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
56c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
56d0: 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72  turn p ? saveCur
56e0: 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52  sorsOnList(p, iR
56f0: 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20  oot, pExcept) : 
5700: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5710: 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75   This helper rou
5720: 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43  tine to saveAllC
5730: 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20  ursors does the 
5740: 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73  actual work of s
5750: 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72  aving.** the cur
5760: 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e  sors if and when
5770: 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75   a cursor is fou
5780: 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79  nd that actually
5790: 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67   requires saving
57a0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20  ..** The common 
57b0: 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20  case is that no 
57c0: 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20  cursors need to 
57d0: 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69  be saved, so thi
57e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
57f0: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20  broken out from 
5800: 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76  its caller to av
5810: 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
5820: 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f  stack pointer mo
5830: 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  vement..*/.stati
5840: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
5850: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
5860: 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72  sOnList(.  BtCur
5870: 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  sor *p,         
5880: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63    /* The first c
5890: 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73  ursor that needs
58a0: 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e   saving */.  Pgn
58b0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
58c0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
58d0: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
58e0: 73 20 69 52 6f 6f 74 2e 20 20 53 61 76 65 20 61  s iRoot.  Save a
58f0: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
5900: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
5910: 74 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  t      /* Do not
5920: 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73 6f   save this curso
5930: 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20  r */.){.  do{.  
5940: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
5950: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
5960: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
5970: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
5980: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
5990: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
59a0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
59b0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
59c0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
59d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
59e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
59f0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
5a00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5a10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5a20: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
5a30: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
5a40: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
5a50: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
5a60: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
5a70: 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  ext;.  }while( p
5a80: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
5a90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5aa0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
5ab0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
5ac0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5ad0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
5ae0: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
5af0: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
5b00: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5b10: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
5b20: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5b30: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
5b40: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
5b50: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5b60: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
5b70: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
5b80: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
5b90: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
5ba0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
5bb0: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
5bc0: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
5bd0: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
5be0: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
5bf0: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
5c00: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
5c10: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
5c20: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
5c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5c40: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
5c50: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
5c60: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
5c70: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
5c80: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
5c90: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
5ca0: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
5cb0: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
5cc0: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
5cd0: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
5ce0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
5cf0: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
5d00: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
5d10: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
5d20: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
5d30: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
5d40: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
5d50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
5d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
5d70: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
5d80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5d90: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
5da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
5db0: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
5dc0: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
5dd0: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
5de0: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
5df0: 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32  .  char aSpace[2
5e00: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  00];          /*
5e10: 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20   Temp space for 
5e20: 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f  pIdxKey - to avo
5e30: 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20  id a malloc */. 
5e40: 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30   char *pFree = 0
5e50: 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  ;..  if( pKey ){
5e60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
5e70: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
5e80: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
5e90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
5ea0: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
5eb0: 64 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  d(.        pCur-
5ec0: 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63  >pKeyInfo, aSpac
5ed0: 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
5ee0: 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b  ), &pFree.    );
5ef0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
5f00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
5f10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73  ITE_NOMEM;.    s
5f20: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
5f30: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
5f40: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
5f50: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
5f60: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
5f70: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
5f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5f90: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
5fa0: 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a  fo->db, pFree);.
5fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5fc0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
5fd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
5fe0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5ff0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
6000: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
6010: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
6020: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
6030: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
6040: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
6050: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
6060: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
6070: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
6080: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6090: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
60a0: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
60b0: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
60c0: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
60d0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
60e0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
60f0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
6100: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
6110: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
6120: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
6130: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
6140: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
6150: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
6160: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
6170: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
6180: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
6190: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
61a0: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
61b0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
61c0: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
61d0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
61e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6200: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
6210: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
6220: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
6230: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6240: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6250: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
6260: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
6270: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
6280: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
6290: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
62a0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
62b0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
62c0: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
62d0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
62e0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
62f0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
6300: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
6310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6320: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6330: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6340: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6350: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6360: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6370: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6380: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6390: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  NVALID );.    if
63a0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
63b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
63c0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
63d0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
63e0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
63f0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
6400: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6410: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
6420: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6430: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6440: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6450: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6460: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6470: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6480: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6490: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
64a0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
64b0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
64c0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
64d0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
64e0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
64f0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
6500: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
6510: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
6520: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
6530: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6540: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6550: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6560: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6570: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6580: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6590: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
65a0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
65b0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
65c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
65d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
65e0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
65f0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
6600: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
6610: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
6620: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6630: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6640: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6650: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6660: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6670: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6680: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6690: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
66a0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
66b0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
66c0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
66d0: 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
66e0: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
66f0: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALID;.}../*.** T
6700: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
6710: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
6720: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
6730: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
6740: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
6750: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
6760: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
6770: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
6780: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
6790: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
67a0: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
67b0: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
67c0: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
67d0: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
67e0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
67f0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
6800: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
6810: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
6820: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
6830: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
6840: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
6850: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
6860: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
6870: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
6880: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
6890: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
68a0: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
68b0: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
68c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
68d0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
68e0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
68f0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
6900: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
6910: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6920: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
6930: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
6940: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
6950: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
6960: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
6970: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
6980: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
6990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
69a0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
69b0: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
69c0: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
69d0: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
69e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
69f0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
6a00: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
6a10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
6a20: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
6a30: 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45 52 28  _VALID || NEVER(
6a40: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
6a50: 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  0) ){.    *pDiff
6a60: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
6a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44 69 66  }else{.    *pDif
6a80: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
6a90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6aa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
6ab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6ac0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
6ad0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
6ae0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
6af0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
6b00: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
6b10: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
6b20: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
6b30: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
6b40: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
6b50: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
6b60: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
6b70: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
6b80: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
6b90: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
6ba0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
6bb0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
6bc0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
6bd0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
6be0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
6bf0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
6c00: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
6c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
6c20: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
6c30: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6c40: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
6c50: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6c60: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
6c70: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
6c80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6c90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6ca0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
6cb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
6cc0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
6cd0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
6ce0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
6cf0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
6d00: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
6d10: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
6d20: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
6d30: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
6d40: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
6d50: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
6d60: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
6d70: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
6d80: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
6d90: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
6da0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6db0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
6dc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6dd0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
6de0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
6df0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
6e00: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
6e10: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
6e20: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
6e30: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
6e40: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
6e50: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6e60: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6e70: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6e80: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6e90: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
6ea0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
6eb0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
6ec0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
6ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
6ee0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
6ef0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6f00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
6f10: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
6f20: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
6f30: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
6f40: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6f50: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6f60: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6f70: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6f80: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6f90: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6fa0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
6fb0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
6fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
6fd0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
6fe0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6ff0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
7000: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
7010: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
7020: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
7030: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
7040: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7050: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7060: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
7070: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7080: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7090: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
70a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
70b0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
70c0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
70d0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
70e0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
70f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7100: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7110: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7120: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7130: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7140: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7150: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7160: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7170: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7180: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7190: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
71a0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
71b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
71c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
71d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
71e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
71f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7200: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7210: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7220: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7230: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7240: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
7250: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
7260: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
7270: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
7280: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
7290: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
72a0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
72b0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
72c0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
72d0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
72e0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
72f0: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
7300: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
7310: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
7320: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
7330: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
7340: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
7350: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
7360: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
7370: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7380: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
7390: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
73a0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
73b0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
73c0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
73d0: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
73e0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
73f0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7400: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
7410: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
7420: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7440: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
7450: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
7460: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
7470: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
7480: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
7490: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
74a0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
74b0: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
74c0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
74d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
74e0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
74f0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
7500: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
7510: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
7520: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
7530: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
7540: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
7550: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
7560: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
7570: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7580: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7590: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
75a0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
75b0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
75c0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
75d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
75e0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
75f0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
7600: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
7610: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
7620: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
7630: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7640: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7650: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
7660: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
7670: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
7680: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
7690: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
76a0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
76b0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
76c0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
76d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
76e0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
76f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
7700: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
7710: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
7720: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
7730: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
7740: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
7750: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
7760: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
7770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7780: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
7790: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
77a0: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
77b0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
77c0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
77d0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
77e0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
77f0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
7800: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
7810: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7820: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
7830: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7840: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
7850: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
7860: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
7870: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7880: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7890: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
78a0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
78b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
78c0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
78d0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
78e0: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
78f0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
7900: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
7910: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
7920: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
7930: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7940: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
7950: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
7960: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
7970: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
7980: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
7990: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
79a0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
79b0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
79c0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
79d0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
79e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
79f0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
7a00: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
7a10: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7a20: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
7a30: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
7a40: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
7a50: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
7a60: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
7a70: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
7a80: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
7a90: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
7aa0: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
7ab0: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
7ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
7ad0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
7ae0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
7af0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
7b00: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
7b10: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
7b20: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
7b30: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
7b40: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
7b50: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7b60: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
7b70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7b80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7b90: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7ba0: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
7bb0: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
7bc0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
7bd0: 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67   k;.    k = pPag
7be0: 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20  e->aiOvfl[i];.  
7bf0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
7c00: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
7c10: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
7c20: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70  return pPage->ap
7c30: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  Ovfl[i];.      }
7c40: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
7c50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7c60: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
7c70: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
7c80: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
7c90: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
7ca0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
7cb0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
7cc0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
7cd0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
7ce0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
7cf0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7d00: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
7d10: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
7d20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
7d30: 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65  and btreeParseCe
7d40: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
7d50: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7d60: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
7d70: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
7d80: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7d90: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
7da0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
7db0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
7dc0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
7dd0: 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  of.** btreeParse
7de0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
7df0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
7e00: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
7e10: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
7e20: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7e30: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7e40: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7e50: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7e60: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7e70: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e90: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7ea0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7eb0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7ec0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7ed0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7ee0: 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20  /.){.  u16 n;   
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f00: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
7f10: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
7f20: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7f30: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
7f40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7f50: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
7f60: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
7f70: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7f80: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7f90: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
7fa0: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
7fb0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
7fc0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
7fd0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
7fe0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
7ff0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
8000: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
8010: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
8020: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
8030: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
8040: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
8050: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
8060: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
8070: 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
8080: 6c 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  l, nPayload);.  
8090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
80a0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
80b0: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
80c0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
80d0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
80e0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
80f0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
8100: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
8110: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
8120: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
8130: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
8140: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
8150: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
8160: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
8170: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
8180: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
8190: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
81a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
81b0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
81c0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
81d0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
81e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
81f0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
8200: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
8210: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
8220: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
8230: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
8240: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
8250: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
8260: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
8270: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
8280: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
8290: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
82a0: 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e     if( (pInfo->n
82b0: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e  Size = (u16)(n+n
82c0: 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49  Payload))<4 ) pI
82d0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
82e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
82f0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
8300: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
8310: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
8320: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
8330: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
8340: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
8350: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
8360: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
8370: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
8380: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
8390: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
83a0: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
83b0: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
83c0: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
83d0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
83e0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
83f0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
8400: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
8410: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
8420: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
8430: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
8440: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
8450: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
8460: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
8470: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
8480: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
8490: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
84a0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
84b0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
84c0: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
84d0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
84e0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
84f0: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
8500: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
8510: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
8520: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
8530: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
8540: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
8550: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
8560: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
8570: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
8580: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
8590: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
85a0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
85b0: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
85c0: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
85d0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
85e0: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
85f0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
8600: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
8610: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
8620: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
8630: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
8640: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8650: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8660: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
8670: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
8680: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8690: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
86a0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
86b0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
86c0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
86d0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
86f0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
8700: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
8710: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
8720: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
8730: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
8740: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
8750: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
8760: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
8770: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
8780: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
8790: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
87a0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
87b0: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
87c0: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
87d0: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
87e0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
87f0: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
8800: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8810: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8820: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8830: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8850: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
8860: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
8870: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8880: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8890: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
88a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
88b0: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
88c0: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
88d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
88e0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
88f0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8900: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8910: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8920: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8930: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8940: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8950: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8960: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8970: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8980: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8990: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
89a0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
89b0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
89c0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
89d0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
89e0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
89f0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8a00: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
8a10: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
8a20: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
8a30: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
8a40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
8a50: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
8a60: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
8a70: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
8a80: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
8a90: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
8aa0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
8ab0: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
8ac0: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
8ad0: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
8ae0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
8af0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
8b00: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
8b10: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
8b20: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
8b30: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
8b40: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
8b50: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
8b60: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
8b70: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8b80: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8b90: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
8ba0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
8bb0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
8bc0: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
8bd0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
8be0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
8bf0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8c00: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8c20: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
8c30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
8c40: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
8c50: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
8c60: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8c70: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8c80: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8c90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
8ca0: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
8cb0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
8cc0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
8cd0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
8ce0: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
8cf0: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
8d00: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
8d10: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
8d20: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
8d30: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
8d40: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8d50: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8d60: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
8d70: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8d80: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8d90: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
8da0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
8db0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
8dc0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
8dd0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
8de0: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
8df0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8e00: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
8e10: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
8e20: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
8e30: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8e40: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
8e50: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
8e60: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8e70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8e80: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8e90: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
8ea0: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
8eb0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
8ec0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8ed0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
8ee0: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
8ef0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8f00: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8f10: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8f20: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
8f30: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
8f40: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8f50: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
8f60: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
8f70: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
8f80: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8f90: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
8fa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8fb0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
8fc0: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
8fd0: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
8fe0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
8ff0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
9000: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
9010: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
9020: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9030: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
9040: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
9050: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
9060: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
9070: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9080: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9090: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
90a0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
90b0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
90c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
90d0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
90e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
90f0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
9100: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
9110: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
9120: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
9130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
9140: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
9150: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
9160: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
9170: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
9180: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
9190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
91a0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
91b0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
91c0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
91d0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
91e0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
91f0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
9200: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
9210: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
9220: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
9230: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
9240: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
9250: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
9260: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
9270: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
9280: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
9290: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
92a0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
92b0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
92c0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
92d0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
92e0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
92f0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
9300: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
9310: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
9320: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
9330: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
9340: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
9350: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
9360: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
9370: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
9380: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
9390: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
93a0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
93b0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
93c0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
93d0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
93e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
93f0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
9400: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
9410: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
9420: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
9430: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
9460: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
9470: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
94a0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
94b0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
94c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
94d0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
94e0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
94f0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
9500: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
9510: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
9520: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
9530: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
9540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
9550: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
9560: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9570: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9590: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
95a0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
95b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
95c0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
95d0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
95e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
95f0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
9600: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
9610: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
9620: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
9630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9640: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
9650: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
9660: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
9670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
9680: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
9690: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
96a0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
96b0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
96c0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
96d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
96e0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
96f0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
9700: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
9710: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
9720: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
9730: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9740: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9750: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9760: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9770: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
9780: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
9790: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
97a0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
97b0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
97c0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
97d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
97e0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
97f0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
9800: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
9810: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
9820: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
9830: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
9840: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9850: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9860: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
9870: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
9880: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
9890: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
98a0: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
98b0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
98c0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
98d0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
98e0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
98f0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
9900: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
9910: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
9920: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
9930: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
9940: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
9950: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
9960: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
9970: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9980: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
9990: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
99a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
99b0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
99c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
99d0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
99e0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
99f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
9a00: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
9a10: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
9a20: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
9a30: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
9a40: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
9a50: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
9a60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9a70: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9a80: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
9a90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
9aa0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
9ab0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
9ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9ad0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ae0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
9b00: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
9b10: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
9b20: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
9b30: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
9b40: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
9b50: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
9b60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9b70: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
9b80: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
9b90: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
9ba0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9bb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9bc0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
9bd0: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
9be0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
9bf0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
9c00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9c10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9c20: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9c30: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9c40: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9c50: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9c60: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9c70: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9c80: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9c90: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9ca0: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
9cb0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
9cc0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
9cd0: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
9ce0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
9cf0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
9d00: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
9d10: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
9d20: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9d30: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
9d40: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
9d50: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
9d60: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
9d70: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
9d80: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
9d90: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
9da0: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
9db0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9dc0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9dd0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
9de0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
9df0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
9e00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9e10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9e20: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
9e30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9e40: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
9e50: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
9e60: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
9e70: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
9e80: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
9e90: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9ea0: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
9eb0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
9ec0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
9ed0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
9ee0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
9ef0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
9f00: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
9f10: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
9f20: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
9f30: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9f40: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9f50: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9f60: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9f70: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9f80: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9f90: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9fa0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
9fb0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
9fc0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
9fd0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
9fe0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
9ff0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
a000: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
a010: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
a020: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
a030: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
a040: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
a050: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
a060: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
a070: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
a080: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
a090: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
a0a0: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
a0b0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
a0c0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
a0d0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
a0e0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
a0f0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
a100: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
a110: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
a120: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
a130: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
a140: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
a150: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
a160: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
a170: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
a180: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
a190: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
a1a0: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
a1d0: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
a1e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
a1f0: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
a200: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
a210: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
a220: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
a230: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
a240: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a250: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74    /* Integer ret
a260: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
a270: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  t usableSize; /*
a280: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
a290: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20  the page */.  . 
a2a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a2b0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a2c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a2e0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
a2f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a300: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a310: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a320: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
a330: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
a340: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
a350: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
a360: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
a370: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a380: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
a390: 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  0 );.  usableSiz
a3a0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
a3b0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73  usableSize;.  as
a3c0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73  sert( nByte < us
a3d0: 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20  ableSize-8 );.. 
a3e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a3f0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
a400: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
a410: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
a420: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
a430: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
a440: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
a450: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
a460: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
a470: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
a480: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
a490: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b     if( top==0 ){
a4a0: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
a4b0: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
a4c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a4d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a4e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a4f0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
a500: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
a510: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
a520: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
a530: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
a540: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
a550: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
a560: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
a570: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
a580: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
a590: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
a5a0: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
a5b0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
a5c0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
a5d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a5e0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
a5f0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
a600: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
a610: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
a620: 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26  f( gap+2<=top &&
a630: 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c   (data[hdr+1] ||
a640: 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b   data[hdr+2]) ){
a650: 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64  .    int pc, add
a660: 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d  r;.    for(addr=
a670: 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74  hdr+1; (pc = get
a680: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a690: 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b  ]))>0; addr=pc){
a6a0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  .      int size;
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a6c0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
a6d0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  slot */.      if
a6e0: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
a6f0: 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29  4 || pc<addr+4 )
a700: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a710: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a720: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
a730: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
a740: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
a750: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
a760: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
a770: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
a780: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
a790: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20   testcase( x==4 
a7a0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
a7b0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
a7c0: 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a       if( x<4 ){.
a7d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 61            if( da
a7e0: 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20 29 20  ta[hdr+7]>=60 ) 
a7f0: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
a800: 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
a810: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
a820: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
a830: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
a840: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
a850: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
a860: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
a870: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
a880: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
a890: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
a8a0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
a8b0: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
a8c0: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
a8d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a     }else if( siz
a8e0: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
a8f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
a900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a910: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
a920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a930: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
a940: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
a950: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
a960: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
a970: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  ount.          *
a980: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
a990: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
a9a0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
a9b0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
a9c0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
a9d0: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   x);.        }. 
a9e0: 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70         *pIdx = p
a9f0: 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72  c + x;.        r
aa00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
aa10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
aa20: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
aa30: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
aa40: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
aa50: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
aa60: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
aa70: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
aa80: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
aa90: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
aaa0: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
aab0: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
aac0: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
aad0: 70 20 29 7b 0a 64 65 66 72 61 67 6d 65 6e 74 5f  p ){.defragment_
aae0: 70 61 67 65 3a 0a 20 20 20 20 74 65 73 74 63 61  page:.    testca
aaf0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
ab00: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
ab10: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
ab20: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
ab30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
ab40: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
ab50: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
ab60: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
ab70: 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74  rt( gap+nByte<=t
ab80: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
ab90: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
aba0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
abb0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
abc0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
abd0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
abe0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
abf0: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
ac00: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
ac10: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
ac20: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
ac30: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
ac40: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
ac50: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
ac60: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
ac70: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
ac80: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
ac90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
aca0: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
acb0: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
acc0: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
acd0: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
ace0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
acf0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ad00: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
ad10: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
ad20: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
ad30: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
ad40: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
ad50: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
ad60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ad70: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
ad80: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
ad90: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
ada0: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
adb0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
adc0: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
add0: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
ade0: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
adf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
ae00: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
ae10: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
ae20: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
ae30: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
ae40: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
ae50: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
ae60: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
ae70: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
ae80: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
ae90: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
aea0: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
aeb0: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
aec0: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
aed0: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
aee0: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
aef0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
af00: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
af10: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
af20: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
af30: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
af40: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
af50: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
af60: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
af70: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
af80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
af90: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
afa0: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
afb0: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
afc0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
afd0: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
afe0: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
aff0: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b010: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b020: 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 6e 65  of pointer to ne
b030: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
b040: 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20    u16 iFreeBlk; 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b070: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  ss of the next f
b080: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38  reeblock */.  u8
b090: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64      /* Page head
b0c0: 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31  er size.  0 or 1
b0d0: 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67  00 */.  u8 nFrag
b0e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b100: 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72   Reduction in fr
b110: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  agmentation */. 
b120: 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d   u16 iOrigSize =
b130: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
b140: 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
b150: 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a  al value of iSiz
b160: 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74  e */.  u32 iLast
b170: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b180: 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20  sableSize-4; /* 
b190: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
b1a0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b1b0: 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  t */.  u32 iEnd 
b1c0: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
b1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b1e0: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
b1f0: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
b200: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
b210: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
b220: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
b230: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
b240: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b250: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b260: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b270: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b280: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b290: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
b2a0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
b2b0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
b2c0: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
b2d0: 73 73 65 72 74 28 20 69 45 6e 64 20 3c 3d 20 70  ssert( iEnd <= p
b2e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b2f0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
b300: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b310: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b320: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
b330: 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29  sert( iSize>=4 )
b340: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
b350: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
b360: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
b370: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f  t<=iLast );..  /
b380: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
b390: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
b3a0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
b3b0: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
b3c0: 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73  e.  ** option is
b3d0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
b3e0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
b3f0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
b400: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
b410: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
b420: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
b430: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
b440: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
b450: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
b460: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
b470: 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
b480: 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
b490: 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
b4a0: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
b4b0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
b4c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
b4d0: 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
b4e0: 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
b4f0: 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
b500: 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
b510: 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
b520: 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
b530: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
b540: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
b550: 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
b560: 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
b570: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
b580: 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30 20  &data[iPtr]))>0 
b590: 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74 61  && iFreeBlk<iSta
b5a0: 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rt ){.      if( 
b5b0: 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20  iFreeBlk<iPtr+4 
b5c0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
b5d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b5e0: 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65      iPtr = iFree
b5f0: 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Blk;.    }.    i
b600: 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73  f( iFreeBlk>iLas
b610: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
b620: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b630: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
b640: 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72  eBlk>iPtr || iFr
b650: 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20  eeBlk==0 );.  . 
b660: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
b670: 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69  int:.    **    i
b680: 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74  FreeBlk:   First
b690: 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72   freeblock after
b6a0: 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f   iStart, or zero
b6b0: 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20   if none.    ** 
b6c0: 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54     iPtr:       T
b6d0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20  he address of a 
b6e0: 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42 6c 6b  pointer iFreeBlk
b6f0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
b700: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
b710: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
b720: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
b730: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
b740: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
b750: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
b760: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
b770: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
b780: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
b790: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
b7a0: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
b7b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b7c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
b7d0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
b7e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
b7f0: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
b800: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
b810: 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  - iStart;.      
b820: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
b830: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
b840: 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  lk]);.    }.  . 
b850: 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73     /* If iPtr is
b860: 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f   another freeblo
b870: 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20  ck (that is, if 
b880: 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20  iPtr is not the 
b890: 66 72 65 65 6c 69 73 74 20 70 6f 69 6e 74 65 72  freelist pointer
b8a0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 70  .    ** in the p
b8b0: 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e  age header) then
b8c0: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
b8d0: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
b8e0: 65 20 63 6f 61 6c 65 73 63 65 64 20 0a 20 20 20  e coalesced .   
b8f0: 20 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64   ** onto the end
b900: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
b910: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
b920: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
b930: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
b940: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
b950: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
b960: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
b970: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
b980: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
b990: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
b9a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b9b0: 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  T;.        nFrag
b9c0: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
b9d0: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
b9e0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
b9f0: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
ba00: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
ba10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ba20: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
ba30: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
ba40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ba50: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
ba60: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
ba70: 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32  if( iStart==get2
ba80: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ba90: 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ]) ){.    /* The
baa0: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
bab0: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
bac0: 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
bad0: 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
bae0: 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
baf0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
bb00: 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
bb10: 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
bb20: 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
bb30: 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
bb40: 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31   if( iPtr!=hdr+1
bb50: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
bb60: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bb70: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
bb80: 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42  a[hdr+1], iFreeB
bb90: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
bba0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
bbb0: 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iEnd);.  }else{.
bbc0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
bbd0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
bbe0: 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  into the freelis
bbf0: 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74  t */.    put2byt
bc00: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69  e(&data[iPtr], i
bc10: 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32  Start);.    put2
bc20: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
bc30: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
bc40: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
bc50: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
bc60: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
bc70: 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
bc80: 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
bc90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bca0: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
bcb0: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
bcc0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
bcd0: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
bce0: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
bcf0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
bd00: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
bd10: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
bd20: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
bd30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
bd40: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
bd50: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
bd60: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
bd70: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
bd80: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
bd90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
bda0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
bdb0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
bdc0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
bdd0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
bde0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
bdf0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
be00: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
be10: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
be20: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
be30: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
be40: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
be50: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
be60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
be70: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
be80: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
be90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
bea0: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
beb0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
bec0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
bed0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
bee0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
bef0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
bf00: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
bf10: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
bf20: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
bf30: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
bf40: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
bf50: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
bf60: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
bf70: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
bf80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
bf90: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
bfa0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
bfb0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
bfc0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
bfd0: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
bfe0: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
bff0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
c000: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
c010: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
c020: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
c030: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
c040: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
c050: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
c060: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
c070: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
c080: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
c090: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
c0a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
c0b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
c0c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
c0d0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
c0e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
c0f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c100: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
c110: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
c120: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
c130: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
c140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c150: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
c160: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
c170: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
c180: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
c190: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
c1a0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
c1b0: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
c1c0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
c1d0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
c1e0: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
c1f0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
c200: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
c210: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
c220: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
c230: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
c240: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
c250: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
c260: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
c270: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
c280: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
c290: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
c2a0: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
c2b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
c2c0: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
c2d0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
c2e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c2f0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
c300: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c310: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
c320: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
c330: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
c340: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
c350: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
c360: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
c370: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
c380: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
c390: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
c3a0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
c3b0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
c3c0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
c3d0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
c3e0: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
c3f0: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
c400: 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20  {.    u16 pc;   
c410: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c420: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
c430: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
c440: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
c450: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
c460: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
c470: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
c480: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
c490: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
c4a0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
c4b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
c4c0: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
c4d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
c4e0: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
c4f0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ture */.    int 
c500: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
c510: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
c520: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
c530: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
c540: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
c550: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
c560: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
c570: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
c580: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46  er */.    int nF
c590: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
c5a0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
c5b0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
c5c0: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f  ge */.    int to
c5d0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
c5e0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
c5f0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c600: 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rea */.    int i
c610: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
c620: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
c630: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
c640: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ck offset */.   
c650: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
c660: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
c670: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
c680: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
c690: 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67  ..    pBt = pPag
c6a0: 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72  e->pBt;..    hdr
c6b0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c6c0: 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  set;.    data = 
c6d0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
c6e0: 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
c6f0: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
c700: 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r]) ) return SQL
c710: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c720: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
c730: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
c740: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
c750: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20  e<=65536 );.    
c760: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c770: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c780: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20  eSize - 1);.    
c790: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c7a0: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
c7b0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
c7c0: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
c7d0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
c7e0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
c7f0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
c800: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
c810: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
c820: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
c830: 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c      pPage->aCell
c840: 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  Idx = &data[cell
c850: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70  Offset];.    top
c860: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
c870: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
c880: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
c890: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
c8a0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
c8b0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
c8c0: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
c8d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
c8e0: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
c8f0: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
c900: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
c910: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
c920: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c930: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
c940: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c950: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
c960: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20  CELL(pBt) );..  
c970: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
c980: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
c990: 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
c9a0: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
c9b0: 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67  nd.    ** of pag
c9c0: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
c9d0: 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a   cell.  .    **.
c9e0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
c9f0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
ca00: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
ca10: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
ca20: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20   extends.    ** 
ca30: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
ca40: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
ca50: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
ca60: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
ca70: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  .    ** returned
ca80: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20   if it does..   
ca90: 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72   */.    iCellFir
caa0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
cab0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
cac0: 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20  ;.    iCellLast 
cad0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
cae0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
caf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
cb00: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
cb10: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
cb20: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
cb30: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
cb40: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
cb50: 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ray */.      int
cb60: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
cb70: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
cb80: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
cb90: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
cba0: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20  ellLast--;.     
cbb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
cbc0: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
cbd0: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
cbe0: 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
cbf0: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
cc00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cc10: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
cc20: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
cc30: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
cc40: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
cc50: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
cc60: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
cc70: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
cc80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
cc90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
cca0: 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63  }.        sz = c
ccb0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
ccc0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
ccd0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cce0: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
ccf0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
cd00: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
cd10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
cd20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
cd30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
cd40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cd50: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
cd60: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
cd70: 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69  +;.    }  .#endi
cd80: 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  f..    /* Comput
cd90: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
cda0: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
cdb0: 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  ge */.    pc = g
cdc0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
cdd0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
cde0: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
cdf0: 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28   top;.    while(
ce00: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
ce10: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
ce20: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
ce30: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
ce40: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
ce50: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72    /* Start of fr
ce60: 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20  ee block is off 
ce70: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
ce80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
cea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
ceb0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
cec0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
ced0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
cee0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
cef0: 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30       if( (next>0
cf00: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
cf10: 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  e+3) || pc+size>
cf20: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
cf30: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
cf40: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
cf50: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
cf60: 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79   And the last by
cf70: 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  te of.        **
cf80: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
cf90: 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20  must lie on the 
cfa0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
cfb0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
cfc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
cfd0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
cfe0: 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46        nFree = nF
cff0: 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20  ree + size;.    
d000: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
d010: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
d020: 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
d030: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
d040: 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
d050: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
d060: 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
d070: 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
d080: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
d090: 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
d0a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
d0b0: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
d0c0: 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
d0d0: 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
d0e0: 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
d0f0: 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
d100: 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
d110: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
d120: 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
d130: 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
d140: 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
d150: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
d160: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
d170: 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
d180: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
d190: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
d1a0: 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
d1b0: 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
d1c0: 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
d1d0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
d1e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d1f0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
d200: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
d210: 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
d220: 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
d230: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
d240: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
d250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d260: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
d270: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
d280: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
d290: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
d2a0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
d2b0: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
d2c0: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
d2d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
d2e0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
d2f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
d300: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d310: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d320: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
d330: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
d340: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
d350: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
d360: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d370: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
d380: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
d390: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
d3a0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d3b0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
d3c0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
d3d0: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
d3e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d3f0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
d400: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
d410: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
d420: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
d430: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
d440: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
d450: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d460: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d470: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
d480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
d490: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
d4a0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
d4b0: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
d4c0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
d4d0: 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
d4e0: 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
d4f0: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
d500: 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
d510: 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
d520: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
d530: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
d540: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
d550: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
d560: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
d570: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
d580: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
d590: 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
d5a0: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
d5b0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
d5c0: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
d5d0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
d5e0: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
d5f0: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
d600: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
d610: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
d620: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
d630: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
d640: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
d650: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
d660: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
d670: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
d680: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
d690: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
d6a0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
d6b0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
d6c0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
d6d0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
d6e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
d6f0: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
d700: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
d710: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
d720: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
d730: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
d740: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
d750: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
d760: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
d770: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
d780: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
d790: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
d7a0: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
d7b0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d7c0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
d7d0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
d7e0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d7f0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
d800: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
d810: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
d820: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
d830: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
d840: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
d850: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
d860: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
d870: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
d880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
d890: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
d8a0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
d8b0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
d8c0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
d8d0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
d8e0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
d8f0: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
d900: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
d910: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
d920: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
d930: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
d940: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
d950: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
d960: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
d970: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
d980: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
d990: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
d9a0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
d9b0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
d9c0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
d9d0: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
d9e0: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
d9f0: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
da00: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
da10: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
da20: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
da30: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
da40: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
da50: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
da60: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
da70: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
da80: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
da90: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
daa0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
dab0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
dac0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
dad0: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
dae0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
daf0: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
db00: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
db10: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
db20: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
db30: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
db40: 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
db50: 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
db60: 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
db70: 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
db80: 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
db90: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
dba0: 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
dbb0: 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
dbc0: 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
dbd0: 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
dbe0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dbf0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
dc00: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
dc10: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
dc20: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
dc30: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
dc40: 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  DbPage, flags);.
dc50: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
dc60: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
dc70: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
dc80: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
dc90: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
dca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dcb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
dcc0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
dcd0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
dce0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
dcf0: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
dd00: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
dd10: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
dd20: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
dd30: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
dd40: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
dd50: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
dd60: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
dd70: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
dd80: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
dd90: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
dda0: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
ddb0: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
ddc0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ddd0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
dde0: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
ddf0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
de00: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
de10: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
de20: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
de30: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
de40: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
de50: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
de60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
de70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
de80: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
de90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
dea0: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
deb0: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
dec0: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
ded0: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
dee0: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
def0: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
df00: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
df10: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
df20: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
df30: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
df40: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
df50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
df60: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
df70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
df80: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
df90: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
dfa0: 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
dfb0: 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
dfc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
dfd0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
dfe0: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
dff0: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
e000: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a  tine is just a.*
e010: 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  * convenience wr
e020: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
e030: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62  arate calls to b
e040: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
e050: 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  d .** btreeInitP
e060: 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
e070: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
e080: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
e090: 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
e0a0: 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  o is undefined. 
e0b0: 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
e0c0: 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
e0d0: 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
e0e0: 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
e0f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e100: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
e110: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
e140: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
e150: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
e160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e170: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
e180: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
e190: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1b0: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
e1c0: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
e1d0: 20 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20    int bReadonly 
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52    /* PAGER_GET_R
e200: 45 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a  EADONLY or 0 */.
e210: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
e220: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e230: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
e240: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
e250: 74 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41  t( bReadonly==PA
e260: 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
e270: 20 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30   || bReadonly==0
e280: 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
e290: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
e2a0: 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
e2b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
e2c0: 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
e2d0: 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
e2e0: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
e2f0: 70 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79  pPage, bReadonly
e300: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e310: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
e320: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
e330: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
e340: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
e350: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
e360: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e370: 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
e380: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
e390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e3a0: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  }..  testcase( p
e3b0: 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
e3c0: 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
e3d0: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
e3e0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
e3f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
e400: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
e410: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
e420: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
e430: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
e440: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
e450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e460: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
e470: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
e480: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
e490: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e4a0: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
e4b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
e4c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e4d0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
e4e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e4f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
e500: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
e510: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
e520: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
e530: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e540: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
e550: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
e560: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
e570: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e580: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e590: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e5a0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
e5b0: 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
e5c0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
e5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
e5e0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
e5f0: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
e600: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
e610: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
e620: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
e630: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
e640: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
e650: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
e660: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
e670: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
e680: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
e690: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e6a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
e6b0: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
e6c0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
e6d0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
e6e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
e6f0: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
e700: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
e710: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
e720: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
e730: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
e740: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
e750: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
e760: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
e770: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
e780: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
e790: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e7a0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
e7b0: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
e7c0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
e7d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
e7e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e7f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e800: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
e810: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
e820: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
e830: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
e840: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
e850: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
e860: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
e870: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
e880: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
e890: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
e8a0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
e8b0: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
e8c0: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
e8d0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
e8e0: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
e8f0: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
e900: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
e910: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
e920: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
e930: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
e940: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
e950: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
e960: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
e970: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
e980: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
e990: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
e9a0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
e9b0: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
e9c0: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
e9d0: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
e9e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
e9f0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
ea00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ea10: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
ea20: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
ea30: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
ea40: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
ea50: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
ea60: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
ea70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
ea80: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
ea90: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
eaa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
eab0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
eac0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
ead0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
eae0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
eaf0: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
eb00: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
eb10: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
eb20: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
eb30: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
eb40: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
eb50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
eb60: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
eb70: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
eb80: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
eb90: 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
eba0: 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
ebb0: 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
ebc0: 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
ebd0: 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
ebe0: 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
ebf0: 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
ec00: 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
ec10: 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
ec20: 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
ec30: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
ec40: 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
ec50: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
ec60: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
ec70: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
ec80: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
ec90: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
eca0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
ecb0: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
ecc0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
ecd0: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
ece0: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
ecf0: 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
ed00: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
ed10: 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
ed20: 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
ed30: 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
ed40: 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
ed50: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
ed60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
ed70: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
ed80: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
ed90: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
eda0: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
edb0: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
edc0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
edd0: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
ede0: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
edf0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
ee00: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
ee10: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
ee20: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
ee30: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
ee40: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
ee50: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
ee60: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
ee70: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
ee80: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
ee90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
eea0: 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
eeb0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
eec0: 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
eed0: 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
eee0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
eef0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
ef00: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
ef10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
ef20: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
ef30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
ef40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
ef50: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
ef60: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
ef70: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
ef80: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
ef90: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
efa0: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
efb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
efc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
efd0: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
efe0: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
eff0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
f000: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
f010: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
f020: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
f030: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f050: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
f060: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
f070: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
f0a0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
f0b0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
f0c0: 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
f0d0: 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
f0e0: 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
f0f0: 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
f100: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
f110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
f120: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
f130: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
f140: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
f170: 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
f180: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
f190: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
f1a0: 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
f1b0: 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
f1c0: 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
f1d0: 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
f1e0: 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
f1f0: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
f200: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
f210: 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
f220: 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
f230: 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
f240: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
f250: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
f260: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
f270: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
f280: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
f290: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
f2a0: 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
f2b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
f2c0: 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
f2d0: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
f2e0: 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
f2f0: 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
f300: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
f310: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
f320: 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
f350: 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
f360: 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
f390: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
f3a0: 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
f3b0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
f3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
f3d0: 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
f3e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f3f0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
f400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
f410: 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
f420: 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
f430: 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
f440: 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
f450: 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
f460: 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
f470: 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
f480: 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
f490: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
f4a0: 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
f4b0: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
f4c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
f4d0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
f4e0: 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
f4f0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
f500: 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
f510: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
f520: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
f530: 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
f540: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
f550: 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
f560: 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
f570: 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
f580: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
f590: 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
f5a0: 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
f5b0: 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
f5c0: 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
f5d0: 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
f5e0: 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
f5f0: 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
f600: 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
f610: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
f620: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
f630: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
f640: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f650: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
f660: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
f670: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
f680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f690: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
f6a0: 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
f6b0: 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
f6c0: 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
f6d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
f6e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
f6f0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
f700: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f710: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
f720: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
f730: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
f740: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
f750: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
f760: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
f770: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
f780: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
f790: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
f7a0: 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
f7b0: 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
f7c0: 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
f7d0: 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
f7e0: 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
f7f0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
f800: 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
f810: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
f820: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
f830: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
f840: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
f850: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
f860: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
f870: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54  name);.      MUT
f880: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
f890: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
f8a0: 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d  ared; ).      p-
f8b0: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
f8c0: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
f8d0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
f8e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f8f0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
f900: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
f910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f920: 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
f930: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
f940: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
f950: 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  ename, sqlite3St
f960: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
f970: 29 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )+1);.      }els
f980: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
f990: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
f9a0: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
f9b0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
f9e0: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
f9f0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
fa00: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fa10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
fa20: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
fa30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
fa40: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
fa50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
fa60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fa70: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
fa80: 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
fa90: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
faa0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
fab0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
fac0: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
fad0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fae0: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
faf0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
fb00: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
fb10: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
fb20: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
fb30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fb40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
fb50: 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
fb60: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
fb70: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fb80: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fb90: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
fba0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
fbb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
fbc0: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
fbd0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
fbe0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
fbf0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
fc00: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
fc10: 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
fc20: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
fc30: 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
fc40: 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
fc50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
fc60: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
fc70: 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
fc80: 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
fc90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
fca0: 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
fcb0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
fcc0: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
fcd0: 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
fce0: 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
fcf0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
fd00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
fd10: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
fd20: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
fd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
fd40: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
fd50: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
fd60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fd70: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
fd80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
fd90: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
fdb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
fdc0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
fdd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fde0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
fdf0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
fe00: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
fe10: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
fe20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fe30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
fe40: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
fe50: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
fe60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
fe70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
fe80: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
fe90: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
fea0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
feb0: 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
fec0: 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
fed0: 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
fee0: 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
fef0: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
ff00: 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
ff10: 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
ff20: 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
ff30: 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
ff40: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
ff50: 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
ff60: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
ff70: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
ff80: 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
ff90: 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
ffa0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
ffb0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
ffc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
ffd0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
ffe0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
fff0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
10000 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
10010 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
10020 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
10030 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
10040 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
10050 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
10060 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
10070 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
10080 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
10090 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
100a0 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
100b0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
100c0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
100d0 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
100e0 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
100f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
10100 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (u64)==8 || size
10110 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(u64)==4 );.  
10120 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
10130 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
10140 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
10150 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
10160 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
10170 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
10180 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
10190 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
101a0 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
101b0 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
101c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
101d0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
101e0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
101f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
10200 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
10210 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
10220 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10240 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
10250 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
10260 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
10270 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10290 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
102a0 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
102b0 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61  Pager, db->szMma
102c0 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
102d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
102e0 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
102f0 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
10300 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
10310 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
10320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10330 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
10340 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
10350 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65    }.    pBt->ope
10360 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61  nFlags = (u8)fla
10370 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  gs;.    pBt->db 
10380 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
10390 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
103a0 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
103b0 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
103c0 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
103d0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
103e0 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
103f0 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
10400 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
10410 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
10420 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
10430 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42  Bt->pPager) ) pB
10440 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
10450 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69  TS_READ_ONLY;.#i
10460 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
10470 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42  RE_DELETE.    pB
10480 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
10490 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
104a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74  ;.#endif.    pBt
104b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
104c0 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
104d0 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
104e0 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
104f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
10500 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
10510 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
10520 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
10530 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
10540 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
10550 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
10560 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
10570 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
10580 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
10590 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
105a0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
105b0 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
105c0 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
105d0 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
105e0 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
105f0 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
10600 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
10610 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
10620 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
10630 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
10640 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
10650 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
10660 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
10670 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
10680 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
10690 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
106a0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
106b0 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
106c0 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
106d0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
106e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
106f0 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
10700 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
10710 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
10720 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
10730 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
10740 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
10750 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
10760 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
10770 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
10780 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
10790 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
107a0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
107b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
107c0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
107d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
107e0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
107f0 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
10800 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
10810 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
10820 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
10830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10840 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
10850 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
10860 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
10870 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
10880 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
10890 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
108a0 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
108b0 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
108c0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
108d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
108e0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
108f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
10900 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
10910 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
10920 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
10930 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10940 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10950 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
10960 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
10970 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
10980 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
10990 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
109a0 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
109b0 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
109c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
109d0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
109e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
109f0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
10a00 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
10a10 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
10a20 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
10a30 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
10a40 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
10a50 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
10a60 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
10a70 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
10a80 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
10a90 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
10aa0 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
10ab0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
10ac0 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
10ad0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
10ae0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
10af0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
10b00 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
10b10 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
10b20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
10b30 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
10b40 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
10b50 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
10b60 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10b70 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
10b80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
10b90 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
10ba0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
10bb0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
10bc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10bd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10be0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
10bf0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
10c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10c10 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10c20 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
10c30 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
10c40 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
10c50 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10c60 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
10c70 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
10c80 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10c90 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
10ca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10cb0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
10cc0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
10cd0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
10ce0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10cf0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10d00 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
10d10 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
10d20 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
10d30 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
10d40 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
10d50 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
10d60 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
10d70 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
10d80 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
10d90 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
10da0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
10db0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
10dc0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
10dd0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
10de0 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
10df0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
10e00 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10e10 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
10e20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10e30 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
10e40 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
10e50 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
10e60 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
10e70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
10e80 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
10e90 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
10ea0 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
10eb0 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
10ec0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
10ed0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
10ee0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
10ef0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
10f00 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
10f10 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
10f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10f30 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
10f40 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
10f50 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
10f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
10f70 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
10f80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10f90 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
10fa0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
10fb0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
10fc0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
10fd0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
10fe0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
10ff0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
11000 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
11010 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
11020 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
11030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
11040 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
11050 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
11060 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
11070 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
11080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11090 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
110a0 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
110b0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
110c0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
110d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
110e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
110f0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
11100 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
11110 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
11120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
11130 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
11140 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
11150 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
11160 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
11170 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
11180 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
11190 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
111a0 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
111b0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
111c0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
111d0 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
111e0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
111f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
11200 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
11210 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
11220 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
11230 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
11240 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
11250 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
11260 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
11270 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
11280 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
11290 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
112a0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
112b0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
112c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
112d0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
112e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
112f0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
11300 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
11310 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
11320 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
11330 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
11340 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
11350 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
11360 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
11370 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
11380 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
11390 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
113a0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
113b0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
113c0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
113d0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
113e0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
113f0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
11400 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
11410 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
11420 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
11430 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
11440 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
11450 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
11460 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
11470 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
11480 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
11490 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
114a0 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
114b0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
114c0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
114d0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
114e0 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
114f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11500 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
11510 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
11520 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
11530 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
11540 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
11550 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
11560 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
11570 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
11580 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
11590 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
115a0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
115b0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
115c0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
115d0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
115e0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
115f0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
11600 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
11610 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
11620 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
11630 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
11640 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
11650 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
11660 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
11670 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
11680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11690 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
116a0 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
116b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
116c0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
116d0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
116e0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
116f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11700 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
11710 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
11720 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
11730 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
11740 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
11750 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
11760 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
11770 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
11780 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a  IZE(pBt) bytes..
11790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
117a0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
117b0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
117c0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
117d0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
117e0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
117f0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
11800 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
11810 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
11820 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
11830 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
11840 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
11850 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
11860 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
11870 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
11880 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
11890 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
118a0 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
118b0 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
118c0 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
118d0 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
118e0 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
118f0 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
11900 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
11910 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
11920 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
11930 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
11940 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
11950 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
11960 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
11970 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
11980 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
11990 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
119a0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
119b0 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
119c0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
119d0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
119e0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
119f0 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
11a00 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
11a10 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
11a20 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
11a30 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
11a40 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
11a50 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
11a60 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
11a70 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
11a80 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
11a90 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
11aa0 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
11ab0 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69   here.  */.    i
11ac0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
11ad0 65 20 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e  e ) memset(pBt->
11ae0 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29  pTmpSpace, 0, 4)
11af0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
11b00 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
11b10 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
11b20 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
11b30 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
11b40 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11b50 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
11b60 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
11b70 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
11b80 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
11b90 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
11ba0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
11bb0 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
11bc0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
11bd0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
11be0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
11bf0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11c00 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
11c10 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
11c20 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
11c30 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
11c40 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
11c50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11c60 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11c70 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
11c80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11c90 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
11ca0 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
11cb0 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
11cc0 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
11cd0 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
11ce0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
11cf0 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
11d00 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
11d10 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
11d20 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
11d30 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
11d40 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
11d50 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
11d60 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
11d70 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
11d80 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
11d90 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
11da0 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
11db0 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
11dc0 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
11dd0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
11de0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
11df0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
11e00 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11e10 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
11e20 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
11e30 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
11e40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
11e50 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
11e60 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
11e70 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
11e80 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
11e90 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
11ea0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
11eb0 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
11ec0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
11ed0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
11ee0 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
11ef0 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
11f00 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
11f10 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
11f20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
11f30 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
11f40 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
11f50 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
11f60 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
11f70 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
11f80 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
11f90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
11fa0 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
11fb0 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
11fc0 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
11fd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
11fe0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
11ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
12000 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
12010 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
12020 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
12030 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
12040 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
12050 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
12060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
12070 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
12080 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
12090 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
120a0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
120b0 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
120c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
120d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
120e0 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
120f0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
12100 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
12110 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
12120 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
12130 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
12140 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
12150 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
12160 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
12170 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
12180 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
121a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
121b0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
121c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
121d0 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
121e0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
121f0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
12200 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
12210 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
12220 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
12230 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
12240 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
12250 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
12260 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
12270 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
12280 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
12290 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
122a0 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
122b0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
122c0 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
122d0 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
122e0 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
122f0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
12300 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
12310 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
12320 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
12330 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
12340 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
12350 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
12360 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
12370 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
12380 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
12390 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
123a0 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
123b0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
123c0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
123d0 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
123e0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
123f0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
12400 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
12410 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
12420 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
12430 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
12440 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
12450 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
12460 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12470 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
12480 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
12490 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
124a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
124b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
124c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
124d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
124e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
124f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
12500 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
12510 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
12520 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
12530 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12550 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
12560 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
12570 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
12580 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
12590 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
125a0 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
125b0 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
125c0 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
125d0 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
125e0 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
125f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
12600 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
12610 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12620 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12630 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12640 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
12650 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12660 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
12670 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
12680 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
12690 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
126a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
126b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
126c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
126d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
126e0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
126f0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
12700 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
12710 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
12720 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
12730 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
12740 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
12750 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
12760 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
12770 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
12780 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
12790 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
127a0 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
127b0 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
127c0 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
127d0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
127e0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
127f0 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
12800 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
12810 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
12820 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
12830 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
12840 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
12850 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
12860 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
12870 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
12880 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
12890 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
128a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
128b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
128c0 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
128d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
128e0 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
128f0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
12900 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
12910 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
12920 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
12930 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
12940 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
12950 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
12960 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
12970 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12980 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12990 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
129a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
129b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
129c0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
129d0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
129e0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
129f0 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
12a00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12a20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
12a30 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
12a40 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
12a50 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
12a60 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
12a70 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
12a80 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
12a90 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
12aa0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
12ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12ac0 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
12ad0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
12ae0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12af0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
12b00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12b10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
12b20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
12b30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12b40 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
12b50 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
12b60 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
12b70 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
12b80 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
12b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12ba0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12bb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
12bc0 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
12bd0 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
12be0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
12bf0 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
12c00 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
12c10 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
12c20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
12c30 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
12c40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
12c50 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
12c60 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
12c70 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
12c80 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
12c90 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
12ca0 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
12cb0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
12cc0 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
12cd0 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
12ce0 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
12cf0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
12d00 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
12d10 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
12d20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
12d30 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
12d40 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
12d50 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
12d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12d70 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
12d80 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
12d90 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
12da0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
12db0 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
12dc0 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
12dd0 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
12de0 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
12df0 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
12e00 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
12e10 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
12e20 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
12e30 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
12e40 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
12e50 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
12e60 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
12e70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
12e80 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
12e90 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
12ea0 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
12eb0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
12ec0 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
12ed0 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
12ee0 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
12ef0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12f00 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
12f10 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
12f20 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
12f30 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
12f40 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
12f50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
12f60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12f70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
12f80 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
12f90 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
12fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12fb0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
12fc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
12fd0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
12fe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
12ff0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
13000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
13010 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
13020 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
13030 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
13040 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
13050 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
13060 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13070 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
13080 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
13090 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
130a0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
130b0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
130c0 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
130d0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
130e0 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
130f0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
13100 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
13110 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
13120 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
13130 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
13140 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
13150 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
13160 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
13170 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
13180 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
13190 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
131a0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
131b0 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
131c0 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
131d0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
131e0 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
131f0 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
13200 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
13210 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
13220 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
13230 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13240 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13250 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13260 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
13270 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
13280 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
13290 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
132a0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
132b0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
132c0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
132d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
132e0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
132f0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
13300 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
13310 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
13320 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
13330 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
13340 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
13350 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
13360 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
13370 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
13380 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
13390 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
133a0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
133b0 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
133c0 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
133d0 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
133e0 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
133f0 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
13400 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
13410 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
13420 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
13430 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
13440 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
13450 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
13460 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
13470 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
13480 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
13490 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
134a0 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
134b0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
134c0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
134d0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
134e0 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
134f0 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
13500 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
13510 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
13520 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
13530 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13540 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
13550 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
13560 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
13570 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
13580 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e  sableSize;.}.#en
13590 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41  dif /* SQLITE_HA
135a0 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54  S_CODEC || SQLIT
135b0 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20  E_DEBUG */..#if 
135c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
135d0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
135e0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
135f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
13600 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UM)./*.** Return
13610 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
13620 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
13630 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
13640 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
13650 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
13660 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
13670 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
13680 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
13690 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
136a0 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
136b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
136c0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
136d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
136e0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
136f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
13700 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
13710 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
13720 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
13730 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13740 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
13750 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
13760 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
13770 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
13780 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
13790 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
137a0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
137b0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
137c0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
137d0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
137e0 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
137f0 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
13800 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
13810 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13820 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
13830 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
13840 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
13850 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13860 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
13870 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
13880 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
13890 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
138a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
138b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
138c0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
138d0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
138e0 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
138f0 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
13900 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
13910 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
13920 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
13930 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
13940 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
13950 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
13960 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
13970 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
13980 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13990 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
139a0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
139b0 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
139c0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
139d0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
139e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
139f0 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
13a00 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
13a10 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
13a20 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
13a30 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
13a40 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
13a50 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
13a60 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
13a70 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
13a80 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
13a90 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
13aa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13ab0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
13ac0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
13ad0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13ae0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
13af0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
13b00 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
13b10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
13b20 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
13b30 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
13b40 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
13b50 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
13b60 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
13b70 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
13b80 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
13b90 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
13ba0 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
13bb0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
13bc0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
13bd0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
13be0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
13bf0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
13c00 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
13c10 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
13c20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13c30 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
13c40 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
13c50 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
13c60 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
13c70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
13c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
13c90 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
13ca0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13cb0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
13cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
13cd0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
13ce0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
13cf0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13d00 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
13d10 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
13d20 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
13d30 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
13d40 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
13d50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
13d60 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
13d70 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
13d80 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
13d90 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
13da0 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
13db0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
13dc0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13dd0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
13de0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
13df0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
13e00 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
13e10 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
13e20 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
13e30 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
13e40 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
13e50 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
13e60 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
13e70 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
13e80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13e90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13ea0 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
13eb0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
13ec0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
13ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13ee0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
13ef0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
13f00 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
13f10 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
13f20 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
13f30 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
13f40 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
13f50 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
13f60 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
13f70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13f80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13f90 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
13fa0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
13fb0 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
13fc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13fd0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
13fe0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
13ff0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
14000 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
14010 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14020 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
14030 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
14040 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
14050 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
14060 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
14070 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
14080 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
14090 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
140a0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
140b0 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
140c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
140d0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
140e0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
140f0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
14100 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
14110 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14120 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
14130 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
14140 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
14150 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
14160 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
14170 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
14180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
14190 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
141a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
141b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
141c0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
141d0 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
141e0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
141f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
14200 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
14210 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
14220 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
14230 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
14240 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
14250 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
14260 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14270 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
14280 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
14290 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
142a0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
142b0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
142c0 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
142d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
142e0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
142f0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
14300 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
14310 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
14320 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14330 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
14340 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
14350 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
14360 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
14370 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
14380 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
14390 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
143a0 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
143b0 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
143c0 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
143d0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
143e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
143f0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
14400 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
14410 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
14420 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
14430 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
14440 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
14450 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
14460 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
14470 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
14480 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
14490 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
144a0 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
144b0 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
144c0 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
144d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
144e0 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
144f0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
14500 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
14510 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14520 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14530 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
14540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
14550 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
14560 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
14570 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
14580 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
14590 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
145a0 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
145b0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
145c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
145d0 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
145e0 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
145f0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
14600 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
14610 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
14620 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
14630 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
14640 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
14650 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
14660 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
14670 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
14680 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
14690 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
146a0 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
146b0 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
146c0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
146d0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
146e0 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
146f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
14700 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
14710 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
14720 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
14730 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
14740 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
14750 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
14760 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
14770 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
14780 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
14790 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
147a0 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
147b0 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
147c0 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
147d0 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
147e0 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
147f0 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
14800 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
14810 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14820 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
14830 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
14840 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
14850 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
14860 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
14870 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
14880 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
14890 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
148a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
148b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
148c0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
148d0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
148e0 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d  else if( isOpen=
148f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
14900 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14910 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
14920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
14930 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
14940 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
14950 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14960 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
14970 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
14980 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
14990 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
149a0 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
149b0 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
149c0 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
149d0 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
149e0 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
149f0 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
14a00 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
14a10 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
14a20 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
14a30 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
14a40 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
14a50 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
14a60 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
14a70 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
14a80 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
14a90 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
14aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
14ab0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
14ac0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
14ad0 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
14ae0 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
14af0 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
14b00 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
14b10 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
14b20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
14b30 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
14b40 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
14b50 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
14b60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
14b70 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14b80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
14b90 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
14ba0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
14bb0 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
14bc0 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
14bd0 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
14be0 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
14bf0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
14c00 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
14c10 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
14c20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
14c30 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
14c40 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
14c50 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
14c60 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
14c70 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
14c80 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
14c90 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
14ca0 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
14cb0 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
14cc0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
14cd0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
14ce0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
14cf0 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
14d00 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
14d10 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
14d20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
14d30 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
14d40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14d50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14d60 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
14d70 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
14d80 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
14d90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
14da0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
14db0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
14dc0 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
14dd0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
14de0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
14df0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
14e00 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
14e30 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
14e40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14e50 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74    }.    if( (pBt
14e60 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
14e70 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
14e80 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  e)==0 && nPage>n
14e90 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
14ea0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
14eb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
14ec0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14ed0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14ee0 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
14ef0 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
14f00 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14f10 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
14f20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14f30 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
14f40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
14f50 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
14f60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14f70 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14f80 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14f90 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
14fa0 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
14fb0 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
14fc0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
14fd0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
14fe0 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
14ff0 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
15000 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
15010 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
15020 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
15030 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
15040 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
15050 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
15060 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
15070 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
15080 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
15090 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
150a0 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
150b0 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
150c0 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
150d0 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
150e0 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
150f0 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
15100 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
15110 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
15120 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
15130 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
15140 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
15150 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
15160 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
15170 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
15180 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
15190 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
151a0 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
151b0 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
151c0 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
151d0 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
151e0 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
151f0 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
15200 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
15210 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
15220 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
15230 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
15240 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
15250 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
15260 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
15270 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
15280 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
15290 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
152a0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
152b0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
152c0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
152d0 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
152e0 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
152f0 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
15300 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
15310 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
15320 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
15330 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
15340 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
15350 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
15360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
15370 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
15380 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
15390 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
153a0 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
153b0 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
153c0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
153d0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
153e0 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
153f0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
15400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15410 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
15420 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
15430 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
15440 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
15450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
15460 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
15470 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
15480 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
15490 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
154a0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
154b0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
154c0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
154d0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
154e0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
154f0 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
15500 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
15510 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
15520 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
15530 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
15540 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
15550 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
15560 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
15570 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
15580 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
15590 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
155a0 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
155b0 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
155c0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
155d0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
155e0 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
155f0 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
15600 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
15610 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
15620 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
15630 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15640 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
15650 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
15660 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
15670 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
15680 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
15690 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
156a0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
156b0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
156c0 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
156d0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
156e0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
156f0 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
15700 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
15710 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
15720 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
15730 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
15740 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
15750 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
15760 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
15770 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
15780 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
15790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
157a0 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
157b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
157c0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
157d0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
157e0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
157f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15800 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
15810 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
15820 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
15830 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
15840 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
15850 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
15860 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
15870 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
15880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15890 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
158a0 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
158b0 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
158c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
158d0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
158e0 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
158f0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
15900 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
15910 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
15920 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
15930 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15940 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
15950 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
15960 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
15970 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
15980 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
15990 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
159a0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
159b0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  ger)==1 );.    a
159c0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
159d0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
159e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
159f0 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
15a00 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
15a10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
15a20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
15a30 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
15a40 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
15a50 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
15a60 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
15a70 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
15a80 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
15a90 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
15aa0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
15ab0 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
15ac0 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
15ad0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
15ae0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
15af0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
15b00 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
15b10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15b20 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15b30 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
15b40 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
15b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15b60 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
15b70 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
15b80 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
15b90 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
15ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15bb0 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
15bc0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
15bd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
15be0 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
15bf0 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
15c00 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
15c10 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
15c20 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
15c30 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
15c40 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
15c50 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
15c60 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
15c70 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
15c80 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
15c90 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
15ca0 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
15cb0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
15cc0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
15cd0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
15ce0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
15cf0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
15d00 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
15d10 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
15d20 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
15d30 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
15d40 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
15d50 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
15d60 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
15d70 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
15d80 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
15d90 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
15da0 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
15db0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
15dc0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15dd0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
15de0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
15df0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15e00 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
15e10 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
15e20 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
15e30 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
15e40 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
15e50 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
15e60 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
15e70 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
15e80 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
15e90 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
15ea0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
15eb0 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
15ec0 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
15ed0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
15ee0 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
15ef0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
15f00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15f10 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
15f20 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
15f30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
15f40 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
15f50 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
15f60 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
15f70 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
15f80 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
15f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
15fa0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
15fb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
15fc0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
15fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15fe0 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
15ff0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16000 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16010 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
16020 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
16030 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
16040 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
16050 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16070 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
16080 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
16090 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
160a0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
160b0 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
160c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
160d0 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
160e0 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
160f0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
16100 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
16110 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
16120 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
16130 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
16140 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
16150 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
16160 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
16170 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
16180 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
16190 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
161a0 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
161b0 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
161c0 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
161d0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
161e0 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
161f0 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
16200 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
16210 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
16220 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
16230 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
16240 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
16250 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
16260 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
16270 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
16280 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
16290 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
162a0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
162b0 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
162c0 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
162d0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
162e0 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
162f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
16300 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
16310 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
16320 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
16330 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
16340 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
16350 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16360 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
16370 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16380 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
16390 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
163a0 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
163b0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
163c0 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
163d0 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
163e0 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
163f0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
16400 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
16410 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
16420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
16430 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
16440 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
16450 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
16460 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
16470 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
16480 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
16490 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
164a0 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
164b0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
164c0 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
164d0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
164e0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
164f0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
16500 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
16510 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
16520 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
16530 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
16540 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
16550 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
16560 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
16570 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
16580 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
16590 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
165a0 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
165b0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
165c0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
165d0 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
165e0 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
165f0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
16600 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
16610 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
16620 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
16630 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
16640 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
16650 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
16660 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
16670 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
16680 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
16690 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
166a0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
166b0 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
166c0 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
166d0 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
166e0 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
166f0 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
16700 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
16710 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
16720 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
16730 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
16740 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
16750 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16760 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
16770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16780 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
16790 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
167a0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
167b0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
167c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
167d0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
167e0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
167f0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
16800 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
16810 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
16820 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
16830 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
16840 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
16850 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16860 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
16870 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
16880 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
16890 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
168a0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
168b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
168c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
168d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
168e0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
168f0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
16900 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
16910 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
16920 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
16930 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
16940 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
16950 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
16960 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
16970 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
16980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
16990 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
169a0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
169b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
169c0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
169d0 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
169e0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
169f0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
16a00 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
16a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
16a20 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
16a30 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
16a40 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
16a50 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
16a60 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
16a70 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
16a80 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
16a90 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
16aa0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
16ab0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
16ac0 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
16ad0 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
16ae0 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  NG)!=0.  ){.    
16af0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
16b00 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
16b10 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
16b20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
16b30 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
16b40 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
16b50 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
16b60 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
16b70 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
16b80 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
16b90 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
16ba0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
16bb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16bc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
16bd0 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
16be0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
16bf0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
16c00 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
16c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
16c20 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
16c30 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
16c40 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
16c50 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
16c60 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
16c70 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
16c80 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
16c90 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
16ca0 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
16cb0 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
16cc0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
16cd0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
16ce0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
16cf0 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
16d00 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
16d10 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
16d20 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
16d30 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
16d40 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
16d50 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
16d60 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
16d70 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
16d80 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
16d90 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
16da0 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
16db0 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
16dc0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16dd0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
16de0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
16df0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
16e00 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
16e10 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
16e20 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
16e30 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
16e40 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
16e50 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
16e60 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
16e70 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
16e80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
16e90 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
16ea0 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
16eb0 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
16ec0 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
16ed0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
16ee0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
16ef0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
16f00 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
16f10 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
16f20 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
16f30 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
16f40 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
16f50 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
16f60 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
16f70 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
16f80 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
16f90 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
16fa0 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
16fb0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
16fc0 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
16fd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16fe0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
16ff0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
17000 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
17010 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
17020 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
17030 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
17040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
17050 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
17060 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
17070 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
17080 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
17090 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
170a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
170b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
170c0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
170d0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
170e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
170f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
17110 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
17120 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
17130 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
17140 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
17150 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
17160 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
17170 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
17180 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
17190 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
171a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
171b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
171c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
171d0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
171e0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
171f0 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
17200 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
17210 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
17220 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
17230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17240 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
17250 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
17260 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
17270 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
17280 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
17290 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
172a0 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
172b0 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
172c0 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
172d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
172e0 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
172f0 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
17300 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
17310 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
17320 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
17330 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
17340 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
17350 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
17360 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
17370 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
17380 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
17390 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
173a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
173b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
173c0 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
173d0 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
173e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
173f0 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
17400 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
17410 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
17420 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
17430 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
17440 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
17450 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
17460 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
17470 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
17480 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
17490 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
174a0 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
174b0 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
174c0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
174d0 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
174e0 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
174f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
17500 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
17510 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
17520 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
17530 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
17540 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
17550 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
17560 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
17570 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
17580 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
17590 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
175a0 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
175b0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
175c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
175d0 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
175e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
175f0 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
17600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17610 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
17620 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17650 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
17660 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
17670 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
17680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17690 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
176a0 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
176b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
176c0 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
176d0 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
176e0 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
176f0 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
17700 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
17710 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
17720 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
17730 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
17740 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
17750 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
17760 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
17770 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
17780 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
17790 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
177a0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
177b0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
177c0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
177d0 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
177e0 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
177f0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
17800 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17810 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17820 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
17830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17840 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
17850 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
17860 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
17870 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
17880 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
17890 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
178a0 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
178b0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
178c0 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
178d0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
178e0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
178f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
17900 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
17910 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
17920 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
17930 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17960 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
17970 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
179a0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
179b0 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
179c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
179f0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
17a00 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
17a10 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
17a20 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
17a30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
17a40 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
17a50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17a60 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
17a70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
17a80 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
17a90 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
17aa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17ab0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
17ac0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
17ad0 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
17ae0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
17af0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
17b00 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
17b10 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
17b20 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
17b30 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
17b40 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
17b50 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
17b60 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
17b70 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
17b80 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
17b90 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
17ba0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17bb0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
17bc0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
17bd0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
17be0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
17bf0 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
17c00 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
17c10 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
17c20 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
17c30 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
17c40 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
17c50 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
17c60 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
17c70 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
17c80 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
17c90 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
17ca0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
17cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17cc0 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
17cd0 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
17ce0 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
17cf0 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
17d00 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
17d10 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
17d20 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
17d30 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
17d40 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
17d50 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
17d60 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
17d70 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
17d80 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
17d90 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
17da0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
17db0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dd0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
17de0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
17df0 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
17e00 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
17e10 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
17e20 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
17e30 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
17e40 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
17e50 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
17e60 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
17e70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
17e80 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
17e90 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
17ea0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
17eb0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
17ec0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
17ee0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
17ef0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
17f00 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
17f10 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
17f20 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
17f30 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
17f40 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
17f50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17f60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
17f70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
17f80 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
17f90 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
17fa0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
17fb0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
17fc0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
17fd0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
17fe0 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
17ff0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
18000 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
18010 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
18020 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
18030 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
18040 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
18050 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18060 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
18070 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
18080 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
18090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
180a0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
180b0 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
180c0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
180d0 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65  Cell;..    btree
180e0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
180f0 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
18100 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
18110 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
18120 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
18130 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
18140 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
18150 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
18160 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
18170 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
18180 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
18190 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
181a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
181b0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
181c0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
181d0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26  flow.         &&
181e0 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
181f0 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e  rflow+3<=pPage->
18200 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
18210 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26  kPage.         &
18220 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  & iFrom==get4byt
18230 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
18240 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20  verflow]).      
18250 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
18260 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
18270 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
18280 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
18290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
182a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
182b0 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
182c0 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
182d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
182e0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
182f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
18300 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
18310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
18320 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
18330 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
18340 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
18350 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
18360 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
18370 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
18380 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
18390 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
183a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
183b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
183c0 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
183d0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
183e0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
183f0 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
18400 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
18410 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
18420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18430 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
18440 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
18450 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
18460 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
18470 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
18480 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
18490 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
184a0 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
184b0 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
184c0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
184d0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
184e0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
184f0 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
18500 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
18510 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
18520 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
18530 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
18540 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
18550 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
18560 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
18570 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
18580 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
18590 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
185a0 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
185b0 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
185c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
185d0 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
185e0 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
185f0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
18600 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
18610 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18630 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
18640 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
18650 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
18660 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
18670 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
18680 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
18690 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
186a0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
186b0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
186c0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
186d0 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
186e0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18700 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
18710 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
18720 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
18730 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
18740 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
18750 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
18760 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
18770 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
18780 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
18790 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
187a0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
187b0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
187c0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
187d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
187e0 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
187f0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
18800 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
18810 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
18820 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
18830 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
18840 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18850 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18860 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18870 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
18880 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
18890 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
188a0 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
188b0 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
188c0 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
188d0 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
188e0 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
188f0 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
18900 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
18910 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
18920 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
18930 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
18940 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
18950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18960 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
18970 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
18980 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
18990 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
189a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
189b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
189c0 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
189d0 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
189e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
189f0 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
18a00 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
18a10 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
18a20 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
18a30 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
18a40 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
18a50 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
18a60 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
18a70 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
18a80 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
18a90 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
18aa0 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
18ab0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
18ac0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
18ad0 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
18ae0 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
18af0 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
18b00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
18b10 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
18b20 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
18b30 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
18b40 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
18b50 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
18b60 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
18b70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
18b80 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
18b90 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
18ba0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
18bb0 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
18bc0 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
18bd0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
18be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18c00 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18c10 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
18c20 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
18c30 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
18c40 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
18c50 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
18c60 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
18c70 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
18c80 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
18c90 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
18ca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18cb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18cd0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
18ce0 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
18cf0 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
18d00 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
18d10 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
18d20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
18d30 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
18d40 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
18d50 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
18d60 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
18d70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
18d80 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
18d90 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
18da0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
18db0 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
18dc0 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
18dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18de0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18df0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18e00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18e10 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
18e20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
18e30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18e40 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
18e50 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
18e60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
18e80 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
18e90 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
18ea0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
18eb0 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
18ec0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
18ed0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
18ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ef0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
18f00 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
18f10 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
18f20 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
18f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18f40 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
18f50 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
18f60 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
18f70 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
18f80 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
18f90 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
18fa0 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
18fb0 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
18fc0 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
18fd0 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
18fe0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
18ff0 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
19000 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
19010 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
19020 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
19030 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
19040 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
19050 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
19060 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
19070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
19080 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
19090 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
190a0 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
190b0 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
190c0 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
190d0 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
190e0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
190f0 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
19100 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
19110 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
19120 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
19130 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
19140 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
19150 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
19160 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
19170 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
19180 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
19190 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
191a0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
191b0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
191c0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
191d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
191e0 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
191f0 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
19200 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
19210 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
19220 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
19230 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
19240 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
19250 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
19260 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
19270 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
19280 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
19290 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
192a0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
192b0 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
192c0 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
192d0 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
192e0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
192f0 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
19300 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
19310 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
19320 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
19330 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
19340 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
19350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19360 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
19370 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
19380 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
19390 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
193a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
193b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
193c0 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
193d0 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
193e0 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
193f0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
19400 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
19410 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
19420 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
19430 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
19440 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
19450 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
19460 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19470 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
19480 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
19490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
194a0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
194b0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
194c0 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
194d0 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
194e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
194f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19500 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
19520 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
19530 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
19540 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19550 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
19560 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
19570 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
19580 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
19590 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
195a0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
195b0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
195c0 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
195d0 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
195e0 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
195f0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
19600 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
19610 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
19620 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
19630 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
19640 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
19650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
19660 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
19670 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
19680 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
19690 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
196a0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
196b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
196c0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
196d0 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
196e0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
196f0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
19700 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
19710 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
19720 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
19730 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
19740 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19760 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19780 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
19790 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
197a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
197b0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
197c0 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
197d0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
197e0 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
197f0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
19800 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
19810 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
19820 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
19830 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
19840 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
19850 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
19860 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
19870 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
19880 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
19890 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
198a0 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
198b0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
198c0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
198d0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
198e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
198f0 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
19900 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19920 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19930 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
19940 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
19950 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
19960 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
19970 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
19980 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
19990 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
199a0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
199b0 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
199c0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
199d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
199e0 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
199f0 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
19a00 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
19a10 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
19a20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
19a30 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
19a40 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
19a50 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
19a60 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
19a70 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
19a80 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
19a90 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
19aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
19ab0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
19ac0 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
19ad0 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
19ae0 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
19af0 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
19b00 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
19b10 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
19b20 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
19b30 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
19b40 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
19b50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19b70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
19b80 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
19b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
19bb0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
19bc0 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
19bd0 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
19be0 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
19bf0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
19c00 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
19c10 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
19c20 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
19c30 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
19c40 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
19c50 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
19c60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19c70 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
19c80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19c90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
19ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19cb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
19cc0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
19cd0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
19ce0 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
19cf0 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
19d00 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
19d10 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
19d20 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
19d30 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
19d40 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
19d50 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
19d60 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
19d70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19d80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
19d90 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
19da0 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
19db0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
19dc0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
19dd0 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
19de0 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
19df0 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
19e00 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
19e10 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
19e20 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
19e30 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
19e40 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
19e50 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
19e60 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
19e70 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
19e80 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
19e90 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
19ea0 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
19eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19ec0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19ed0 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
19ee0 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
19ef0 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19f20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
19f30 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
19f40 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f60 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
19f70 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
19f80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
19f90 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
19fa0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
19fb0 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
19fc0 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
19fd0 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
19fe0 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
19ff0 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
1a000 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
1a010 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
1a020 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1a030 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1a040 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
1a050 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1a060 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
1a070 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
1a080 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a090 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
1a0a0 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
1a0b0 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
1a0c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1a0d0 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
1a0e0 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1a0f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
1a100 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
1a110 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
1a120 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
1a130 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
1a140 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
1a150 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
1a160 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
1a170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
1a180 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
1a190 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
1a1a0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
1a1b0 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
1a1c0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
1a1d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1a1e0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1a1f0 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
1a200 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
1a210 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
1a220 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
1a230 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1a240 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a250 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
1a260 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a270 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a280 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a290 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
1a2a0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a2b0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
1a2c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1a2d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a2e0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1a2f0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
1a300 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1a310 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
1a320 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1a330 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1a340 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1a350 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
1a360 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1a370 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
1a380 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
1a390 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1a3a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1a3b0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1a3c0 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1a3d0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1a3e0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1a3f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1a400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a410 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
1a420 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1a430 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
1a440 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1a450 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
1a460 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
1a470 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a490 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a4a0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1a4b0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1a4c0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1a4d0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1a4e0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1a4f0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
1a500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1a520 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
1a530 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a540 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1a560 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1a570 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
1a580 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
1a590 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
1a5a0 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
1a5b0 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1a5c0 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
1a5d0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1a5e0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1a5f0 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
1a600 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1a610 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
1a620 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1a630 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1a640 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
1a650 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1a660 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
1a670 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1a680 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1a690 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1a6a0 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1a6b0 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1a6c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a6d0 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1a6e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1a6f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a700 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1a710 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1a720 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1a730 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1a740 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1a750 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
1a760 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a770 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a780 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1a790 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1a7a0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1a7b0 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1a7c0 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1a7d0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1a7e0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1a7f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a800 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1a810 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1a820 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1a830 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1a840 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a850 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1a860 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1a870 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1a880 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1a890 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1a8a0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1a8b0 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1a8c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1a8d0 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1a8e0 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1a8f0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1a900 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1a910 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1a920 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1a930 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1a940 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1a950 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1a960 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1a970 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1a980 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1a990 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1a9a0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1a9b0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1a9c0 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1a9d0 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1a9e0 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1a9f0 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1aa00 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1aa10 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1aa20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aa30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1aa40 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1aa50 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1aa60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1aa70 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1aa80 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1aa90 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1aaa0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1aab0 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
1aac0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1aad0 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
1aae0 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
1aaf0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1ab00 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1ab10 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
1ab20 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
1ab30 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
1ab40 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
1ab50 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1ab60 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1ab70 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
1ab80 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
1ab90 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
1aba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1abb0 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
1abc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1abd0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1abe0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1abf0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ac00 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ac10 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
1ac20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1ac30 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ac40 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
1ac50 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1ac60 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1ac70 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
1ac80 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1ac90 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
1aca0 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
1acb0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1acc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1acd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1ace0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1acf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1ad00 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
1ad10 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1ad20 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
1ad30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1ad40 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
1ad50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ad60 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
1ad70 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
1ad80 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
1ad90 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1ada0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1adb0 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
1adc0 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
1add0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1ade0 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
1adf0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
1ae00 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
1ae10 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1ae20 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
1ae30 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1ae40 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
1ae50 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
1ae60 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
1ae70 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1ae80 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
1ae90 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
1aea0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
1aeb0 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
1aec0 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
1aed0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1aee0 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
1aef0 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
1af00 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
1af10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1af20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
1af30 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
1af40 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1af50 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1af60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1af70 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
1af80 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
1af90 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
1afa0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
1afb0 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
1afc0 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
1afd0 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
1afe0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
1aff0 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
1b000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1b010 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
1b020 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
1b030 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1b040 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
1b050 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
1b060 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
1b070 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
1b080 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
1b090 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
1b0a0 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
1b0b0 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
1b0c0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
1b0d0 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
1b0e0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1b0f0 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
1b100 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
1b110 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
1b120 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b130 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1b140 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1b150 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
1b160 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
1b170 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
1b180 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
1b190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
1b1a0 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
1b1b0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1b1c0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1b1d0 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
1b1e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b1f0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
1b200 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
1b210 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
1b220 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
1b230 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
1b240 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
1b250 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
1b260 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
1b270 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
1b280 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
1b290 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
1b2a0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b2b0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
1b2c0 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
1b2d0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1b2e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b2f0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b300 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
1b310 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1b320 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1b330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1b340 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b350 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1b360 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b370 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1b380 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b3a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b3b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1b3c0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1b3d0 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
1b3e0 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
1b3f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b410 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b420 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
1b430 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1b440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b450 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1b460 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b470 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1b480 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
1b490 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1b4a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
1b4b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1b4c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
1b4d0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
1b4e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
1b4f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b500 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1b510 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1b520 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1b530 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
1b540 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1b550 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
1b560 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
1b570 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
1b580 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
1b590 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
1b5a0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1b5b0 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
1b5c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b5d0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1b5e0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1b5f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1b600 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1b610 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1b620 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b630 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
1b640 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
1b650 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
1b660 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1b670 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
1b680 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1b690 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1b6a0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1b6b0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1b6c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1b6d0 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1b6e0 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1b6f0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1b700 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1b710 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1b720 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1b730 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1b740 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1b750 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1b760 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1b770 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1b780 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1b790 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1b7a0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1b7b0 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1b7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1b7d0 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1b7e0 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1b7f0 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1b800 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1b810 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1b820 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1b830 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1b840 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1b850 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1b860 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1b870 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1b880 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1b890 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1b8a0 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1b8b0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1b8c0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1b8d0 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1b8e0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1b8f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1b900 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1b910 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1b920 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1b930 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1b940 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1b950 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1b960 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1b970 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1b980 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1b990 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1b9a0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1b9b0 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1b9c0 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1b9d0 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1b9e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b9f0 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1ba00 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1ba10 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1ba20 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1ba30 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1ba40 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1ba50 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1ba60 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1ba70 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1ba80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ba90 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1baa0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1bab0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1bac0 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1bad0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1bae0 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1baf0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1bb00 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1bb10 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1bb20 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1bb30 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1bb40 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1bb50 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1bb60 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1bb70 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1bb80 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1bb90 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1bba0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1bbb0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1bbc0 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1bbd0 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1bbe0 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1bbf0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1bc00 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1bc10 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1bc20 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1bc30 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1bc40 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1bc50 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1bc60 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1bc70 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1bc80 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1bc90 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1bca0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1bcb0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1bcc0 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1bcd0 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1bce0 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1bcf0 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1bd00 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1bd10 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1bd20 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1bd30 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1bd40 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1bd50 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1bd60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1bd70 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1bd80 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1bd90 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1bda0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1bdb0 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1bdc0 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1bdd0 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1bde0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1bdf0 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1be00 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1be10 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1be20 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1be30 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1be40 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1be50 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1be60 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1be70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1be80 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1be90 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1bea0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1beb0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1bec0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1bed0 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1bee0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1bef0 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1bf00 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1bf10 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1bf20 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1bf30 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1bf40 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1bf50 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1bf60 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1bf70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1bf80 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1bf90 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1bfa0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1bfb0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1bfc0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1bfd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1bfe0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1bff0 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1c000 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1c010 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1c020 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1c030 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1c040 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c050 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1c060 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1c070 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1c080 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1c090 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1c0a0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1c0b0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1c0c0 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1c0d0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1c0e0 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1c0f0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1c100 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1c110 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c120 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1c130 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1c140 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1c150 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1c160 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1c170 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1c180 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1c190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1c1a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1c1b0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1c1c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c1d0 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1c1e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c1f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1c200 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c210 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1c220 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1c230 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1c240 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1c250 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1c260 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1c270 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1c280 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c290 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c2a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
1c2b0 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
1c2c0 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
1c2d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1c2e0 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
1c2f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1c300 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c310 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c320 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1c330 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
1c340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c350 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c360 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1c370 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
1c380 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c390 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c3a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c3b0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1c3c0 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
1c3d0 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
1c3e0 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
1c3f0 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
1c400 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
1c410 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
1c420 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
1c430 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
1c440 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
1c450 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
1c460 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
1c470 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
1c480 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1c490 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
1c4a0 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
1c4b0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
1c4c0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
1c4d0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1c4e0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
1c4f0 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
1c500 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
1c510 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
1c520 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
1c530 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
1c540 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
1c550 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
1c560 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
1c570 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
1c580 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1c590 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
1c5a0 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
1c5b0 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
1c5c0 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
1c5d0 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
1c5e0 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
1c5f0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
1c600 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
1c610 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
1c620 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1c630 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
1c640 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
1c650 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
1c660 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
1c670 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
1c680 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1c690 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
1c6a0 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1c6b0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1c6c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1c6d0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
1c6e0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1c6f0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
1c700 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1c710 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
1c720 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1c730 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1c740 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1c750 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1c760 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1c770 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1c780 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1c790 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c7a0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
1c7b0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1c7c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c7d0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
1c7e0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
1c7f0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
1c800 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
1c810 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1c820 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
1c830 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
1c840 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1c850 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
1c860 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
1c870 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
1c880 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1c890 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1c8a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1c8b0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1c8c0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1c8d0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1c8e0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1c8f0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1c900 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c910 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1c920 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1c930 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  de){.  int rc;. 
1c940 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c950 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1c960 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1c970 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c980 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1c990 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1c9a0 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1c9b0 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1c9c0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1c9d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1c9e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c9f0 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
1ca00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1ca10 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1ca20 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b  rs(p, tripCode);
1ca30 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1ca40 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1ca50 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ca60 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1ca70 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1ca80 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1ca90 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1caa0 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1cab0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1cac0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1cad0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1cae0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1caf0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1cb00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1cb10 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1cb20 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1cb30 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1cb40 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1cb50 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1cb60 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1cb70 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1cb80 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1cb90 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1cba0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1cbb0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1cbc0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1cbd0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1cbe0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1cbf0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1cc00 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1cc10 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1cc20 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1cc30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1cc40 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1cc50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1cc60 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1cc70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1cc80 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1cc90 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1cca0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1ccb0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1ccc0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1ccd0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1cce0 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1ccf0 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1cd00 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1cd10 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1cd20 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1cd30 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1cd40 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1cd50 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1cd60 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1cd70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1cd80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cd90 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1cda0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1cdb0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1cdc0 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
1cdd0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1cde0 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1cdf0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1ce00 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1ce10 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1ce20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1ce30 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1ce40 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1ce50 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1ce60 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1ce70 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1ce80 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1ce90 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1cea0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1ceb0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1cec0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1ced0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1cee0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1cef0 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1cf00 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1cf10 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1cf20 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1cf30 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1cf40 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1cf50 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1cf60 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1cf70 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1cf80 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1cf90 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1cfa0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1cfb0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1cfc0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1cfd0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1cfe0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1cff0 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1d000 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1d010 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1d020 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1d030 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1d040 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1d050 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1d060 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1d070 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1d080 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1d090 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1d0a0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1d0b0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1d0c0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1d0d0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1d0e0 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1d0f0 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1d100 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1d110 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1d120 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1d130 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1d140 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1d150 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1d160 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1d170 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1d180 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1d190 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1d1a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1d1b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d1c0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1d1d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1d1e0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1d1f0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1d210 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1d220 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1d230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1d240 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1d250 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1d260 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1d270 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1d280 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1d290 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d2a0 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1d2b0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1d2c0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1d2d0 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1d2e0 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1d2f0 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1d300 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1d310 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1d320 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1d330 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1d340 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1d350 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1d360 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1d370 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1d380 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1d390 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1d3a0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1d3b0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1d3c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d3d0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1d3e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1d3f0 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1d400 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1d410 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d420 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1d430 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1d440 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1d450 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1d460 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1d470 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1d480 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1d490 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1d4a0 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1d4b0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1d4c0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1d4d0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1d4e0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1d4f0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1d500 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1d510 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1d520 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1d530 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1d540 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1d550 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1d560 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1d570 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1d580 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1d590 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1d5a0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1d5b0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1d5c0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1d5d0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1d5e0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1d5f0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1d600 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1d610 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1d620 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1d630 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1d640 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1d650 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d660 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1d670 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1d680 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1d690 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d6a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1d6b0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1d6c0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1d6d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d6e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1d6f0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1d700 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1d710 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1d720 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1d730 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1d740 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1d750 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1d760 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1d770 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1d780 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1d790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d7a0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1d7b0 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1d7c0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1d7d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d7e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1d7f0 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1d800 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1d810 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1d820 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1d830 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1d840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d850 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1d860 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1d870 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1d880 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1d890 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1d8a0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1d8b0 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1d8c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1d8d0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1d8e0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1d8f0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1d900 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1d910 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1d920 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1d930 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1d940 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1d950 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1d960 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1d970 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d980 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1d990 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d9a0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1d9b0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1d9c0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1d9d0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1d9e0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1d9f0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1da00 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1da10 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1da20 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1da30 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1da40 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1da50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1da60 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1da70 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1da80 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1da90 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1daa0 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1dab0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1dac0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1dad0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1dae0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1daf0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1db00 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1db10 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1db20 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1db30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1db40 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1db50 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1db60 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1db70 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1db80 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1db90 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1dba0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1dbb0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1dbc0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1dbd0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1dbe0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1dbf0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1dc00 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1dc10 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1dc20 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1dc30 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1dc40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1dc50 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1dc60 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1dc70 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1dc80 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1dc90 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1dca0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1dcb0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1dcc0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1dcd0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1dce0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1dcf0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1dd00 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1dd10 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1dd20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1dd30 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1dd40 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1dd50 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1dd60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1dd70 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1dd80 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1dd90 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1dda0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1ddb0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1ddc0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1ddd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1dde0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1ddf0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1de00 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1de10 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1de20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1de30 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1de40 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1de50 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1de60 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1de70 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1de80 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1de90 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1dea0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1deb0 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1dec0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1ded0 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1dee0 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1def0 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1df00 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1df10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1df20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1df30 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1df60 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1df70 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df90 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1dfa0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1dfb0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1dfe0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1dff0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1e000 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1e010 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1e020 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1e030 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1e040 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1e050 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1e080 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1e090 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e0a0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1e0b0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1e0c0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1e0d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1e0e0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1e0f0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1e100 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1e110 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1e120 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1e130 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1e140 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1e150 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1e160 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1e170 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1e180 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1e190 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1e1a0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1e1b0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1e1c0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1e1d0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1e1e0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1e1f0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1e200 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1e210 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1e220 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1e230 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1e240 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1e250 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1e260 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1e270 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1e280 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1e290 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1e2a0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1e2b0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1e2c0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1e2d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1e2e0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1e2f0 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1e300 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1e310 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e320 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1e330 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1e340 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1e350 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1e360 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1e370 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1e380 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1e390 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1e3a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1e3b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1e3c0 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1e3d0 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1e3e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
1e3f0 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
1e400 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
1e410 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1e420 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1e430 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1e440 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1e450 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1e460 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1e470 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1e480 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1e490 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1e4a0 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1e4b0 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1e4c0 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1e4d0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1e4e0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1e4f0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1e500 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1e510 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1e520 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
1e530 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29  BTCF_WriteFlag )
1e540 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
1e550 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70  gs = wrFlag;.  p
1e560 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1e570 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1e580 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1e590 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1e5a0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1e5b0 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1e5c0 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1e5d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1e5e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74  R_INVALID;.  ret
1e5f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e600 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e610 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1e620 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1e650 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1e660 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1e690 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1e6a0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1e6b0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1e6e0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1e6f0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1e700 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1e730 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1e740 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1e770 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1e780 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1e790 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1e7a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1e7b0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1e7c0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1e7d0 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1e7e0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1e7f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1e800 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e810 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1e820 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1e830 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1e840 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1e850 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1e860 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1e870 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1e880 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1e890 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1e8a0 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1e8b0 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1e8c0 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1e8d0 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1e8e0 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1e8f0 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1e900 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1e910 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1e920 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1e930 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1e940 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1e950 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
1e960 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
1e970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1e980 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
1e990 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
1e9a0 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
1e9b0 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
1e9c0 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
1e9d0 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
1e9e0 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
1e9f0 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
1ea00 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
1ea10 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
1ea20 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
1ea30 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
1ea40 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
1ea50 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
1ea60 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
1ea70 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
1ea80 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
1ea90 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
1eaa0 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
1eab0 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
1eac0 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
1ead0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
1eae0 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
1eaf0 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
1eb00 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
1eb10 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29  tCursor, iPage))
1eb20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1eb30 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1eb40 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1eb50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1eb60 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
1eb70 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
1eb80 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
1eb90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1eba0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
1ebb0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1ebc0 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
1ebd0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1ebe0 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1ebf0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
1ec00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1ec10 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
1ec20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1ec30 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tree);.    sqlit
1ec40 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1ec50 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  or(pCur);.    if
1ec60 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
1ec70 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72  .      pCur->pPr
1ec80 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
1ec90 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
1eca0 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  se{.      pBt->p
1ecb0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
1ecc0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1ecd0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1ece0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1ecf0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1ed00 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d  ur->pPrev;.    }
1ed10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ed20 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1ed30 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1ed40 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1ed50 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1ed60 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1ed70 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1ed80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 42  sqlite3DbFree(pB
1ed90 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e  tree->db, pCur->
1eda0 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
1edb0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1edc0 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1edd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ede0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1edf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ee00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1ee10 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1ee20 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1ee30 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1ee40 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1ee50 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1ee60 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1ee70 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1ee80 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1ee90 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1eea0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1eeb0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1eec0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1eed0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1eee0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1eef0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1ef00 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1ef10 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1ef20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1ef30 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1ef40 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1ef50 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1ef60 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1ef70 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1ef80 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1ef90 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1efa0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1efb0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1efc0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1efd0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1efe0 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1eff0 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1f000 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1f010 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1f020 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1f030 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1f040 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1f050 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1f060 6f 69 6e 67 20 61 67 67 72 65 73 73 69 76 65 20  oing aggressive 
1f070 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
1f080 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
1f090 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
1f0a0 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
1f0b0 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
1f0c0 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
1f0d0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1f0e0 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
1f0f0 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
1f100 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1f110 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
1f120 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
1f130 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1f140 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
1f150 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
1f160 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50  fo));.    btreeP
1f170 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1f180 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
1f190 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1f1a0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
1f1b0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1f1c0 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f   || memcmp(&info
1f1d0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
1f1e0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
1f1f0 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
1f200 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
1f210 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
1f220 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
1f230 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
1f240 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
1f250 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1f260 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
1f270 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
1f280 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
1f290 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1f2a0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
1f2b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1f2c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
1f2d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1f2e0 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  e;.      btreePa
1f2f0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1f300 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1f310 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1f320 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
1f330 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
1f340 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
1f350 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Key;.    }else{.
1f360 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
1f370 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1f380 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
1f390 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
1f3a0 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
1f3b0 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
1f3c0 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
1f3d0 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
1f3e0 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
1f3f0 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
1f400 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f440 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1f450 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f490 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1f4a0 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1f4e0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1f4f0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1f500 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1f510 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1f520 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 5c  >info);        \
1f530 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
1f540 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
1f550 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  dNKey;          
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f580 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
1f5e0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
1f630 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23  * _MSC_VER */..#
1f640 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
1f650 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
1f660 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
1f670 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1f680 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
1f690 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1f6a0 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
1f6b0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
1f6c0 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
1f6d0 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
1f6e0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1f6f0 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
1f700 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
1f710 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
1f720 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
1f730 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
1f740 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1f750 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
1f760 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f770 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
1f780 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1f790 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
1f7a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f7b0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
1f7c0 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
1f7d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
1f7e0 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
1f7f0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
1f800 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
1f810 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
1f820 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
1f830 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
1f840 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1f850 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
1f860 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
1f870 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1f880 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
1f890 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
1f8a0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
1f8b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1f8c0 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
1f8d0 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
1f8e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1f8f0 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
1f900 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1f910 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
1f920 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
1f930 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1f940 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
1f950 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1f960 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
1f970 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1f980 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
1f990 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1f9a0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1f9b0 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
1f9c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f9d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f9e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1f9f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1fa00 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1fa10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1fa20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69  SOR_VALID );.  i
1fa30 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
1fa40 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1fa50 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b  .    *pSize = 0;
1fa60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65  .  }else{.    ge
1fa70 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1fa80 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  .    *pSize = pC
1fa90 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1faa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1fab0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fac0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1fad0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1fae0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
1faf0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
1fb00 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
1fb10 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
1fb20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1fb30 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
1fb40 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
1fb50 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e  nting to a non-N
1fb60 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74  ULL.** valid ent
1fb70 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
1fb80 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  rds, the calling
1fb90 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
1fba0 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61  guarantee.** tha
1fbb0 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  t the cursor has
1fbc0 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d   Cursor.eState==
1fbd0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
1fbe0 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
1fbf0 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  ot possible.  Th
1fc00 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1fc10 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
1fc20 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68  E_OK..** It migh
1fc30 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62  t just as well b
1fc40 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72  e a procedure (r
1fc50 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62  eturning void) b
1fc60 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a  ut we continue.*
1fc70 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69  * to return an i
1fc80 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f  nteger result co
1fc90 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  de for historica
1fca0 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e  l reasons..*/.in
1fcb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1fcc0 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
1fcd0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
1fce0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1fcf0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1fd00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1fd10 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1fd20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1fd30 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1fd40 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
1fd50 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1fd60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1fd70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
1fd80 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1fd90 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1fda0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1fdb0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1fdc0 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1fdd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1fde0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1fdf0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1fe00 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1fe10 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1fe20 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1fe30 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1fe40 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1fe50 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1fe60 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1fe70 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1fe80 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1fe90 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1fea0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1feb0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1fec0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1fed0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1fee0 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1fef0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1ff00 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1ff10 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1ff20 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1ff30 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1ff40 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1ff50 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1ff60 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1ff70 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1ff80 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1ff90 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1ffa0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1ffb0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1ffc0 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1ffd0 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1ffe0 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1fff0 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
20000 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
20010 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
20020 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
20030 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
20040 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
20050 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
20060 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
20070 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
20080 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
20090 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
200a0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
200b0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
200c0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
200d0 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
200e0 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
200f0 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
20100 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
20110 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
20120 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
20130 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
20140 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
20150 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
20160 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
20170 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
20180 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
201a0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
201b0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
201c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
201d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
201e0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
201f0 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
20200 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
20210 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
20220 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
20230 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
20240 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
20250 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
20260 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
20270 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
20280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
20290 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
202a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
202b0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
202c0 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
202d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
202e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
202f0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
20300 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
20310 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
20320 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
20330 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
20340 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
20350 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
20360 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
20370 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
20380 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
20390 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
203a0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
203b0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
203c0 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
203d0 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
203e0 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
203f0 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
20400 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
20410 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
20420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
20430 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
20440 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
20450 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
20460 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
20470 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
20480 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
20490 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
204a0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
204b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
204c0 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
204d0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
204e0 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
204f0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
20500 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
20510 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
20520 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
20530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20540 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
20550 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
20560 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
20570 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
20580 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
20590 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
205a0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
205b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
205c0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
205d0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
205e0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
205f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20600 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
20610 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
20620 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
20630 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
20640 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
20650 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
20660 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
20670 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
20680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20690 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
206a0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
206b0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
206c0 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
206d0 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
206e0 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
206f0 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
20700 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
20710 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
20720 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
20730 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
20740 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
20750 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
20760 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
20770 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
20780 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
20790 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
207a0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
207b0 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
207c0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
207d0 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
207e0 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
207f0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
20800 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
20810 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
20820 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
20830 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
20840 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
20850 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
20860 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
20870 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
20880 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
20890 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
208a0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
208b0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
208c0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
208d0 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
208e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
208f0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
20900 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
20910 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
20920 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
20930 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
20940 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
20950 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
20960 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
20970 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
20980 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
20990 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
209a0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
209b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
209c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
209d0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
209e0 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
209f0 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
20a00 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
20a10 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
20a20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
20a30 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
20a40 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
20a50 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
20a60 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
20a70 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
20a80 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
20a90 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
20aa0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
20ab0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
20ac0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
20ad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20b00 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
20b10 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
20b20 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
20b30 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
20b40 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
20b50 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
20b60 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
20b70 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
20b80 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
20b90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20ba0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
20bb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
20bc0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
20bd0 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
20be0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
20bf0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
20c00 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
20c10 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
20c20 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
20c30 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
20c40 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
20c50 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
20c60 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
20c70 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
20c80 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
20c90 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
20ca0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
20cb0 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
20cc0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
20cd0 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70  ..**   2: The op
20ce0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
20cf0 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61  d. Do not popula
20d00 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
20d10 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
20d20 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
20d30 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
20d40 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
20d50 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
20d60 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
20d70 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
20d80 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
20d90 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
20da0 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
20db0 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
20dc0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
20dd0 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
20de0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
20df0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
20e00 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
20e10 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
20e20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
20e30 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
20e40 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a  pages and the.**
20e50 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73   eOp argument is
20e60 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e   not 2, this fun
20e70 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
20e80 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
20e90 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75   lazily .** popu
20ea0 6c 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  lates the overfl
20eb0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
20ec0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
20ed0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
20ee0 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
20ef0 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
20f00 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
20f10 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
20f20 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
20f30 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
20f40 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
20f50 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
20f60 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
20f70 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
20f80 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
20f90 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
20fa0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
20fb0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
20fc0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
20fd0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
20fe0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
20ff0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
21000 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
21010 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
21020 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
21030 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
21040 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
21050 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
21060 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
21070 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
21080 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
21090 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
210a0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
210b0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
210c0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
210d0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
210e0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
210f0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
21100 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
21110 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
21120 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
21130 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
21140 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
21150 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
21160 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
21170 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
21180 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
211a0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
211b0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
211c0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
211d0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
211e0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
211f0 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21210 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
21220 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
21230 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
21240 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
21250 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
21260 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
21270 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
21280 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
21290 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
212a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
212b0 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
212c0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
212d0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
212e0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
212f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21300 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
21310 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
21320 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
21330 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
21340 4c 4f 57 5f 52 45 41 44 0a 20 20 69 6e 74 20 62  LOW_READ.  int b
21350 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21380 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
21390 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
213a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
213b0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
213c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
213d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
213e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
213f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21400 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
21410 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
21420 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21430 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21440 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
21450 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 41  ==0 );      /* A
21460 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d  lways start from
21470 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65   beginning for e
21480 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43  Op==2 */..  getC
21490 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
214a0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
214b0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
214c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
214d0 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
214e0 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
214f0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
21500 2e 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53  .nKey);.#ifdef S
21510 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
21520 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e  RFLOW_READ.  bEn
21530 64 20 3d 20 28 6f 66 66 73 65 74 2b 61 6d 74 3d  d = (offset+amt=
21540 3d 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f  =nKey+pCur->info
21550 2e 6e 44 61 74 61 29 3b 0a 23 65 6e 64 69 66 0a  .nData);.#endif.
21560 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
21570 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
21580 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
21590 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
215a0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
215b0 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
215c0 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
215d0 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
215e0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
215f0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
21600 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
21610 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
21620 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
21630 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21640 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
21650 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
21660 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
21670 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
21680 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
21690 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
216a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
216b0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
216c0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
216d0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
216e0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
216f0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
21700 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
21710 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
21720 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
21730 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
21740 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
21750 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
21760 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
21770 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
21780 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
21790 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
217a0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
217b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
217c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
217d0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
217e0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
217f0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
21800 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
21810 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
21820 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
21830 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
21840 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
21850 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
21860 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
21870 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
21880 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
21890 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
218a0 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
218b0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
218c0 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
218d0 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
218e0 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
218f0 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
21900 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21910 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
21920 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
21930 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
21940 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
21950 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
21960 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
21970 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
21980 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
21990 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
219a0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
219b0 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
219c0 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
219d0 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
219e0 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
219f0 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
21a00 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
21a10 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
21a20 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
21a30 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
21a40 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
21a50 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
21a60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
21a70 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
21a80 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
21a90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21aa0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
21ab0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
21ac0 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
21ad0 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
21ae0 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
21af0 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62  (Pgno*)sqlite3Db
21b00 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
21b10 20 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65       pCur->pBtre
21b20 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76  e->db, pCur->aOv
21b30 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
21b40 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
21b50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21b60 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
21b70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21b80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ba0 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
21bb0 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
21bc0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
21bd0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
21be0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
21bf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
21c00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21c10 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
21c20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
21c30 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
21c40 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
21c50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
21c60 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
21c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21c80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
21c90 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
21ca0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
21cb0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
21cc0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
21cd0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
21ce0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
21cf0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
21d00 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
21d10 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
21d20 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
21d30 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
21d40 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 26  _ValidOvfl)!=0 &
21d50 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
21d60 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
21d70 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
21d80 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
21d90 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
21da0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
21db0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
21dc0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
21dd0 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
21de0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20      }..    for( 
21df0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21e00 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
21e10 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
21e20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
21e30 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
21e40 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
21e50 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
21e60 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
21e70 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
21e80 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29  _ValidOvfl)!=0 )
21e90 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
21ea0 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
21eb0 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
21ec0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
21ed0 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
21ee0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
21ef0 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
21f00 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPage;.      }..
21f10 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
21f20 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
21f30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
21f40 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
21f50 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
21f60 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
21f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
21f80 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
21f90 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
21fa0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
21fb0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
21fc0 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
21fd0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
21fe0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
21ff0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
22000 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
22010 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
22020 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
22030 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
22040 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
22050 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
22060 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
22070 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
22080 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
22090 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
220a0 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d  ed because eOp!=
220b0 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72  2.        ** her
220c0 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74  e.  If eOp==2, t
220d0 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e  hen offset==0 an
220e0 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73  d this branch is
220f0 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20   never taken..  
22100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22110 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
22120 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
22130 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  t( pCur->curFlag
22140 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
22150 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fl );.        if
22160 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
22170 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
22180 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
22190 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
221a0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
221b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
221c0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
221d0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
221e0 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
221f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
22200 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
22210 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
22220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22230 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
22240 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
22250 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
22260 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
22270 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
22280 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
22290 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
222a0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
222b0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
222c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
222d0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
222e0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
222f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
22300 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
22310 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
22320 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
22330 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
22340 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
22350 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
22360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
22370 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
22380 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
22390 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
223a0 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
223b0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
223c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
223d0 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
223e0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
223f0 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
22400 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
22410 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
22420 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
22430 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
22440 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
22450 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
22460 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
22470 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
22480 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
22490 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
224a0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
224b0 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
224c0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
224d0 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
224e0 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20      **   6) all 
224f0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61  data from the pa
22500 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  ge is being read
22510 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
22520 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
22530 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
22540 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
22550 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
22560 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
22570 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
22580 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
22590 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
225a0 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
225b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
225c0 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
225d0 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
225e0 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
225f0 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
22600 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
22610 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20  &0x01)==0       
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22640 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
22650 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
22690 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62  /.         && (b
226a0 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69  End || a==ovflSi
226b0 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ze)             
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226d0 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
226e0 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
226f0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
22700 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
22710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
22720 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
22730 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
22740 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
22750 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
22760 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
22770 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
22780 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
22790 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
227a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
227b0 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  5) */.        ){
227c0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
227d0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
227e0 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
227f0 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
22800 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
22810 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
22820 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22830 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
22840 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
22850 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
22860 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
22870 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
22880 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
22890 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
228a0 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
228b0 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
228c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
228d0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
228e0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
228f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
22900 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
22910 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
22920 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
22930 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
22940 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
22950 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
22960 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
22970 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
22980 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
229a0 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
229b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
229c0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
229d0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
229e0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
229f0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
22a00 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
22a10 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
22a20 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
22a30 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
22a40 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
22a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
22a60 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
22a70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
22a80 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
22a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22aa0 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
22ab0 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
22ac0 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
22ad0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
22ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22af0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
22b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22b10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
22b20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22b30 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
22b40 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
22b50 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
22b60 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
22b70 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
22b80 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
22b90 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
22ba0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
22bb0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
22bc0 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
22bd0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
22be0 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
22bf0 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
22c00 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
22c10 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
22c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
22c30 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
22c40 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
22c50 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
22c60 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
22c70 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
22c80 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
22c90 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
22ca0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
22cb0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
22cc0 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
22cd0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
22ce0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
22cf0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
22d00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22d10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22d20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22d30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22d40 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
22d50 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
22d60 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
22d70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
22d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22d90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22da0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
22db0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22dc0 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
22dd0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
22de0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
22df0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
22e00 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
22e10 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
22e20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
22e30 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
22e40 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
22e50 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
22e60 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
22e70 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
22e80 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
22e90 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
22ea0 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
22eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
22ec0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
22ed0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
22ee0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
22ef0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
22f00 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
22f10 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
22f20 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
22f30 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
22f40 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
22f50 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
22f60 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
22f70 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
22f80 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
22f90 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
22fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
22fb0 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
22fc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22fd0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
22fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
22ff0 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
23000 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23010 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23020 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
23030 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
23040 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
23050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23060 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23070 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23080 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
23090 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
230a0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
230b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
230c0 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
230d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
230e0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
230f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23100 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
23110 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
23120 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
23130 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
23140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23160 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23170 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
23180 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
23190 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
231a0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
231b0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
231c0 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
231d0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
231e0 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e  ** the key if in
231f0 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67  dex btrees (pPag
23200 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e  e->intKey==0) an
23210 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f  d is the data fo
23220 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65  r.** table btree
23230 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
23240 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72  ==1). The number
23250 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
23260 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61  ilable.** key/da
23270 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ta is written in
23280 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
23290 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
232a0 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e   value.** return
232b0 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ed will not be a
232c0 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
232d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
232e0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
232f0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
23300 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
23310 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
23320 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
23330 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
23340 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
23350 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
23360 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
23370 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
23380 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
23390 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
233a0 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
233b0 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
233c0 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
233d0 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
233e0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
233f0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
23400 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
23410 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
23420 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
23430 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
23440 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
23450 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
23460 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
23470 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
23480 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
23490 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
234a0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
234b0 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
234c0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
234d0 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
234e0 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
234f0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
23500 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
23510 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
23520 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63  const void *fetc
23530 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
23540 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
23550 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
23560 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
23570 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
23580 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20  32 *pAmt        
23590 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
235a0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
235b0 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
235c0 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
235d0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
235e0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
235f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23600 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
23610 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23620 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23630 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23640 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
23650 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
23660 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
23670 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23680 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23690 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
236a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
236b0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
236c0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
236d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
236e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
236f0 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70  0 );.  *pAmt = p
23700 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23710 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
23720 2a 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43  *)(pCur->info.pC
23730 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
23740 2e 6e 48 65 61 64 65 72 29 3b 0a 7d 0a 0a 0a 2f  .nHeader);.}.../
23750 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
23760 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
23770 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
23780 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
23790 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
237a0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
237b0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
237c0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
237d0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
237e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
237f0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
23800 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
23810 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
23820 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
23830 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
23840 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
23850 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
23860 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
23870 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
23880 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
23890 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
238a0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
238b0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
238c0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
238d0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
238e0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
238f0 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
23900 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
23910 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
23920 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
23930 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
23940 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
23950 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
23960 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
23970 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
23980 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
23990 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
239a0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
239b0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
239c0 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
239d0 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
239e0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
239f0 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
23a00 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
23a10 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
23a20 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
23a30 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
23a40 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
23a50 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  mt);.}.../*.** M
23a60 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
23a70 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
23a80 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
23a90 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
23aa0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
23ab0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
23ac0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
23ad0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
23ae0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
23af0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
23b00 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
23b10 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
23b20 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
23b30 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
23b40 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
23b50 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
23b60 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
23b70 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
23b80 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
23b90 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
23ba0 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
23bb0 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
23bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
23bd0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
23be0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
23bf0 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
23c00 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
23c10 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
23c20 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
23c30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23c40 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
23c50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23c60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23c70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23c80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23c90 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
23ca0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
23cb0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
23cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23cd0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
23ce0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
23cf0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
23d00 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
23d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23d20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
23d30 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
23d40 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
23d50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a  gno, &pNewPage,.
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23d70 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
23d80 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
23d90 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
23da0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
23db0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
23dc0 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
23dd0 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
23de0 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
23df0 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
23e00 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
23e10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
23e20 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
23e30 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
23e40 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
23e50 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
23e60 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
23e70 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65  ll<1 || pNewPage
23e80 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
23e90 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65  apPage[i]->intKe
23ea0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
23eb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
23ec0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
23ed0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23ee0 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65  #if 0./*.** Page
23ef0 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
23f00 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
23f10 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
23f20 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
23f30 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
23f40 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
23f50 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
23f60 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
23f70 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
23f80 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
23f90 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
23fa0 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
23fb0 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
23fc0 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
23fd0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
23fe0 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
23ff0 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
24000 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
24010 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
24020 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
24030 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
24040 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
24050 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
24060 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
24070 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
24080 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
24090 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
240a0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
240b0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
240c0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
240d0 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
240e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
240f0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
24100 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
24110 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
24120 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
24130 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
24140 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
24150 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
24160 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
24170 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
24180 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
24190 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
241a0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
241b0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
241c0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
241d0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
241e0 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
241f0 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
24200 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
24210 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
24220 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
24230 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
24240 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
24250 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
24260 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
24270 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
24280 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
24290 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
242a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
242b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
242c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
242d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
242e0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
242f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
24300 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24310 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41  e] );..  /* UPDA
24320 54 45 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c  TE: It is actual
24330 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ly possible for 
24340 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65  the condition te
24350 73 74 65 64 20 62 79 20 74 68 65 20 61 73 73 65  sted by the asse
24360 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f  rt.  ** below to
24370 20 62 65 20 75 6e 74 72 75 65 20 69 66 20 74 68   be untrue if th
24380 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24390 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73  is corrupt. This
243a0 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20   can occur if.  
243b0 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61  ** one cursor ha
243c0 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20  s modified page 
243d0 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20  pParent while a 
243e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20  reference to it 
243f0 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79  is held .  ** by
24400 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
24410 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  . Which can only
24420 20 68 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e   happen if a sin
24430 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b  gle page is link
24440 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72  ed.  ** into mor
24450 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
24460 65 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 61  e structure in a
24470 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
24480 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  e.  */.#if 0.  a
24490 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
244a0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
244b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
244c0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
244d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
244e0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
244f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24500 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65  e]->pgno.  );.#e
24510 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73 65 28  ndif.  testcase(
24520 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24530 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
24540 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24550 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
24560 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61   );..  releasePa
24570 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
24580 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
24590 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
245a0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
245b0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
245c0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
245d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
245e0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a  F_ValidOvfl);.}.
245f0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
24600 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
24610 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
24620 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
24630 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
24640 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
24650 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
24660 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
24670 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
24680 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
24690 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
246a0 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
246b0 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
246c0 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
246d0 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
246e0 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
246f0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
24700 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
24710 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
24720 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
24730 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
24740 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
24750 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
24760 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
24770 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
24780 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
24790 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
247a0 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
247b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74  RSOR_INVALID. Ot
247c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72  herwise, the cur
247d0 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
247e0 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
247f0 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  .** cell located
24800 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72   on the root (or
24810 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
24820 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
24830 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73  or state.** is s
24840 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
24850 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
24860 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
24870 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
24880 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
24890 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
248a0 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
248b0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
248c0 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
248d0 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
248e0 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
248f0 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
24900 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
24910 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
24920 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
24930 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
24940 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
24950 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
24960 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
24970 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
24980 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
24990 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
249a0 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
249b0 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
249c0 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
249d0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
249e0 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
249f0 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
24a00 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
24a10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
24a20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
24a30 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
24a40 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
24a50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24a60 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
24a70 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24a80 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24a90 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
24aa0 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
24ab0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
24ac0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
24ad0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
24ae0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
24af0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
24b00 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
24b10 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
24b20 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
24b30 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
24b40 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
24b50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24b60 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
24b70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24b80 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
24b90 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
24ba0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
24bb0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
24bc0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
24bd0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
24be0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
24bf0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77  Page>=0 ){.    w
24c00 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67  hile( pCur->iPag
24c10 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 28  e ) releasePage(
24c20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24c30 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
24c40 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
24c50 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
24c60 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24c70 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
24c80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24c90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
24ca0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
24cb0 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70  InitPage(pCur->p
24cc0 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72  Btree->pBt, pCur
24cd0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
24ce0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20  r->apPage[0],.  
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24d00 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
24d10 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
24d20 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
24d30 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
24d40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
24d60 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
24d70 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
24d80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24d90 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
24da0 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  age = 0;.  }.  p
24db0 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
24dc0 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
24dd0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
24de0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
24df0 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
24e00 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
24e10 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
24e20 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
24e30 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
24e40 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
24e50 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
24e60 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
24e70 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
24e80 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
24e90 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
24ea0 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
24eb0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
24ec0 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
24ed0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
24ee0 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
24ef0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
24f00 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
24f10 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
24f20 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
24f30 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
24f40 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
24f50 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
24f60 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
24f70 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
24f80 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
24f90 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
24fa0 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
24fb0 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
24fc0 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
24fd0 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
24fe0 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
24ff0 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
25000 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
25010 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
25020 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
25030 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
25040 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
25050 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
25060 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
25070 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
25080 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
25090 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
250a0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
250b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
250c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
250d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
250e0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
250f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
25100 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25110 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
25120 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
25130 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
25140 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
25150 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
25160 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
25170 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
25180 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
25190 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
251a0 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
251b0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
251c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
251d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
251e0 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
251f0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
25200 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
25210 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
25220 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
25230 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
25240 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
25250 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
25260 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
25270 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
25280 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
25290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
252a0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
252b0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
252c0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
252d0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
252e0 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
252f0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
25300 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
25310 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
25320 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
25330 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
25340 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
25350 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
25360 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
25370 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
25380 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
25390 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
253a0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
253b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
253c0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
253d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
253e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
253f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25400 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25410 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
25420 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
25430 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
25440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25450 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
25460 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
25470 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25480 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
25490 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
254a0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
254b0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
254c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
254d0 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ge]));.    rc = 
254e0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
254f0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
25500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25510 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
25520 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
25530 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
25540 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
25550 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
25560 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
25570 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
25580 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
25590 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
255a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
255b0 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
255c0 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
255d0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
255e0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
255f0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
25600 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
25610 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
25620 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
25630 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
25640 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
25650 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
25660 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
25670 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
25680 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
25690 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
256a0 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
256b0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
256c0 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
256d0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
256e0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
256f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25700 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
25710 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
25720 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25730 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25750 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25760 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
25770 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
25780 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25790 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
257a0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
257b0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
257c0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
257d0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
257e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
257f0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
25800 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
25810 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
25820 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
25830 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25840 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
25850 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
25860 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
25870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25880 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
25890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
258a0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
258b0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
258c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
258d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
258e0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
258f0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
25900 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
25910 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25920 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
25930 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
25940 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
25950 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
25960 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
25970 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
25980 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
25990 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
259a0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
259b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
259c0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
259d0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
259e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
259f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25a00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25a10 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25a20 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25a30 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
25a40 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
25a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25a60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
25a70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25a80 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
25a90 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25aa0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25ab0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25ac0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25ad0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
25ae0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
25af0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
25b00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25b10 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25b20 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
25b30 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
25b40 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
25b50 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
25b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25b70 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
25b80 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
25b90 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
25ba0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
25bb0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
25bc0 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
25bd0 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
25be0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
25bf0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
25c00 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
25c10 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
25c20 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
25c30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25c40 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
25c50 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
25c60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
25c70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25c80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25c90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25cb0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25cc0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
25cd0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
25ce0 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
25cf0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
25d00 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
25d10 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
25d20 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
25d30 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
25d40 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25d50 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
25d60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
25d70 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
25d80 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
25d90 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
25da0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
25db0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
25dc0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
25dd0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
25de0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
25df0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
25e00 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
25e10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
25e20 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25e30 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
25e40 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
25e50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
25e60 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
25e70 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
25e80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25e90 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
25ea0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
25eb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25ec0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
25ed0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
25ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25ef0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
25f00 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
25f10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25f20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
25f30 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
25f40 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
25f50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
25f60 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
25f70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25f80 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
25f90 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
25fa0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
25fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25fc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25fd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
25fe0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25ff0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
26000 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
26010 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26030 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
26040 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
26050 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26060 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
26070 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
26080 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
26090 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
260a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
260b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
260c0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
260d0 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
260e0 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
260f0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
26100 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
26110 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
26120 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
26130 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
26140 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
26150 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
26160 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
26170 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
26180 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
26190 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
261a0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
261b0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
261c0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
261d0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
261e0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
261f0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
26200 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
26210 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
26220 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
26230 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
26240 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
26250 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
26260 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
26270 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
26280 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
26290 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
262a0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
262b0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
262c0 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
262d0 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
262e0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
262f0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
26300 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
26310 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
26320 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
26330 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
26340 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
26350 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
26360 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
26370 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
26380 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
26390 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
263a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
263b0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
263c0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
263d0 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
263e0 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
26410 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
26420 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
26430 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
26440 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
26450 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
26460 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
26470 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
26480 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
26490 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
264a0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
264b0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
264c0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
264d0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
264e0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
264f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
26500 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
26510 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
26520 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
26530 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
26540 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
26550 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
26560 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
26570 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
26580 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
26590 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
265a0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
265b0 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
265c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
265d0 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
265e0 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
265f0 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
26600 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
26610 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
26620 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
26630 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
26640 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
26650 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
26660 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
26670 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
26680 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
26690 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
266a0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
266b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
266c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
266d0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
266e0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
266f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
26700 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
26710 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
26720 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
26730 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
26740 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
26750 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
26760 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
26770 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
26780 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
26790 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
267a0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
267b0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
267c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
267d0 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
267e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
267f0 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
26800 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
26810 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
26820 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
26830 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
26840 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
26850 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
26860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26870 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75    }.    if( (pCu
26880 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
26890 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26  CF_AtLast)!=0 &&
268a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
268b0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
268c0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
268d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
268e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
268f0 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
26900 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
26910 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
26920 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
26930 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
26940 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
26950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
26960 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
26970 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
26980 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
26990 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
269a0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
269b0 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
269c0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
269d0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
269e0 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
269f0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
26a00 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
26a10 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
26a20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
26a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
26a40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
26a50 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
26a60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26a70 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
26a80 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
26a90 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
26aa0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26ab0 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
26ac0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
26ad0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
26ae0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
26af0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26b00 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
26b10 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
26b20 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
26b30 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
26b40 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
26b50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
26b60 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
26b70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
26b80 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
26b90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26ba0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
26bb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
26bc0 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
26bd0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
26be0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
26bf0 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50  r, idx, c;.    P
26c00 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
26c10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
26c20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26c30 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
26c40 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
26c70 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
26c80 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
26c90 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
26ca0 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
26cb0 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
26cc0 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
26cd0 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
26ce0 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
26cf0 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
26d00 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
26d10 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
26d20 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
26d30 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
26d40 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
26d50 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
26d60 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
26d70 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
26d80 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
26d90 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
26da0 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
26db0 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
26dc0 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
26dd0 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
26de0 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
26df0 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
26e00 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
26e10 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
26e20 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
26e30 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
26e40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
26e50 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
26e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
26e70 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
26e80 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
26e90 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
26ea0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
26eb0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  1;.    assert( b
26ec0 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62  iasRight==0 || b
26ed0 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20  iasRight==1 );. 
26ee0 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31     idx = upr>>(1
26ef0 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20  -biasRight); /* 
26f00 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20  idx = biasRight 
26f10 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72  ? upr : (lwr+upr
26f20 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72  )/2; */.    pCur
26f30 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26f40 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
26f50 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64  .    if( xRecord
26f60 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
26f70 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
26f80 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
26f90 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
26fa0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
26fb0 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
26fc0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
26fd0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
26fe0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
26ff0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
27000 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
27010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27020 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
27030 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
27040 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27050 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
27060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27070 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
27080 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
27090 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
270a0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
270b0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
270c0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
270d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
270e0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
270f0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
27100 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
27110 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
27120 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
27130 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
27140 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
27150 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
27160 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27170 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27180 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
27190 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
271a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
271b0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
271c0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
271d0 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
271e0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
271f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27200 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
27210 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
27220 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
27230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27240 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
27250 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
27260 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
27270 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27280 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
27290 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
272a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
272b0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
272c0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
272d0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
272e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
272f0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
27300 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
27310 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
27320 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
27330 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
27340 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
27350 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
27360 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
27370 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
27380 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
27390 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
273a0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20  childPtrSize;.. 
273b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
273c0 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
273d0 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
273e0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
273f0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
27400 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
27410 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
27420 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
27430 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
27440 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
27450 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
27460 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
27470 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
27480 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
27490 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
274a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
274b0 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
274c0 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
274d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
274e0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
274f0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
27500 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
27510 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
27520 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
27530 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
27540 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
27550 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
27560 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
27570 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
27580 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
27590 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
275a0 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
275b0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
275c0 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
275d0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
275e0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
275f0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
27600 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
27610 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
27620 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
27630 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
27640 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
27650 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
27660 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
27670 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
27680 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
27690 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
276a0 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
276b0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
276c0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
276d0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
276e0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
276f0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
27700 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27710 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
27720 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
27730 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
27740 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
27750 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
27760 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
27770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
27780 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
27790 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
277a0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
277b0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
277c0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
277d0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
277e0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
277f0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
27800 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
27810 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
27820 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
27830 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
27840 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
27850 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
27860 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
27870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27880 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
27890 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
278a0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
278b0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
278c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
278d0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
278e0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
278f0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
27900 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
27910 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
27920 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
27930 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
27940 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
27950 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
27960 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
27970 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
27980 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
27990 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
279a0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
279b0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
279c0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
279d0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
279e0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
279f0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
27a00 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
27a10 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
27a20 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
27a30 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
27a40 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
27a50 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
27a60 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
27a70 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
27a80 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
27a90 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
27aa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27ab0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
27ac0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
27ad0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
27ae0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
27af0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27b00 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
27b10 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27b20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
27b30 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
27b40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
27b50 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20  CellKey, 2);.   
27b60 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
27b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27b80 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
27b90 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
27ba0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
27bb0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
27bc0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
27bd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
27be0 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
27bf0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
27c00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27c10 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
27c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
27c30 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
27c40 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
27c50 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
27c60 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
27c70 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
27c80 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
27c90 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
27ca0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
27cb0 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
27cc0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
27cd0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
27ce0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
27cf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
27d00 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
27d10 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
27d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27d30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27d40 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
27d50 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
27d60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27d70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
27d80 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27d90 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27da0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
27db0 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
27dc0 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
27dd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
27de0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
27df0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
27e00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27e10 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
27e20 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
27e30 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
27e40 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
27e50 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
27e60 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
27e70 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
27e80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
27e90 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
27ea0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
27eb0 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
27ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27ed0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
27ee0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
27ef0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
27f00 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
27f10 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
27f20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27f30 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
27f40 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
27f50 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
27f60 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
27f70 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
27f80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27f90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
27fa0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
27fb0 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
27fc0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
27fd0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
27fe0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
27ff0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
28000 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
28010 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
28020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
28030 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
28040 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
28050 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
28060 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
28070 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
28080 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
28090 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
280a0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
280b0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
280c0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
280d0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
280e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
280f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
28100 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
28110 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
28120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28130 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
28140 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
28150 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
28160 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
28170 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
28180 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
28190 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
281a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
281b0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
281c0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
281d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
281e0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
281f0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
28200 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
28210 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
28220 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
28230 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
28240 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
28250 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
28260 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
28270 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
28280 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
28290 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
282a0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
282b0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
282c0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
282d0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
282e0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
282f0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
28300 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
28310 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
28320 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
28330 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
28340 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
28350 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
28360 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
28370 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
28380 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
28390 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
283a0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
283b0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
283c0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
283d0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
283e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
283f0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
28400 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
28410 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
28420 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
28430 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
28440 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
28450 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
28460 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
28470 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
28480 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
28490 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
284a0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
284b0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
284c0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
284d0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
284e0 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
284f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
28500 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
28510 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
28520 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
28530 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
28540 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
28550 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
28560 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
28570 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
28580 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
28590 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
285a0 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
285b0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
285c0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
285d0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
285e0 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
285f0 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
28600 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
28610 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
28620 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
28630 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
28640 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
28650 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
28660 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
28670 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
28680 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
28690 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
286a0 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
286b0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
286c0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
286d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
286e0 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
286f0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
28700 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
28710 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
28720 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
28730 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
28740 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
28750 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
28760 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
28770 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
28780 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
28790 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
287a0 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
287b0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
287c0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
287d0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
287e0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
287f0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
28800 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
28810 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
28820 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28830 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28840 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28850 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
28860 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
28870 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28880 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
28890 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
288a0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
288b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
288c0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
288d0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
288e0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
288f0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
28900 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
28910 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
28920 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28930 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28940 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
28950 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
28960 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
28970 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
28980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28990 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
289a0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
289b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
289c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
289d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
289e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
289f0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
28a00 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
28a10 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
28a20 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
28a30 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
28a40 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
28a50 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
28a60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28a70 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
28a80 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
28a90 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
28aa0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
28ab0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28ac0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
28ad0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
28ae0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
28af0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
28b00 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
28b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28b20 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
28b30 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
28b40 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
28b50 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
28b60 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
28b70 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
28b80 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
28b90 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
28ba0 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
28bb0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
28bc0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
28bd0 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
28be0 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
28bf0 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
28c00 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
28c10 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
28c20 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
28c30 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
28c40 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
28c50 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
28c60 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
28c70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
28c80 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
28c90 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
28ca0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
28cb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
28cc0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
28cd0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
28ce0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
28cf0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
28d00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
28d10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
28d20 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
28d30 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
28d40 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
28d50 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
28d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
28d70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
28d80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28d90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28da0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28db0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
28dc0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
28dd0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
28de0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
28df0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28e00 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
28e10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28e20 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
28e30 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
28e40 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
28e50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
28e70 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
28e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
28eb0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
28ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28ed0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
28ee0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
28ef0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
28f00 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
28f10 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
28f20 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
28f30 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
28f40 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
28f50 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28f60 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28f70 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
28f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
28f90 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
28fa0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
28fb0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
28fc0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
28fd0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
28fe0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
28ff0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
29000 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
29010 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29020 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29030 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
29040 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
29050 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
29060 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
29070 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
29080 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
29090 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
290a0 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  ];.  if( (++pCur
290b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
290c0 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  age])>=pPage->nC
290d0 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
290e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
290f0 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  ge]--;.    retur
29100 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
29110 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69  , pRes);.  }.  i
29120 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
29130 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29140 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
29150 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
29160 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
29170 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
29180 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
29190 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
291a0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
291b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
291c0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
291d0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
291e0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
291f0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
29200 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
29210 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
29220 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
29230 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
29240 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
29250 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
29260 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
29270 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
29280 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
29290 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
292a0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
292b0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
292c0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
292d0 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
292e0 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
292f0 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
29300 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
29310 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
29320 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
29330 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
29340 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 20 68  treePrevious() h
29350 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
29360 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
29370 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
29380 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
29390 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
293a0 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
293b0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
293c0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
293d0 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
293e0 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
293f0 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
29400 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
29410 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
29420 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
29430 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
29440 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
29450 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
29460 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
29470 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
29480 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
29490 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
294a0 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
294b0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
294c0 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
294d0 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
294e0 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
294f0 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
29500 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
29510 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
29520 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
29530 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
29540 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
29550 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
29560 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
29570 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
29580 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
29590 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
295a0 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
295b0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
295c0 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
295d0 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
295e0 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
295f0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
29600 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  btreePrevious(Bt
29610 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29620 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29630 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
29640 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
29650 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
29660 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
29670 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
29680 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
29690 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
296a0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
296b0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
296c0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
296d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
296e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
296f0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
29700 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
29710 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
29720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29730 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
29740 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
29750 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
29760 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
29770 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
29780 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
29790 45 45 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  EEK );.    rc = 
297a0 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
297b0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
297c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
297d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
297e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
297f0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
29800 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
29810 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
29820 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
29830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29840 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
29850 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
29860 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29870 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29880 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
29890 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
298a0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
298b0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
298c0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
298d0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
298e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
298f0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
29900 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
29910 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29920 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
29930 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
29940 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
29950 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
29960 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29970 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
29980 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
29990 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
299a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
299b0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
299c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
299d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
299e0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
299f0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
29a00 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
29a10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29a20 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
29a30 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
29a40 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
29a50 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
29a60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29a70 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
29a80 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
29a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
29aa0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29ab0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
29ac0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
29ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
29ae0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
29af0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
29b00 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
29b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29b20 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
29b30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29b40 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
29b50 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
29b60 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
29b70 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
29b80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29b90 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
29ba0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29bb0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
29bc0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
29bd0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
29be0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
29bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
29c00 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
29c10 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
29c20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
29c30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29c40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29c50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29c60 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
29c70 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
29c80 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
29c90 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
29ca0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29cb0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
29cc0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
29cd0 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
29ce0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29cf0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
29d00 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
29d10 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29d20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75  *pRes = 0;.  pCu
29d30 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
29d40 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
29d50 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
29d60 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
29d70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
29d80 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
29d90 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
29da0 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
29db0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29dc0 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  age]==0.   || pC
29dd0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29de0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
29df0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
29e00 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
29e10 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
29e20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29e30 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
29e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
29e60 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
29e70 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
29e80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
29e90 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
29ea0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
29eb0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29ec0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29ed0 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
29ee0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
29ef0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
29f00 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
29f10 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
29f20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
29f30 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
29f40 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
29f50 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
29f60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29f70 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
29f80 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
29f90 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
29fa0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
29fb0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
29fc0 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
29fd0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
29fe0 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
29ff0 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
2a000 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
2a010 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2a020 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
2a030 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
2a040 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2a050 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
2a060 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2a070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2a080 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2a090 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2a0a0 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2a0b0 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2a0c0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2a0d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2a0e0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2a0f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2a100 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2a110 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2a120 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2a130 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2a140 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2a150 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2a160 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2a170 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2a180 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2a190 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2a1a0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2a1b0 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2a1c0 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2a1d0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2a1e0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2a1f0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2a200 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2a210 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2a220 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2a230 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2a240 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2a250 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2a260 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2a270 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2a280 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2a290 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2a2a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2a2b0 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2a2c0 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2a2d0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2a2e0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2a2f0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2a300 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2a310 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2a320 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2a330 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2a340 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2a350 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2a360 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2a370 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2a380 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2a390 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2a3a0 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2a3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2a3c0 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2a3d0 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2a3e0 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2a3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2a400 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2a410 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2a420 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2a430 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2a440 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2a450 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2a460 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2a470 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2a480 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2a490 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2a4a0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2a4b0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2a4c0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2a4d0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2a4e0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2a4f0 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2a500 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2a510 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a520 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2a530 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a540 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2a550 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2a560 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2a570 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2a580 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2a590 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2a5a0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2a5b0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2a5c0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2a5d0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
2a5e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a5f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2a600 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2a610 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2a620 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2a630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a640 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2a650 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2a660 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2a670 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2a680 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2a690 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2a6a0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2a6b0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2a6c0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2a6d0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2a6e0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
2a6f0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
2a700 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2a710 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2a720 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2a730 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2a740 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2a750 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2a760 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2a770 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2a780 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2a790 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2a7a0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2a7b0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2a7c0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2a7d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a7e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2a7f0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2a800 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2a810 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2a820 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2a830 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2a840 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2a850 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2a860 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2a870 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2a880 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2a890 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2a8a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2a8b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2a8c0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2a8d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2a8e0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2a8f0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2a900 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2a910 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2a920 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2a930 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2a940 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2a950 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2a960 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2a970 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2a980 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2a990 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2a9a0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2a9b0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2a9c0 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2a9d0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2a9e0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2a9f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2aa00 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2aa10 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2aa20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2aa30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2aa40 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2aa50 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2aa60 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2aa70 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2aa80 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2aa90 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2aaa0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2aab0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2aac0 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2aad0 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2aae0 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2aaf0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2ab00 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2ab10 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2ab20 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2ab30 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2ab40 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2ab50 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2ab60 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2ab70 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2ab80 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2ab90 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2aba0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2abb0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2abc0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
2abd0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2abe0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2abf0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
2ac00 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
2ac10 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2ac20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2ac30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ac40 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2ac50 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2ac60 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2ac70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2ac80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2ac90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2aca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2acb0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2acc0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2acd0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2ace0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2acf0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
2ad00 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
2ad10 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2ad20 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
2ad30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2ad40 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
2ad50 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
2ad60 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20  aData!=0 );..   
2ad70 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2ad80 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2ad90 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76  ]); /* # of leav
2ada0 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b  es on this trunk
2adb0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2adc0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
2add0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
2ade0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
2adf0 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
2ae00 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
2ae10 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
2ae20 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
2ae30 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
2ae40 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
2ae50 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
2ae60 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
2ae70 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
2ae80 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2ae90 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
2aea0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2aeb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2aec0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2aed0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2aee0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2aef0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2af00 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2af10 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
2af20 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2af30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2af40 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2af50 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2af60 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
2af70 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2af80 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2af90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2afa0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2afb0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2afc0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2afd0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2afe0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2aff0 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
2b000 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
2b010 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
2b020 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
2b030 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
2b040 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
2b050 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b060 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b070 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
2b080 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b090 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2b0a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2b0b0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
2b0c0 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
2b0d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
2b0e0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
2b0f0 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
2b100 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2b110 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
2b120 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2b130 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
2b140 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
2b150 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
2b160 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2b170 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
2b180 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2b190 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
2b1a0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2b1b0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2b1c0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
2b1d0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2b1e0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
2b1f0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2b200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b210 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2b220 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b230 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2b240 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b250 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b270 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
2b280 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2b290 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2b2a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b2b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2b2c0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b2d0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2b2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b2f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b300 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2b310 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2b320 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b350 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b360 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2b370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b380 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
2b390 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2b3a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b3b0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2b3c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2b3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2b3e0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2b3f0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2b400 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
2b410 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
2b420 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
2b430 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
2b440 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
2b450 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
2b460 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
2b470 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
2b480 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
2b490 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
2b4a0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
2b4b0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
2b4c0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
2b4d0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2b4e0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
2b4f0 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
2b500 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
2b510 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b520 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2b530 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2b540 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b550 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2b560 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b570 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
2b580 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2b590 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2b5a0 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
2b5b0 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
2b5c0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
2b5d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b5e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2b5f0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2b600 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2b610 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
2b620 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b630 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
2b640 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b670 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b680 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2b690 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b6a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b6b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b6c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2b6d0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
2b6e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2b6f0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2b700 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
2b710 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
2b720 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
2b730 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2b740 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
2b750 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
2b760 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
2b770 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2b780 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
2b790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2b7a0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2b7b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b7c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b7d0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
2b7e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2b7f0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2b800 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2b810 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
2b820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2b830 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2b840 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b850 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2b860 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2b870 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b890 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b8a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2b8b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b8c0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
2b8d0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2b8e0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2b8f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b900 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
2b910 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2b920 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2b930 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2b940 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2b950 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2b960 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2b970 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
2b980 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
2b990 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
2b9a0 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
2b9b0 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
2b9c0 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
2b9d0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
2b9e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
2b9f0 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
2ba00 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
2ba10 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
2ba20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
2ba30 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2ba40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2ba50 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ba60 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LE ){.         
2ba70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b     for(i=0; i<k;
2ba80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2ba90 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
2baa0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2bab0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *4]);.          
2bac0 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e      if( iPage<=n
2bad0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
2bae0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2baf0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2bb00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bb10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2bb20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bb30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bb40 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
2bb50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2bb60 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
2bb70 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2bb80 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
2bb90 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2bba0 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
2bbb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2bbc0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
2bbd0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2bbe0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2bbf0 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bc10 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
2bc20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2bc30 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2bc40 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
2bc50 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2bc60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2bc70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bc80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bc90 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2bca0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2bcb0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2bcc0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2bcd0 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
2bce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2bcf0 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2bd00 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
2bd10 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
2bd20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2bd30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2bd40 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2bd50 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2bd60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bd70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2bd80 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2bd90 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
2bda0 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2bdb0 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
2bdc0 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
2bdd0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2bde0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2bdf0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2be00 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
2be10 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2be20 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
2be30 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2be40 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
2be50 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
2be60 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
2be70 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
2be80 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
2be90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2bea0 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
2beb0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
2bec0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
2bed0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2bee0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bef0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2bf00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bf10 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
2bf20 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2bf30 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
2bf40 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
2bf50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
2bf60 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2bf70 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
2bf80 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2bf90 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2bfa0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
2bfb0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
2bfc0 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
2bfd0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
2bfe0 42 74 2c 20 2a 70 50 67 6e 6f 29 20 3f 20 50 41  Bt, *pPgno) ? PA
2bff0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
2c000 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
2c010 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2c020 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
2c030 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
2c040 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
2c050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2c070 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c080 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2c090 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2c0a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2c0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c0c0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2c0d0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c0f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c100 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2c110 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2c120 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
2c130 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2c140 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
2c150 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
2c160 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
2c170 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
2c180 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
2c190 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
2c1a0 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
2c1b0 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
2c1c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2c1d0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
2c1e0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
2c1f0 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
2c200 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
2c210 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
2c220 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
2c230 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
2c240 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
2c250 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
2c260 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
2c270 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2c280 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
2c290 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
2c2a0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
2c2b0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
2c2c0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
2c2d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
2c2e0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
2c2f0 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
2c300 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
2c310 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
2c320 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
2c330 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
2c340 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
2c350 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
2c360 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
2c370 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
2c380 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
2c390 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
2c3a0 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
2c3b0 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
2c3c0 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
2c3d0 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
2c3e0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2c3f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2c400 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
2c410 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
2c420 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2c430 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2c440 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
2c450 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
2c460 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
2c470 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
2c480 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
2c490 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
2c4a0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2c4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2c4c0 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
2c4d0 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
2c4e0 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
2c4f0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
2c500 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2c510 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
2c520 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
2c530 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
2c540 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
2c550 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2c560 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
2c570 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2c580 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
2c590 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
2c5a0 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
2c5b0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
2c5c0 72 75 6e 63 61 74 65 29 29 20 3f 20 50 41 47 45  runcate)) ? PAGE
2c5d0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
2c5e0 3a 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  : 0;..    rc = s
2c5f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c600 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
2c610 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2c620 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2c630 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
2c640 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
2c650 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
2c660 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
2c670 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
2c680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c690 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2c6a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2c6b0 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
2c6c0 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
2c6d0 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
2c6e0 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
2c6f0 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
2c700 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
2c710 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
2c720 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
2c730 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2c740 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
2c750 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
2c760 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
2c770 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
2c780 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
2c790 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
2c7a0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
2c7b0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
2c7c0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
2c7d0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
2c7e0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2c7f0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
2c800 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
2c810 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
2c820 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
2c830 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
2c840 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2c850 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
2c860 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2c870 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
2c880 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f  age, &pPg, bNoCo
2c890 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ntent);.      if
2c8a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c8b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2c8c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c8d0 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
2c8e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2c8f0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
2c900 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2c910 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2c920 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
2c930 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2c940 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
2c950 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2c960 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
2c970 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2c980 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
2c990 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
2c9a0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
2c9b0 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
2c9c0 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
2c9d0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
2c9e0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2c9f0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2ca00 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2ca10 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2ca20 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74   ppPage, bNoCont
2ca30 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
2ca40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2ca50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ca60 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
2ca70 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
2ca80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ca90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
2caa0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
2cab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
2cac0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2cad0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
2cae0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
2caf0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2cb00 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
2cb10 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2cb20 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
2cb30 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
2cb40 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
2cb50 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
2cb60 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
2cb70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cb80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
2cb90 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
2cba0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2cbb0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
2cbc0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2cbd0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
2cbe0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
2cbf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2cc00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2cc10 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
2cc20 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
2cc30 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
2cc40 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2cc50 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2cc60 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2cc70 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
2cc80 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
2cc90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2cca0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2ccb0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2ccc0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
2ccd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2cce0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
2ccf0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
2cd00 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
2cd10 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2cd20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
2cd30 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
2cd40 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2cd50 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2cd60 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2cd70 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
2cd80 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
2cd90 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
2cda0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
2cdb0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
2cdc0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
2cdd0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
2cde0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
2cdf0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
2ce00 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
2ce10 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2ce20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
2ce30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
2ce40 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
2ce50 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
2ce60 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2ce70 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
2ce80 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
2ce90 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
2cea0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2ceb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2cec0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
2ced0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
2cee0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
2cef0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
2cf00 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
2cf30 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
2cf40 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2cf70 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
2cf80 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
2cf90 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
2cfa0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
2cfb0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
2cfc0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2cfd0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2cfe0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2cff0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2d000 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
2d010 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
2d020 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d040 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2d050 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2d060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2d080 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2d090 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2d0a0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2d0b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d0c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2d0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
2d0e0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2d0f0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2d100 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2d110 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
2d120 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2d130 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2d140 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2d150 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2d160 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2d170 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2d180 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2d190 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2d1a0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2d1b0 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2d1c0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2d1d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d1e0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2d1f0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2d200 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2d210 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2d220 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2d230 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2d240 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2d250 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2d260 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2d270 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2d280 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2d290 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2d2a0 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2d2b0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2d2c0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2d2d0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2d2e0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2d2f0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2d300 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2d310 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2d320 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2d330 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2d340 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
2d350 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
2d360 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
2d370 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2d380 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
2d390 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
2d3a0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2d3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
2d3c0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
2d3d0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
2d3e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
2d3f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2d400 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2d410 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
2d420 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2d430 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2d440 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
2d450 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
2d460 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
2d470 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2d480 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2d490 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
2d4a0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
2d4b0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
2d4c0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2d4d0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
2d4e0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
2d4f0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
2d500 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
2d510 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
2d520 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
2d530 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
2d540 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
2d550 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
2d560 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
2d570 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
2d580 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2d590 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
2d5a0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2d5b0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
2d5c0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2d5d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2d5e0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
2d5f0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
2d600 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2d610 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
2d620 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
2d630 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
2d640 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
2d650 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
2d660 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
2d670 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
2d680 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
2d690 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
2d6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d6b0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2d6c0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
2d6d0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
2d6e0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
2d6f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2d700 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
2d710 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2d720 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2d730 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2d740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2d760 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2d770 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
2d780 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2d790 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
2d7a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2d7b0 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
2d7c0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
2d7d0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
2d7e0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
2d7f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d800 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d810 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2d820 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2d830 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
2d840 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2d850 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
2d860 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2d870 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
2d880 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
2d890 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
2d8a0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2d8b0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2d8c0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
2d8d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
2d8e0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
2d8f0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
2d900 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
2d910 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
2d920 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2d930 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
2d940 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2d950 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2d960 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2d970 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2d980 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2d990 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2d9a0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2d9b0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2d9c0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2d9d0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2d9e0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2d9f0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2da00 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2da10 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2da20 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2da30 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2da40 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2da50 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2da60 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2da70 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2da80 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2da90 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2daa0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2dab0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2dac0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2dad0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2dae0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2daf0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2db00 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2db10 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2db20 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2db30 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2db40 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2db50 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2db60 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2db70 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2db80 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2db90 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2dba0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2dbb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2dbc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2dbd0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2dbe0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2dbf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dc00 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2dc10 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2dc20 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2dc30 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2dc40 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2dc50 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2dc60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2dc70 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
2dc80 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2dc90 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
2dca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2dcb0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2dcc0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2dcd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2dce0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2dcf0 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
2dd00 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
2dd10 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
2dd20 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2dd30 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2dd40 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2dd50 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2dd60 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2dd70 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2dd80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2dd90 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2dda0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2ddb0 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2ddc0 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2ddd0 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2dde0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2ddf0 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2de00 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2de10 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2de20 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2de30 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2de40 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2de50 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2de60 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2de70 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2de80 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2de90 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2dea0 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2deb0 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2dec0 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2ded0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2dee0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2def0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2df00 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2df10 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2df20 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2df30 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
2df40 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2df50 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
2df60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2df70 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2df80 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
2df90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
2dfa0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2dfb0 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
2dfc0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
2dfd0 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
2dfe0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2dff0 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
2e000 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2e010 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
2e020 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2e030 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
2e040 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
2e050 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2e060 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
2e070 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
2e080 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2e090 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2e0a0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
2e0b0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e0c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2e0d0 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
2e0e0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2e0f0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
2e100 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
2e110 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
2e120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e130 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
2e140 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
2e150 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
2e160 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
2e170 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
2e180 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2e190 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2e1a0 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
2e1b0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
2e1c0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2e1d0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
2e1e0 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
2e1f0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2e200 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2e210 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2e220 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2e230 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2e240 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2e250 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2e260 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e270 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2e280 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2e290 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2e2a0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2e2b0 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
2e2c0 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
2e2d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e2e0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
2e2f0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
2e300 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2e310 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2e320 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
2e330 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
2e340 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
2e350 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
2e360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e370 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
2e380 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
2e390 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
2e3a0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
2e3b0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
2e3c0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2e3d0 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
2e3e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2e3f0 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
2e400 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2e410 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
2e420 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
2e430 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
2e440 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
2e450 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
2e460 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
2e470 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
2e480 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
2e490 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
2e4a0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
2e4b0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2e4c0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
2e4d0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
2e4e0 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
2e4f0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
2e500 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
2e510 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
2e520 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
2e530 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
2e540 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2e550 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
2e560 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
2e570 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
2e580 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
2e590 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
2e5a0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2e5b0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
2e5c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2e5d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2e5e0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
2e5f0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2e600 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
2e610 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
2e620 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
2e630 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2e640 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2e650 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
2e660 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
2e670 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
2e680 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
2e690 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2e6a0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
2e6b0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
2e6c0 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
2e6d0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
2e6e0 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
2e6f0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
2e700 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2e710 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
2e720 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2e730 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
2e740 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
2e750 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
2e760 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
2e770 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
2e780 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2e790 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2e7a0 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
2e7b0 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
2e7c0 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
2e7d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
2e7e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
2e7f0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2e800 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
2e810 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
2e820 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
2e830 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
2e840 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
2e850 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
2e860 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
2e870 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
2e880 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
2e890 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
2e8a0 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
2e8b0 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
2e8c0 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
2e8d0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
2e8e0 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
2e8f0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
2e900 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
2e910 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
2e920 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
2e930 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
2e940 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2e950 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2e960 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2e970 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2e980 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
2e990 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
2e9a0 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
2e9b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e9c0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
2e9d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2e9e0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
2e9f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
2ea00 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
2ea10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2ea20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2ea30 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
2ea40 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
2ea50 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
2ea60 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
2ea70 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
2ea80 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
2ea90 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
2eaa0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
2eab0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
2eac0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
2ead0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
2eae0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
2eaf0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
2eb00 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2eb10 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
2eb20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
2eb30 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
2eb40 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
2eb50 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
2eb60 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
2eb70 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
2eb80 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
2eb90 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
2eba0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
2ebb0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
2ebc0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
2ebd0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
2ebe0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
2ebf0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
2ec00 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
2ec10 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
2ec20 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
2ec30 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2ec40 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2ec50 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2ec60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2ec70 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2ec80 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
2ec90 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2eca0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
2ecb0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
2ecc0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
2ecd0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2ece0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2ecf0 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
2ed00 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2ed10 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
2ed20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
2ed30 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed50 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
2ed60 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
2ed70 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
2ed80 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2ed90 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2eda0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
2edb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
2edc0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
2edd0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
2ede0 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
2edf0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
2ee00 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2ee10 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
2ee20 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
2ee30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2ee40 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
2ee50 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
2ee60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2ee70 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2ee80 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
2ee90 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
2eea0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
2eeb0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
2eec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2eed0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2eee0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
2eef0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
2ef00 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
2ef10 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
2ef20 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
2ef30 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
2ef40 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
2ef50 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
2ef60 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
2ef70 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
2ef80 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2ef90 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
2efa0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2efb0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2efc0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2efd0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2efe0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2eff0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2f000 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
2f010 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
2f020 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2f030 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2f040 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
2f050 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
2f060 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
2f070 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
2f080 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
2f090 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
2f0a0 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
2f0b0 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
2f0c0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2f0d0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
2f0e0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
2f0f0 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
2f100 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2f110 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2f120 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
2f130 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
2f140 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2f150 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
2f160 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
2f170 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
2f180 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
2f190 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
2f1a0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
2f1b0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
2f1c0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
2f1d0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2f1e0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2f1f0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2f200 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
2f210 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
2f220 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
2f230 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
2f240 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
2f250 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2f260 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2f270 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
2f280 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
2f290 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
2f2a0 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
2f2b0 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
2f2c0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
2f2d0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
2f2e0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
2f2f0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
2f300 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
2f310 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2f320 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
2f330 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
2f340 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
2f350 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
2f360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2f370 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
2f380 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
2f390 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
2f3a0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2f3b0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
2f3c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2f3d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2f3e0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
2f3f0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
2f400 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
2f410 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
2f420 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2f430 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
2f440 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
2f450 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2f460 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2f470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2f480 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2f490 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
2f4a0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
2f4b0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
2f4c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f4d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2f4e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2f4f0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2f500 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
2f510 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
2f520 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
2f530 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
2f540 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
2f550 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
2f560 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2f570 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
2f580 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
2f590 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2f5a0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
2f5b0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
2f5c0 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
2f5d0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
2f5e0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
2f5f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
2f600 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
2f610 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
2f620 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
2f630 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2f640 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
2f650 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
2f660 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
2f670 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
2f680 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
2f690 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
2f6a0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
2f6b0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
2f6c0 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
2f6d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
2f6e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2f6f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2f700 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2f710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
2f720 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
2f730 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
2f740 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
2f750 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
2f760 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2f770 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
2f780 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
2f790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2f7b0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
2f7c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f7d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2f7e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f7f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f800 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2f810 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f820 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2f830 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
2f840 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
2f850 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
2f860 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2f870 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
2f880 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
2f890 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
2f8a0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2f8b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
2f8c0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2f8d0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2f8e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2f8f0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2f900 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
2f910 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
2f920 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2f930 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2f940 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2f950 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
2f960 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2f970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2f980 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
2f990 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
2f9a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2f9b0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2f9c0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2f9d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2f9e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2f9f0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
2fa00 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
2fa10 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
2fa20 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2fa30 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
2fa40 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
2fa50 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
2fa60 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
2fa70 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2fa80 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
2fa90 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
2faa0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
2fab0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
2fac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2fad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
2fae0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
2faf0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
2fb00 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
2fb10 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2fb20 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2fb30 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
2fb40 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2fb50 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
2fb60 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2fb70 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2fb80 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2fb90 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2fba0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
2fbb0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2fbc0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2fbd0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
2fbe0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
2fbf0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
2fc00 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2fc10 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
2fc20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
2fc30 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
2fc40 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2fc50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2fc60 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
2fc70 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
2fc80 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2fc90 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2fca0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2fcb0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2fcc0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2fcd0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
2fce0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
2fcf0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
2fd00 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
2fd10 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
2fd20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
2fd30 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
2fd40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fd50 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
2fd60 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
2fd70 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
2fd80 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
2fd90 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
2fda0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
2fdb0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
2fdc0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
2fdd0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
2fde0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2fdf0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2fe00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
2fe10 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2fe20 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
2fe30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2fe40 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
2fe50 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
2fe60 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
2fe70 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
2fe80 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
2fe90 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
2fea0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
2feb0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
2fec0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
2fed0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
2fee0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
2fef0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
2ff00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2ff10 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
2ff20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2ff30 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
2ff40 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
2ff50 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
2ff60 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
2ff70 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
2ff80 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
2ff90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2ffa0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
2ffb0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
2ffc0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
2ffd0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
2ffe0 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
2fff0 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
30000 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
30010 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
30020 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
30030 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
30040 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
30050 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
30060 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
30070 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
30080 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
30090 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
300a0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
300b0 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
300c0 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
300d0 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
300e0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
300f0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
30100 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
30110 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
30120 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
30130 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
30140 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30150 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30160 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
30170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30180 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30190 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
301a0 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
301b0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
301c0 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65  tr = &pPage->aCe
301d0 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20  llIdx[2*idx];.  
301e0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
301f0 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
30200 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
30210 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
30220 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
30230 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
30240 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
30250 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
30260 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
30270 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64  (u32)get2byte(&d
30280 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70  ata[hdr+5]) || p
30290 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
302a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
302b0 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
302c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
302d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
302e0 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
302f0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
30300 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
30310 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
30320 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
30330 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
30340 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
30350 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
30360 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
30370 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
30380 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
30390 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
303a0 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a  Free += 2;.}../*
303b0 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
303c0 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
303d0 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
303e0 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
303f0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
30400 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
30410 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
30420 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
30430 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
30440 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
30450 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
30460 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
30470 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
30480 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
30490 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
304a0 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
304b0 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
304c0 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
304d0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
304e0 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66   in pPage->apOvf
304f0 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
30500 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
30510 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
30520 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
30530 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
30540 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
30550 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
30560 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
30570 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
30580 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
30590 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
305a0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
305b0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
305c0 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
305d0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
305e0 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
305f0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
30600 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
30610 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
30620 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
30630 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
30640 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
30650 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
30660 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
30670 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
30680 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
30690 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
306a0 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
306b0 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
306c0 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
306d0 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
306e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
306f0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
30700 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
30710 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
30720 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30730 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
30740 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
30750 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
30760 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
30770 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
30780 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
30790 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
307a0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
307b0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
307c0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
307d0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
307e0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
307f0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
30800 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
30810 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
30820 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
30830 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
30840 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
30850 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
30860 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
30870 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
30880 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
30890 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
308a0 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
308b0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
308c0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
308d0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
308e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
308f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
30900 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
30910 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
30920 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
30930 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
30940 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
30950 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
30960 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
30970 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
30980 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
30990 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
309a0 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
309b0 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
309c0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
309d0 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
309e0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
309f0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
30a00 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
30a10 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28  .  int nSkip = (
30a20 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b  iChild ? 4 : 0);
30a30 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
30a40 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
30a50 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
30a60 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
30a70 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
30a80 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28  assert( MX_CELL(
30a90 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
30aa0 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  21 );.  assert( 
30ab0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
30ac0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
30ad0 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
30ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30af0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
30b00 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
30b10 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
30b20 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
30b30 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
30b40 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
30b50 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
30b60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
30b70 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
30b80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
30b90 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
30ba0 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
30bb0 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
30bc0 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
30bd0 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
30be0 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
30bf0 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
30c00 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
30c10 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
30c20 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
30c30 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
30c40 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
30c50 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
30c60 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
30c70 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
30c80 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
30c90 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
30ca0 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
30cb0 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
30cc0 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
30cd0 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
30ce0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
30cf0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
30d00 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
30d10 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
30d20 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
30d30 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
30d40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
30d50 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
30d60 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
30d70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
30d80 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
30d90 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
30da0 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
30db0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
30dc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
30dd0 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
30de0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
30df0 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
30e00 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
30e10 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
30e20 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
30e30 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
30e40 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
30e50 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  apOvfl[0])) );. 
30e60 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
30e70 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
30e80 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
30e90 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  ] = (u16)i;.  }e
30ea0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
30eb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30ec0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
30ed0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
30ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30ef0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
30f00 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
30f10 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
30f20 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
30f30 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
30f40 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
30f50 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
30f60 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
30f70 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
30f80 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
30f90 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
30fa0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
30fb0 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
30fc0 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
30fd0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
30fe0 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
30ff0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
31000 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
31010 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
31020 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
31030 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
31040 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
31050 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
31060 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
31070 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
31080 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
31090 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
310a0 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
310b0 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
310c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
310d0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
310e0 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
310f0 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
31100 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
31110 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
31120 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
31130 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
31140 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
31150 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31160 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
31170 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  d);.    }.    me
31180 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b  mmove(&data[ins+
31190 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20  2], &data[ins], 
311a0 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75  end-ins);.    pu
311b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
311c0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
311d0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
311e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
311f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
31200 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31210 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31220 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
31230 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31240 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
31250 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
31260 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
31270 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
31280 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
31290 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
312a0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
312b0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
312c0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
312d0 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
312e0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
312f0 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
31300 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
31310 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
31320 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
31330 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
31340 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
31350 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
31360 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
31370 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
31380 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
31390 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
313a0 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
313b0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
313c0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
313d0 73 73 65 6d 62 6c 65 64 20 2a 2f 0a 20 20 69 6e  ssembled */.  in
313e0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
313f0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
31400 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
31410 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
31420 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
31430 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
31440 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
31450 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
31460 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
31470 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
31480 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
31490 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
314a0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
314b0 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
314c0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
314d0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
314e0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
314f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
31500 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
31510 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
31520 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
31530 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
31540 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
31550 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
31560 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
31570 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
31580 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
31590 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
315a0 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
315b0 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
315c0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
315d0 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
315e0 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
315f0 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
31600 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
31610 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
31620 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
31630 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
31640 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
31650 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
31660 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f   nCell<=(int)MX_
31670 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
31680 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
31690 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
316a0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29  ge->pBt)<=10921)
316b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
316c0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
316d0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
316e0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
316f0 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
31700 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
31710 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
31720 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
31730 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
31740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
31750 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
31760 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
31770 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
31780 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
31790 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
317a0 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55  .  cellbody = nU
317b0 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e  sable;.  for(i=n
317c0 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Cell-1; i>=0; i-
317d0 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d  -){.    u16 sz =
317e0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70   aSize[i];.    p
317f0 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
31800 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a    cellbody -= sz
31810 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
31820 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
31830 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
31840 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
31850 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
31860 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
31870 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
31880 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
31890 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
318a0 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
318b0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
318c0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
318d0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
318e0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
318f0 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
31900 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
31910 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
31920 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
31930 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
31940 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
31950 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
31960 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
31970 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
31980 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
31990 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
319a0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
319b0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
319c0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
319d0 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
319e0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
319f0 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
31a00 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
31a10 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
31a20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
31a30 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
31a40 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
31a50 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
31a60 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
31a70 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
31a80 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
31a90 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
31aa0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
31ab0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
31ac0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
31ad0 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
31ae0 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
31af0 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
31b00 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
31b10 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
31b20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
31b30 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
31b40 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
31b50 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
31b60 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
31b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31b80 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
31b90 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
31ba0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
31bb0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
31bc0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
31bd0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
31be0 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
31bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31c00 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
31c10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
31c20 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
31c30 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
31c40 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
31c50 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
31c60 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
31c70 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
31c80 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
31c90 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
31ca0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
31cb0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
31cc0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
31cd0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
31ce0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
31cf0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
31d00 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
31d10 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
31d20 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
31d30 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
31d40 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
31d50 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
31d60 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
31d70 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
31d80 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
31d90 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
31da0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
31db0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
31dc0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
31dd0 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
31de0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
31df0 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
31e00 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
31e10 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
31e20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
31e30 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
31e40 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
31e50 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
31e60 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
31e70 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
31e80 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
31e90 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
31ea0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
31eb0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
31ec0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
31ed0 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
31ee0 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
31ef0 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
31f00 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
31f10 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
31f20 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
31f30 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
31f40 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
31f50 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
31f60 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
31f70 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
31f80 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
31f90 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
31fa0 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
31fb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
31fc0 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
31fd0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
31fe0 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
31ff0 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
32000 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
32010 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
32020 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
32030 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
32040 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
32050 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
32060 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
32070 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
32080 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
32090 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
320a0 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
320b0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
320c0 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
320d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
32100 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
32110 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
32120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32130 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
32140 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
32150 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32170 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
32180 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
32190 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
321a0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
321b0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
321c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
321d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
321e0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
321f0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
32200 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
32210 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
32220 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
32230 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
32240 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
32250 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
32260 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
32270 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  >nCell==0 ) retu
32280 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
32290 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
322a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
322b0 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
322c0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
322d0 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
322e0 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
322f0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32300 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
32310 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
32320 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
32330 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
32340 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
32350 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
32360 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
32370 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
32380 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
32390 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
323a0 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
323b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
323c0 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
323d0 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
323e0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
323f0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  age->apOvfl[0];.
32400 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
32410 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
32420 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
32430 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
32440 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
32450 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32460 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
32470 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32480 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
32490 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
324a0 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
324b0 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
324c0 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
324d0 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
324e0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
324f0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
32500 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
32510 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
32520 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
32530 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
32540 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
32550 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
32560 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
32570 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
32580 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
32590 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
325a0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
325b0 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
325c0 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
325d0 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
325e0 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
325f0 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
32600 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
32610 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
32620 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
32630 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
32640 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
32650 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
32660 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
32670 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
32680 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32690 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
326a0 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
326b0 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
326c0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
326d0 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
326e0 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
326f0 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
32700 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
32710 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
32720 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
32730 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
32740 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
32750 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
32760 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
32770 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
32780 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
32790 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
327a0 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
327b0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
327c0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   pCell, &rc);.  
327d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
327e0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64     /* Create a d
327f0 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69  ivider cell to i
32800 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65  nsert into pPare
32810 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20  nt. The divider 
32820 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  cell.    ** cons
32830 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65  ists of a 4-byte
32840 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68   page number (th
32850 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
32860 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20   pPage) and.    
32870 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  ** a variable le
32880 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28  ngth key value (
32890 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68  which must be th
328a0 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
328b0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  the.    ** large
328c0 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29  st key on pPage)
328d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
328e0 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  To find the larg
328f0 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e  est key value on
32900 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69   pPage, first fi
32910 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  nd the right-mos
32920 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  t .    ** cell o
32930 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72  n pPage. The fir
32940 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
32950 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74   this cell are t
32960 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  he .    ** recor
32970 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69  d-length (a vari
32980 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
32990 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62  ger at most 32-b
329a0 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20  its in size).   
329b0 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20   ** and the key 
329c0 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c  value (a variabl
329d0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
329e0 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76  , may have any v
329f0 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68  alue)..    ** Th
32a00 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77  e first of the w
32a10 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20  hile(...) loops 
32a20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72  below skips over
32a30 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67   the record-leng
32a40 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e  th.    ** field.
32a50 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c   The second whil
32a60 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69  e(...) loop copi
32a70 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  es the key value
32a80 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
32a90 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69   cell on pPage i
32aa0 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62  nto the pSpace b
32ab0 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  uffer..    */.  
32ac0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
32ad0 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
32ae0 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70  >nCell-1);.    p
32af0 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
32b00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28  ;.    while( (*(
32b10 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26  pCell++)&0x80) &
32b20 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
32b30 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
32b40 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
32b50 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d  e( ((*(pOut++) =
32b60 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38   *(pCell++))&0x8
32b70 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
32b80 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  p );..    /* Ins
32b90 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  ert the new divi
32ba0 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50  der cell into pP
32bb0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  arent. */.    in
32bc0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
32bd0 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  , pParent->nCell
32be0 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28  , pSpace, (int)(
32bf0 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20  pOut-pSpace),.  
32c00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
32c10 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63  pPage->pgno, &rc
32c20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
32c30 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
32c40 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e  ointer of pParen
32c50 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
32c60 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
32c70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
32c80 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
32c90 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
32ca0 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
32cb0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
32cc0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
32cd0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
32ce0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
32cf0 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
32d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
32d10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
32d20 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
32d30 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54  /..#if 0./*.** T
32d40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
32d50 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
32d60 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
32d70 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51   operation of SQ
32d80 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73  Lite..** it is s
32d90 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74  ometimes activat
32da0 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77  ed temporarily w
32db0 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63  hile debugging c
32dc0 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  ode responsible 
32dd0 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20  .** for setting 
32de0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
32df0 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ies..*/.static i
32e00 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  nt ptrmapCheckPa
32e10 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70  ges(MemPage **ap
32e20 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29  Page, int nPage)
32e30 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
32e40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65  for(i=0; i<nPage
32e50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f  ; i++){.    Pgno
32e60 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20   n;.    u8 e;.  
32e70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32e80 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20   = apPage[i];.  
32e90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
32ea0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
32eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
32ec0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20  >isInit );..    
32ed0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65  for(j=0; j<pPage
32ee0 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20  ->nCell; j++){. 
32ef0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
32f00 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b  fo;.      u8 *z;
32f10 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d  .     .      z =
32f20 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
32f30 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65   j);.      btree
32f40 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
32f50 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
32f60 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
32f70 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
32f80 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
32f90 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
32fa0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
32fb0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
32fc0 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
32fd0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
32fe0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
32ff0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
33000 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
33010 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
33020 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
33030 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
33040 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
33050 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
33060 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
33070 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
33080 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
33090 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
330a0 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
330b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
330c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
330d0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
330e0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
330f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
33100 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
33110 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
33120 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
33130 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
33140 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
33150 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
33160 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
33170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
33180 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
33190 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
331a0 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
331b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
331c0 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
331d0 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
331e0 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
331f0 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
33200 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
33210 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
33220 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
33230 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
33240 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
33250 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
33260 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
33270 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
33280 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
33290 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
332a0 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
332b0 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
332c0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
332d0 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
332e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
332f0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
33300 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
33310 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
33320 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
33330 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
33340 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
33350 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
33360 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
33370 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
33380 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f  e.** MemPage.apO
33390 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
333a0 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
333b0 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
333c0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
333d0 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
333e0 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
333f0 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ng btreeInitPage
33400 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
33410 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
33420 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
33430 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
33440 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
33450 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
33460 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
33470 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
33480 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
33490 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
334a0 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
334b0 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
334c0 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
334d0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79  static void copy
334e0 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50  NodeContent(MemP
334f0 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50  age *pFrom, MemP
33500 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70  age *pTo, int *p
33510 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
33520 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
33530 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63      BtShared * c
33540 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
33550 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20  ->pBt;.    u8 * 
33560 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46  const aFrom = pF
33570 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  rom->aData;.    
33580 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d  u8 * const aTo =
33590 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20   pTo->aData;.   
335a0 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
335b0 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
335c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20  Offset;.    int 
335d0 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
335e0 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
335f0 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69   100 : 0);.    i
33600 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69  nt rc;.    int i
33610 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20  Data;.  .  .    
33620 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69  assert( pFrom->i
33630 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73  sInit );.    ass
33640 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65  ert( pFrom->nFre
33650 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20  e>=iToHdr );.   
33660 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
33670 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
33680 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42  r+5]) <= (int)pB
33690 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
336a0 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
336b0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
336c0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
336d0 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
336e0 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74  pTo. */.    iDat
336f0 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
33700 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
33710 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
33720 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
33730 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
33740 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
33750 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
33760 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
33770 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
33780 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
33790 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
337a0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69  .  .    /* Reini
337b0 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
337c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
337d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
337e0 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
337f0 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20     ** match the 
33800 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e  new data. The in
33810 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
33820 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79  pTo can actually
33830 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20   fail under.    
33840 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72  ** fairly obscur
33850 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
33860 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
33870 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69  is a copy of ini
33880 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
33890 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20   page pFrom..   
338a0 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49   */.    pTo->isI
338b0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  nit = 0;.    rc 
338c0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
338d0 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pTo);.    if( rc
338e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
338f0 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
33900 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
33910 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
33920 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
33930 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
33940 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
33950 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
33960 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
33970 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
33980 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
33990 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
339a0 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
339b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
339c0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
339d0 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
339e0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
339f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
33a00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
33a10 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
33a20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
33a30 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
33a40 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
33a50 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
33a60 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
33a70 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
33a80 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
33a90 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
33aa0 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
33ab0 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
33ac0 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
33ad0 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
33ae0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
33af0 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
33b00 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
33b10 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
33b20 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
33b30 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
33b40 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
33b50 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
33b60 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
33b70 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
33b80 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
33b90 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
33ba0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
33bb0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
33bc0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
33bd0 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
33be0 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
33bf0 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
33c00 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
33c10 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
33c20 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
33c30 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
33c40 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
33c50 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
33c60 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
33c70 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
33c80 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
33c90 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
33ca0 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
33cb0 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
33cc0 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
33cd0 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
33ce0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
33cf0 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
33d00 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
33d10 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
33d20 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
33d30 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
33d40 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
33d50 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
33d60 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
33d70 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
33d80 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
33d90 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
33da0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
33db0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
33dc0 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
33dd0 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
33de0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
33df0 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
33e00 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
33e10 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
33e20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
33e30 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
33e40 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
33e50 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
33e60 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
33e70 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
33e80 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
33e90 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
33ea0 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
33eb0 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
33ec0 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
33ed0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
33ee0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
33ef0 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
33f00 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
33f10 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
33f20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
33f30 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
33f40 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
33f50 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
33f60 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
33f70 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
33f80 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
33f90 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
33fa0 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
33fb0 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
33fc0 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
33fd0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
33fe0 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
33ff0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
34000 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
34010 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
34020 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
34030 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
34040 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
34050 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
34060 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
34070 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
34080 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
34090 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
340a0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
340b0 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
340c0 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
340d0 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
340e0 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
340f0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
34100 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
34110 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
34120 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
34130 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
34140 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
34150 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
34160 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
34170 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
34180 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
34190 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
341a0 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
341b0 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
341c0 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
341d0 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
341e0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
341f0 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
34200 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
34210 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
34220 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
34230 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
34240 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
34250 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
34260 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
34270 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
34280 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45  _VER) && _MSC_VE
34290 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66  R >= 1700 && def
342a0 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72  ined(_M_ARM).#pr
342b0 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22  agma optimize(""
342c0 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74  , off).#endif.st
342d0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
342e0 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
342f0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
34300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34310 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
34320 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
34330 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
34340 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
34350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
34360 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
34370 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
34380 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
34390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
343a0 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
343b0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
343c0 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
343d0 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20  .  int isRoot,  
343e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
34400 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
34410 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42  page */.  int bB
34420 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ulk             
34430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
34440 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e if this call i
34450 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b  s part of a bulk
34460 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74   load */.){.  Bt
34470 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
34480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
34490 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
344a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
344b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
344c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
344d0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
344e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
344f0 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
34500 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
34510 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
34520 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
34530 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
34540 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
34550 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
34560 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
34570 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
34580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34590 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
345a0 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
345b0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
345c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
345d0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
345e0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
345f0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
34600 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
34610 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
34620 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
34630 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34640 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
34650 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
34660 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
34670 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
34680 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
34690 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
346a0 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
346b0 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
346c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
346d0 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
346e0 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
346f0 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
34700 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
34710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
34720 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
34730 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
34740 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
34750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34760 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
34770 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
34780 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
34790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
347a0 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
347b0 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
347c0 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
347d0 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
347e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
347f0 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
34800 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
34810 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
34820 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
34830 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
34840 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
34850 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
34860 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
34870 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
34880 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
34890 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
348a0 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
348b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
348c0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
348d0 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
348e0 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
348f0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
34900 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
34910 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
34920 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
34930 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
34940 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
34950 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
34960 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
34970 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
34980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34990 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
349a0 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
349b0 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
349c0 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
349d0 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
349e0 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
349f0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
34a00 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
34a10 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
34a20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
34a30 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
34a40 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
34a50 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
34a60 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
34a70 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
34a80 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
34a90 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
34aa0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
34ab0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
34ac0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
34ad0 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
34ae0 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34b00 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
34b10 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
34b20 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
34b30 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
34b40 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
34b50 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
34b60 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
34b70 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
34b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34b90 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
34ba0 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
34bb0 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
34bc0 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
34bd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
34be0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
34bf0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
34c00 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
34c10 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
34c20 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
34c30 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
34c40 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
34c50 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
34c60 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
34c70 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
34c80 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
34c90 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
34ca0 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
34cb0 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
34cc0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
34cd0 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
34ce0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
34cf0 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
34d00 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
34d10 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
34d20 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
34d30 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
34d40 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
34d50 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
34d60 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
34d70 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
34d80 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20  treeDelete()..  
34d90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
34da0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
34db0 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e  =0 || pParent->n
34dc0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
34dd0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
34de0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
34df0 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66  | pParent->aiOvf
34e00 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78  l[0]==iParentIdx
34e10 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
34e20 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
34e30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
34e40 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
34e50 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
34e60 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
34e70 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
34e80 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
34e90 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
34ea0 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
34eb0 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
34ec0 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
34ed0 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
34ee0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
34ef0 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
34f00 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
34f10 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
34f20 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
34f30 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
34f40 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
34f50 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
34f60 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
34f70 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
34f80 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
34f90 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
34fa0 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
34fb0 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
34fc0 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
34fd0 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
34fe0 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
34ff0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
35000 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
35010 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
35020 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
35030 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
35040 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
35050 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
35060 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
35070 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
35080 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
35090 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
350a0 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
350b0 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
350c0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
350d0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
350e0 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
350f0 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
35100 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
35110 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42  ( bBulk==0 || bB
35120 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  ulk==1 );.    if
35130 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
35140 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
35150 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
35160 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
35170 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
35180 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
35190 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20  = i-2+bBulk;.   
351a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
351b0 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29  sert( bBulk==0 )
351c0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  ;.      nxDiv = 
351d0 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
351e0 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42    }.    i = 2-bB
351f0 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20  ulk;.  }.  nOld 
35200 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b  = i+1;.  if( (i+
35210 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
35220 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
35230 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
35240 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
35250 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
35260 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
35270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
35280 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
35290 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
352a0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
352b0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
352c0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
352d0 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
352e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
352f0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
35300 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  pgno, &apOld[i],
35310 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
35320 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
35330 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
35340 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
35350 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61  );.      goto ba
35360 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
35370 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c     }.    nMaxCel
35380 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
35390 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
353a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
353b0 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20   if( (i--)==0 ) 
353c0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20  break;..    if( 
353d0 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
353e0 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70  ->aiOvfl[0] && p
353f0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
35400 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
35410 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
35420 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pOvfl[0];.      
35430 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
35440 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
35450 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
35460 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
35470 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
35480 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
35490 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
354a0 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
354b0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
354c0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
354d0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
354e0 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
354f0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
35500 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
35510 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
35520 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
35530 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
35540 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
35550 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
35560 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
35570 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
35580 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
35590 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
355a0 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
355b0 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
355c0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
355d0 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
355e0 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
355f0 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
35600 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
35610 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
35620 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
35630 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
35640 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
35650 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
35660 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
35670 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
35680 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
35690 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
356a0 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
356b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
356c0 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65  ut not if we are
356d0 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74   in secure-delet
356e0 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72  e mode. In secur
356f0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20  e-delete mode,. 
35700 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
35710 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
35720 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
35730 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
35740 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
35750 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
35760 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
35770 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
35780 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
35790 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
357a0 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
357b0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
357c0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
357d0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
357e0 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
357f0 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
35800 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
35810 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
35820 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LETE ){.        
35830 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  int iOff;..     
35840 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45     iOff = SQLITE
35850 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69  _PTR_TO_INT(apDi
35860 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50  v[i]) - SQLITE_P
35870 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e  TR_TO_INT(pParen
35880 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  t->aData);.     
35890 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e     if( (iOff+szN
358a0 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d  ew[i])>(int)pBt-
358b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
358c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
358d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
358e0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  T;.          mem
358f0 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
35900 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
35910 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ge*));.         
35920 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
35930 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
35940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
35950 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61  memcpy(&aOvflSpa
35960 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b  ce[iOff], apDiv[
35970 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  i], szNew[i]);. 
35980 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b 69           apDiv[i
35990 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  ] = &aOvflSpace[
359a0 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74  apDiv[i]-pParent
359b0 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20  ->aData];.      
359c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
359d0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
359e0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
359f0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
35a00 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a  szNew[i], &rc);.
35a10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35a20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
35a30 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
35a40 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
35a50 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
35a60 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
35a70 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
35a80 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
35a90 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
35aa0 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
35ab0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
35ac0 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70   */.  k = pBt->p
35ad0 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38  ageSize + ROUND8
35ae0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
35af0 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  );.  szScratch =
35b00 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
35b10 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b30 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
35b40 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
35b50 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b70 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
35b80 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
35b90 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bb0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
35bc0 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b  /.     + k*nOld;
35bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bf0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70       /* Page cop
35c00 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a  ies (apCopy) */.
35c10 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
35c20 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
35c30 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
35c40 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
35c50 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
35c60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
35c70 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
35c80 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
35c90 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
35ca0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53  nMaxCells];.  aS
35cb0 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a  pace1 = (u8*)&sz
35cc0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
35cd0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
35ce0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
35cf0 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f  aSpace1) );..  /
35d00 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
35d10 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
35d20 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
35d30 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
35d40 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
35d50 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
35d60 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
35d70 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
35d80 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
35d90 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
35da0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70  btained from aSp
35db0 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
35dc0 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
35dd0 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
35de0 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
35df0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
35e00 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
35e10 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
35e20 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
35e30 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
35e40 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
35e50 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
35e60 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
35e70 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
35e80 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
35e90 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
35ea0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
35eb0 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
35ec0 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
35ed0 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
35ee0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
35ef0 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
35f00 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
35f10 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
35f20 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
35f30 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
35f40 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
35f50 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
35f60 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
35f70 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
35f80 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
35f90 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
35fa0 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
35fb0 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
35fc0 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
35fd0 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
35fe0 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
35ff0 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
36000 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
36010 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
36020 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
36030 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
36040 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
36050 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
36060 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
36070 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
36080 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
36090 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
360a0 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
360b0 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
360c0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
360d0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
360e0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
360f0 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
36100 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
36110 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
36120 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
36130 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
36140 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
36150 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
36160 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
36170 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
36180 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
36190 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
361a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
361b0 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
361c0 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
361d0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
361e0 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
361f0 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
36200 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
36210 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
36220 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
36230 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
36240 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
36250 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
36260 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
36270 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  pOld->nOverflow>
36280 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
36290 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
362a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
362b0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
362c0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
362d0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
362e0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
362f0 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Old, j);.       
36300 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
36310 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
36320 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
36330 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
36340 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
36350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
36360 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61  *aData = pOld->a
36370 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20  Data;.      u16 
36380 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d  maskPage = pOld-
36390 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20  >maskPage;.     
363a0 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20   u16 cellOffset 
363b0 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73  = pOld->cellOffs
363c0 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  et;.      for(j=
363d0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
363e0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
363f0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
36400 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
36410 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
36420 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d  dCellv2(aData, m
36430 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66  askPage, cellOff
36440 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  set, j);.       
36450 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
36460 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
36470 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
36480 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
36490 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
364a0 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28  }       .    if(
364b0 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
364c0 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
364d0 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
364e0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
364f0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
36500 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
36510 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
36520 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
36530 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
36540 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
36550 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
36560 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
36570 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
36580 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
36590 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
365a0 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74  ace1 <= (int)pBt
365b0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
365c0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
365d0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
365e0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
365f0 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
36600 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
36610 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
36620 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
36630 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
36640 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
36650 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
36660 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
36670 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
36680 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
36690 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
366a0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
366b0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
366c0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
366d0 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
366e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
366f0 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
36700 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
36710 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
36720 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
36730 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
36740 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
36750 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
36760 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
36770 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
36780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
367a0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
367b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
367c0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
367d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
367e0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
367f0 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
36800 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
36810 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
36820 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
36830 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36840 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
36850 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
36860 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
36870 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
36880 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
36890 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
368a0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
368b0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
368c0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
368d0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
368e0 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
368f0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
36900 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
36910 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
36920 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
36930 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
36940 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
36950 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
36960 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
36970 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
36980 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
36990 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
369a0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
369b0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
369c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
369d0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
369e0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
369f0 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
36a00 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
36a10 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
36a20 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
36a30 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
36a40 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
36a50 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
36a60 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
36a70 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
36a80 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
36a90 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
36aa0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
36ab0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
36ac0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
36ad0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
36ae0 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
36af0 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
36b00 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
36b10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
36b20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
36b30 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
36b40 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
36b50 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
36b60 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
36b70 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
36b80 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
36b90 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
36ba0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
36bb0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
36bc0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
36bd0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
36be0 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
36bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
36c00 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
36c10 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
36c20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
36c30 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
36c40 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
36c50 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
36c60 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
36c70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
36c80 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
36c90 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
36ca0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
36cb0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
36cc0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
36cd0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
36ce0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
36cf0 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
36d00 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
36d10 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
36d20 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
36d30 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
36d40 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
36d50 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
36d60 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
36d70 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
36d80 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
36d90 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
36da0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
36db0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
36dc0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
36dd0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
36de0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
36df0 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
36e00 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
36e10 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
36e20 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
36e30 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
36e40 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
36e50 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
36e60 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
36e70 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
36e80 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
36e90 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
36ea0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
36eb0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
36ec0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
36ed0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
36ee0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
36ef0 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
36f00 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
36f10 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
36f20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
36f30 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
36f40 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
36f50 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
36f60 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
36f70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
36f80 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
36f90 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
36fa0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36fc0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
36fd0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
36fe0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
36ff0 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
37000 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
37010 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
37020 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
37030 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
37040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
37050 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
37060 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
37070 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  =0 .       || (!
37080 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74  bBulk && szRight
37090 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
370a0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
370b0 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  2)) .    ){.    
370c0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
370d0 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
370e0 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
370f0 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
37100 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
37110 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
37120 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
37130 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
37140 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
37150 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
37160 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
37170 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
37180 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
37190 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
371a0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
371b0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
371c0 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
371d0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
371e0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
371f0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
37200 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
37210 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
37220 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
37230 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
37240 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
37250 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73 73  UPDATE:  The ass
37260 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e  ert() below is n
37270 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
37280 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
37290 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ase.  ** file is
372a0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63   corrupt.  The c
372b0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62  orruption will b
372c0 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
372d0 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20  eported later.  
372e0 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ** in this proce
372f0 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69 73  dure so there is
37300 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20   no need to act 
37310 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  upon it now..  *
37320 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
37330 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
37340 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
37350 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
37360 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64  Cell==0) );.#end
37370 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  if..  TRACE(("BA
37380 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
37390 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f  d %d  ",.    apO
373a0 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20  ld[0]->pgno, .  
373b0 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c    nOld>=2 ? apOl
373c0 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a  d[1]->pgno : 0,.
373d0 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70      nOld>=3 ? ap
373e0 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[2]->pgno : 0
373f0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  .  ));..  /*.  *
37400 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
37410 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
37420 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
37430 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
37440 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
37450 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
37460 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
37470 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
37480 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
37490 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
374a0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
374b0 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
374c0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
374d0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
374e0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
374f0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
37500 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
37510 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
37520 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
37530 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37540 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
37550 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
37560 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
37570 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
37580 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
37590 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
375a0 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
375b0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
375c0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
375d0 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f   &pgno, (bBulk ?
375e0 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a   1 : pgno), 0);.
375f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
37600 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
37610 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
37620 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
37630 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
37640 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
37650 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
37660 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
37670 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
37680 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
37690 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
376a0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
376b0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
376c0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
376d0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
376e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
376f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37700 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
37710 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
37720 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
37730 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
37740 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
37750 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
37760 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
37770 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
37780 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
37790 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
377a0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
377b0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
377c0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
377d0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
377e0 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
377f0 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
37800 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
37810 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
37820 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
37830 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
37840 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
37850 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
37860 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
37870 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
37880 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
37890 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
378a0 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
378b0 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
378c0 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
378d0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
378e0 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
378f0 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
37900 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
37910 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
37920 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
37930 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
37940 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
37950 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
37960 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
37970 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
37980 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
37990 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
379a0 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
379b0 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
379c0 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
379d0 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
379e0 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
379f0 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
37a00 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
37a10 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
37a20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
37a30 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
37a40 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
37a50 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
37a60 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
37a70 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
37a80 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
37a90 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
37aa0 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
37ab0 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
37ac0 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
37ad0 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
37ae0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
37af0 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
37b00 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
37b10 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d   *pT;.      pT =
37b20 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
37b30 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
37b40 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
37b50 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
37b60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
37b70 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
37b80 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
37b90 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
37ba0 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
37bb0 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
37bc0 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
37bd0 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
37be0 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
37bf0 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
37c00 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
37c10 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
37c20 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
37c30 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
37c40 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
37c50 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
37c60 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
37c70 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
37c80 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
37c90 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
37ca0 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
37cb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
37cc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
37cd0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
37ce0 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
37cf0 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
37d00 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
37d10 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
37d20 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
37d30 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
37d40 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
37d50 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
37d60 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
37d70 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
37d80 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
37d90 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
37da0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
37db0 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
37dc0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
37dd0 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
37de0 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
37df0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
37e00 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
37e10 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
37e20 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
37e30 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
37e40 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
37e50 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
37e60 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
37e70 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
37e80 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
37e90 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
37ea0 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
37eb0 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
37ec0 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
37ed0 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
37ee0 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
37ef0 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
37f00 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
37f10 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
37f20 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
37f30 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
37f40 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
37f50 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
37f60 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
37f70 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
37f80 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
37f90 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
37fa0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
37fb0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
37fc0 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
37fd0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
37fe0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
37ff0 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
38000 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
38010 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
38020 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
38030 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
38040 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
38050 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
38060 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
38070 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
38080 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
38090 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
380a0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
380b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
380c0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
380d0 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
380e0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
380f0 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
38100 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
38110 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
38120 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
38130 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
38140 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
38150 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
38160 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
38170 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
38180 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
38190 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
381a0 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
381b0 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
381c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
381d0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
381e0 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
381f0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
38200 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
38210 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
38220 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
38230 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
38240 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
38250 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
38260 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
38270 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
38280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
38290 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
382a0 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
382b0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
382c0 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
382d0 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
382e0 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
382f0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
38300 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
38310 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
38320 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
38330 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
38340 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
38350 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
38360 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
38370 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72       ** (see btr
38380 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
38390 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
383a0 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
383b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
383c0 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
383d0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
383e0 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
383f0 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
38400 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
38410 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
38420 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
38430 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
38440 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
38450 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
38460 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLit