/ Hex Artifact Content
Login

Artifact 4decfb3b97d16afdd0e5a7e5f876af1f528e8a69:


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 0a 20  F_Incrblob)!=0. 
40a0: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
40b0: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
40c0: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
40d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40e0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40f0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
4100: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4110: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4120: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4130: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4140: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4150: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4160: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4170: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4190: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
41a0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41b0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41c0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41d0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41f0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
4200: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4210: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4220: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4230: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4240: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4250: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4260: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4270: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4280: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4290: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
42a0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42b0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42c0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42d0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42e0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42f0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
4300: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4310: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4330: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4340: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4350: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4360: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4370: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4380: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4390: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
43a0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43b0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43c0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43e0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43f0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
4400: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4410: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4420: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4430: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4440: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4450: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4490: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
44a0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44c0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44d0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44e0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44f0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
4500: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4510: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4520: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4530: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4540: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4550: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4560: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4570: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4580: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4590: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
45a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45b0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45e0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45f0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4600: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4610: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4620: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4630: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4640: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4650: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4660: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4670: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4680: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4690: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
46a0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46b0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46d0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46f0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4700: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4710: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4720: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4730: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4740: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4750: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4760: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4770: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4780: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4790: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
47a0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47c0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47d0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4800: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4810: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4820: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4830: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4840: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4850: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4860: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4880: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4890: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
48a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48f0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4900: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4910: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4920: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4930: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4940: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4950: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4990: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
49a0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49b0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49d0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4a00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a10: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a20: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a50: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a60: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a80: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a90: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4aa0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4ab0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ac0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ad0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ae0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4af0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4b00: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b20: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b30: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b40: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b50: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b60: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b70: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b80: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b90: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4ba0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4bb0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bc0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bd0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4be0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4bf0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4c00: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c10: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c20: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c40: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c50: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c70: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c80: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c90: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4ca0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cc0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cd0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ce0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4d00: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d10: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d40: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d60: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d70: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d80: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d90: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4da0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4db0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4dc0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4de0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4df0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4e00: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e10: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e20: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e30: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e40: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e50: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e60: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e80: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e90: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4ea0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4eb0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4ec0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ed0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ee0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ef0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4f00: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f10: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f20: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f60: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f70: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f90: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4fa0: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fb0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fc0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fd0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fe0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ff0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
5000: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5010: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5020: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5030: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5040: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5050: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5070: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5080: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5090: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
50a0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50b0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50c0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50d0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50f0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5100: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5110: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5120: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5130: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5140: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5160: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5170: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51a0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51b0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51d0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5220: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5230: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5240: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5260: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5270: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5280: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5290: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
52a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52b0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52d0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
52f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5300: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5310: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5320: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5330: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5340: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5350: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5360: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5370: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5380: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5390: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
53a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
53b0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
53c0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
53d0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
53e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
53f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5400: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5410: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5420: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5430: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5440: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5450: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5460: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5480: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5490: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
54a0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
54b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
54c0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
54d0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
54e0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
54f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5500: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
5510: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
5520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5530: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5540: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5550: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5560: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5570: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5580: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5590: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
55a0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
55b0: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
55c0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
55d0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
55e0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
55f0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5600: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5620: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5640: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5650: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5660: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5670: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5680: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5690: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
56a0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
56b0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
56c0: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
56d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
56e0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
56f0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
5700: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
5710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5720: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5730: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5740: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5750: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5760: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5770: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5780: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5790: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
57a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
57b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
57c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
57d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
57e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
57f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5800: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5810: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5820: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5830: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5850: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5860: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5870: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5890: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
58a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
58b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
58d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
58e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
58f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5900: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5910: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5920: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5930: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5940: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5950: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5960: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5970: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5980: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5990: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
59a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
59b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
59c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
59d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
59e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
59f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5a10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5a20: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5a30: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5a40: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5a50: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5a60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5a70: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5a80: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5aa0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ab0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5ad0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ae0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5af0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5b00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5b10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5b20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5b30: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5b40: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5b60: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5b70: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5b80: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5b90: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5ba0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5bb0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5bc0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5be0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5bf0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5c00: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5c10: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5c20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5c40: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5c60: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5c70: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5c80: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5c90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5ca0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5cb0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5cc0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5cd0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ce0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5cf0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5d00: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5d10: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5d20: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5d30: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5d40: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5d50: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5d70: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5d80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5db0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5dc0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5dd0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5de0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5df0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5e00: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5e10: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5e20: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5e30: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
5e40: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
5e50: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
5e60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5e70: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
5e80: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
5e90: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5ea0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
5eb0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
5ec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
5ed0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5ee0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
5ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
5f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
5f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
5f30: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
5f40: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
5f50: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
5f60: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
5f70: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
5f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5f90: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5fa0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5fb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5fd0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
5fe0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5ff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6020: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6030: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6040: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6060: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6070: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6090: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
60a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
60b0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
60c0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
60d0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
60e0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
60f0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6100: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6110: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6120: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6130: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6140: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6150: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6160: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6170: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6180: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6190: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
61a0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
61b0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
61c0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
61d0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
61e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
61f0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
6210: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6220: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6230: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6240: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6250: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6260: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6270: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6290: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
62a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
62b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
62d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
62e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
62f0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6300: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6330: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6340: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6350: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6360: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6370: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6380: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6390: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
63a0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
63b0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
63c0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
63d0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
63e0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
63f0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6410: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6420: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6430: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6440: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6450: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6460: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6470: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6480: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6490: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
64a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
64b0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
64c0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
64d0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
64e0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
64f0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6500: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6510: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6520: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6530: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6540: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6550: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6560: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6570: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6580: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6590: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
65a0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
65b0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
65c0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
65d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
65e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
65f0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6600: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6610: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6620: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6630: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6640: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6650: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6660: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6670: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6680: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6690: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
66a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
66b0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
66c0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
66d0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
66e0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6700: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6710: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6720: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6730: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6740: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6750: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6760: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6770: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6780: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6790: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
67a0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
67b0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
67c0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
67d0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
67e0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
67f0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6800: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6810: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6820: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6830: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6840: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6850: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6860: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6870: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6880: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6890: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
68a0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
68b0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
68c0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
68d0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
68e0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
68f0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6900: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6910: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6920: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6930: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6940: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6950: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6960: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6970: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6980: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6990: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
69a0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
69b0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
69c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
69d0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
69e0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
69f0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6a00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6a10: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a20: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6a30: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6a40: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6a50: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6a60: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6a70: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6a80: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6aa0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6ab0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6ac0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6ad0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6ae0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6af0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6b00: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6b10: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6b20: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6b40: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6b50: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6b60: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6b70: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6b80: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6b90: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6ba0: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6bb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6bc0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6bd0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6be0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6bf0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6c00: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6c10: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6c20: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6c30: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6c40: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6c50: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6c60: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6c70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6c80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6c90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6ca0: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6cb0: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6cc0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6cd0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6ce0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6cf0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6d00: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6d10: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6d20: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6d30: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6d40: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6d50: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6d80: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6dc0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6dd0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6de0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6df0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6e00: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6e10: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6e20: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6e30: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
6e40: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
6e50: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
6e60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6e70: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6e80: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6e90: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6ea0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6eb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6ec0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6ed0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6ee0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6ef0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6f00: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
6f10: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
6f20: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
6f30: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6f40: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
6f50: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
6f60: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6f70: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
6f80: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
6f90: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6fa0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
6fb0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6fc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
6fd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6fe0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7000: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7010: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7020: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7040: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7050: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7060: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7070: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7080: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7090: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
70a0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
70b0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
70c0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
70d0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
70e0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
70f0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7100: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7110: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7120: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7130: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7140: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7150: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7160: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7170: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7180: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7190: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
71a0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
71b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
71c0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
71d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
71e0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
71f0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7200: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7210: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7220: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7230: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7240: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7260: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7270: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7280: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7290: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
72a0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
72b0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
72c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
72d0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
72e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
72f0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7300: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7310: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7320: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7330: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7340: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7350: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7380: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7390: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
73a0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
73b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
73c0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
73d0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
73e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
73f0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7410: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7420: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7440: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7450: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7460: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7470: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7480: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7490: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
74a0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
74b0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
74c0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
74d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
74e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
74f0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7500: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7510: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7520: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7530: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7540: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7550: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7560: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7570: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7580: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7590: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
75a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
75b0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
75c0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
75d0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
75e0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
75f0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7600: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7610: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7620: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7630: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7640: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7650: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7660: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7670: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7680: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7690: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
76a0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
76b0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
76c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
76d0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
76e0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
76f0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7700: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7710: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7720: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7730: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7740: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7750: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7760: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7780: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7790: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
77a0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
77b0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
77c0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
77d0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
77e0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
77f0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
7800: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
7810: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7820: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7830: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7840: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7850: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7870: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7890: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
78a0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
78b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
78c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78d0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
78e0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78f0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7900: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
7910: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7920: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7930: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7940: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7950: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7960: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7970: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7980: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7990: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
79a0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
79b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
79c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
79d0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
79e0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
79f0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7a00: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7a10: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7a20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7a30: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7a40: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7a50: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7a60: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7a70: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7a80: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7a90: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7aa0: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7ab0: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7ac0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7ad0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7ae0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7af0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7b00: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7b10: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7b20: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7b30: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7b40: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7b50: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7b60: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7b70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b80: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7b90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7ba0: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7bb0: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7bc0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7bd0: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7be0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7bf0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7c00: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7c10: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7c20: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7c30: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7c40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7c60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7c70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7c80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7c90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7ca0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7cb0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7cc0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7cd0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7ce0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7cf0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7d00: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7d10: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7d20: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7d30: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7d40: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7d50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7d60: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7d70: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7d80: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7d90: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7da0: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7db0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7dc0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7dd0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7de0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e00: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7e10: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7e20: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7e30: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7e40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7e50: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7e70: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
7e80: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
7e90: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7eb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7ec0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7f00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7f10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7f20: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7f30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7f40: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
7f50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7f60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
7f70: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
7f80: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
7f90: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
7fa0: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
7fb0: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
7fc0: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
7fd0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
7fe0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
7ff0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
8000: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8010: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8020: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8030: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8040: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8050: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8060: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8070: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8080: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8090: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
80a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
80b0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
80c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
80d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
80e0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
80f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
8100: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8110: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8120: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
8130: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8140: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8150: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8160: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8170: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8180: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8190: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
81a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
81b0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
81c0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
81d0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
81e0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
81f0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8200: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8210: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8220: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8230: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8240: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8250: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8260: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8270: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8280: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8290: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
82a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
82b0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
82c0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
82d0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
82e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
82f0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8300: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8310: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8320: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8330: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8340: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8350: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8360: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8370: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8380: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8390: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
83a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
83b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
83c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
83d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
83e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
83f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8400: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8410: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8420: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8430: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8440: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8450: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8460: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8470: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8480: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8490: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
84a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
84b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
84c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
84d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
84e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
84f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8500: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8510: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8520: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8530: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8540: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8550: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8560: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8570: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8580: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8590: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
85a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
85b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
85c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
85d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
85e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
85f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8600: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8610: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8620: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8630: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8640: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8650: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8660: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8670: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8680: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8690: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
86a0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
86b0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
86c0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
86d0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
86e0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
86f0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8700: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
8710: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8720: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8730: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8740: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8750: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8760: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8770: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8780: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
87a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
87c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
87d0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
87e0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
87f0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
8800: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
8810: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
8820: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8830: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8840: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8850: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8860: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8870: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8880: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8890: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
88a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
88b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
88c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
88d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
88e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
88f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
8900: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
8910: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8920: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8930: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8940: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8950: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8960: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8970: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8980: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8990: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
89a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
89b0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
89c0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
89d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
89e0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
89f0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8a00: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8a10: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8a40: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8a50: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8a90: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8aa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8ab0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8ac0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8ad0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8ae0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8af0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8b00: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8b10: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8b20: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8b30: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8b40: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8b50: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8b60: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8b70: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8b80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8b90: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8ba0: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8bb0: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8bc0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8bd0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8be0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8bf0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8c00: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8c10: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8c20: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8c30: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8c40: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8c50: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8c60: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8c70: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8c80: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8c90: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8ca0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8cb0: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8cc0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8cd0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8ce0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8cf0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8d00: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8d10: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8d20: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8d30: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8d40: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8d50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8d60: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8d70: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8d80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8d90: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8da0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8db0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8dc0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8dd0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8de0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8df0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8e00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8e10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8e20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8e30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8e40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8e50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8e60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8e70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8e80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8ea0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8eb0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8ec0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8ed0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8ee0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
8ef0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8f00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
8f10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8f20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
8f30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
8f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
8f50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8f60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8f70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8f80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8f90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8fa0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8fb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8fc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8fd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8fe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8ff0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
9010: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
9020: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
9030: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9040: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9050: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9060: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9070: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9080: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9090: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
90a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
90b0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
90c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
90d0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
90e0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
90f0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
9100: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
9110: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
9120: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
9130: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9140: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9150: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9160: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9170: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9180: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9190: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
91a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
91b0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
91c0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
91d0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
91e0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
91f0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
9200: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
9210: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9220: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9230: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9240: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9250: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9260: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9270: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9280: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9290: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
92a0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
92b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
92c0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
92d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
92e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
92f0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
9300: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
9310: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
9320: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
9330: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9340: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9350: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9360: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9370: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9380: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9390: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
93a0: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
93b0: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
93c0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
93d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
93e0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
93f0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
9400: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
9410: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
9420: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
9430: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9440: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9450: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9460: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9480: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
9490: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
94a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
94d0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94f0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
9500: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
9510: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
9520: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9530: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
9540: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
9550: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9560: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9570: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
9580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
95a0: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
95b0: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
95c0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
95e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
95f0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
9600: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9640: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
9650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9660: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9670: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
9680: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
9690: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
96a0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
96b0: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
96c0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
96d0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
96e0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
96f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9700: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
9710: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
9720: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
9730: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
9740: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
9750: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
9760: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
9770: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
9780: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
9790: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
97a0: 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73  */...  assert( s
97b0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
97c0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
97d0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
97e0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
97f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9800: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
9810: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
9820: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
9830: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9840: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9850: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9860: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9870: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9880: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
9890: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
98a0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
98b0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
98c0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
98d0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
98e0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
98f0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
9900: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
9910: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
9920: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
9930: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
9940: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9950: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  ze;.  cbrk = usa
9960: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
9970: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
9980: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
9990: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
99a0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
99b0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
99c0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
99d0: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
99e0: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
99f0: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
9a00: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
9a10: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
9a20: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
9a30: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
9a40: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
9a50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9a60: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
9a70: 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
9a80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9a90: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9aa0: 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  K).    /* These 
9ab0: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
9ac0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
9ad0: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
9ae0: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
9af0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
9b00: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
9b10: 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20  HECK is defined 
9b20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9b30: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
9b40: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
9b50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9b60: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9b70: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9b80: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
9b90: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
9ba0: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
9bb0: 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69     size = cellSi
9bc0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 73 72  zePtr(pPage, &sr
9bd0: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
9be0: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
9bf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9c00: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
9c10: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
9c20: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
9c30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9c40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9c50: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
9c60: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
9c70: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
9c80: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
9c90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9ca0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9cb0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9cc0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9cd0: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9ce0: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9cf0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9d00: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9d10: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9d20: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9d30: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
9d40: 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62  ize );.    put2b
9d50: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
9d60: 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d  ;.    if( temp==
9d70: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  0 ){.      int x
9d80: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b  ;.      if( cbrk
9d90: 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==pc ) continue;
9da0: 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71  .      temp = sq
9db0: 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
9dc0: 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ace(pPage->pBt->
9dd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78  pPager);.      x
9de0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9df0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
9e00: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d   memcpy(&temp[x]
9e10: 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72  , &data[x], (cbr
9e20: 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20  k+size) - x);.  
9e30: 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a      src = temp;.
9e40: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
9e50: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73  (&data[cbrk], &s
9e60: 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  rc[pc], size);. 
9e70: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
9e80: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9e90: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
9ea0: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
9eb0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
9ec0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
9ed0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9ee0: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  r+7] = 0;.  mems
9ef0: 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69  et(&data[iCellFi
9f00: 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43  rst], 0, cbrk-iC
9f10: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73  ellFirst);.  ass
9f20: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9f30: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
9f40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
9f50: 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c    if( cbrk-iCell
9f60: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
9f70: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
9f80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9f90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
9fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9fb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
9fc0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20  he free-list on 
9fd0: 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61  page pPg for spa
9fe0: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65  ce to store a ce
9ff0: 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  ll nByte bytes i
a000: 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e  n.** size. If on
a010: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  e can be found, 
a020: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
a030: 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e   to the space an
a040: 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66  d remove it.** f
a050: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
a060: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  t..**.** If no s
a070: 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61  uitable space ca
a080: 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68  n be found on th
a090: 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74  e free-list, ret
a0a0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
a0b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
a0c0: 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74  y detect corrupt
a0d0: 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20  ion within pPg. 
a0e0: 49 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 61  If it does and a
a0f0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 70 52 63 20  rgument .** pRc 
a100: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
a110: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
a120: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a130: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
a140: 72 6e 65 64 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  rned..** Or, if 
a150: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
a160: 74 65 63 74 65 64 20 61 6e 64 20 70 52 63 20 69  tected and pRc i
a170: 73 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 69 73 20  s NULL, NULL is 
a180: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
a190: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 67  .** corruption g
a1a0: 6f 65 73 20 75 6e 72 65 70 6f 72 74 65 64 2e 0a  oes unreported..
a1b0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
a1c0: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
a1d0: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
a1e0: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
a1f0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
a200: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
a210: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
a220: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
a230: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20  ;.  int iAddr;. 
a240: 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75   int pc;.  int u
a250: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
a260: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a270: 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68  ;..  for(iAddr=h
a280: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
a290: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
a2a0: 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63  r]))>0; iAddr=pc
a2b0: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a2d0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
a2e0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  slot */.    if( 
a2f0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
a300: 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b  || pc<iAddr+4 ){
a310: 0a 20 20 20 20 20 20 69 66 28 20 70 52 63 20 29  .      if( pRc )
a320: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
a330: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a340: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a350: 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65   }.    size = ge
a360: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
a370: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 69  +2]);.    if( si
a380: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
a390: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
a3a0: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 74  - nByte;.      t
a3b0: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
a3c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a3d0: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69   x==3 );.      i
a3e0: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
a3f0: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
a400: 37 5d 3e 3d 36 30 20 29 20 72 65 74 75 72 6e 20  7]>=60 ) return 
a410: 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;.        /* Re
a420: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
a430: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
a440: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
a450: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
a460: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
a470: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
a480: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
a490: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
a4a0: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
a4b0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
a4c0: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
a4d0: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  )x;.      }else 
a4e0: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
a4f0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
a500: 20 20 20 20 69 66 28 20 70 52 63 20 29 20 2a 70      if( pRc ) *p
a510: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
a520: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a530: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a550: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
a560: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
a570: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
a580: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
a590: 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  t.         ** fo
a5a0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
a5b0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
a5c0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
a5d0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61       put2byte(&a
a5e0: 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  Data[pc+2], x);.
a5f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
a600: 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b  turn &aData[pc +
a610: 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   x];.    }.  }..
a620: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
a630: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
a640: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
a650: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
a660: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
a670: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
a680: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
a690: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
a6a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
a6b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
a6c0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
a6d0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
a6e0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
a6f0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
a700: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
a710: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
a720: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
a730: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
a740: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
a750: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
a760: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
a770: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
a780: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
a790: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
a7a0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
a7b0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
a7c0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
a7d0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
a7e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
a7f0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
a800: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
a810: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
a820: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
a830: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
a840: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
a850: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
a860: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
a870: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
a880: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
a890: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
a8a0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
a8b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
a8c0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
a8d0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
a8e0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
a8f0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
a900: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
a910: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
a920: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
a930: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
a940: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
a950: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
a960: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
a970: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
a980: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
a990: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
a9c0: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
a9d0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
a9e0: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
a9f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
aa00: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
aa10: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
aa20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
aa30: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
aa40: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74    /* Integer ret
aa50: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
aa60: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  t usableSize; /*
aa70: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
aa80: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20  the page */.  . 
aa90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
aaa0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
aab0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
aac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
aad0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
aae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
aaf0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ab00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ab10: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
ab20: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
ab30: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
ab40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
ab50: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
ab60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ab70: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
ab80: 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  0 );.  usableSiz
ab90: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
aba0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73  usableSize;.  as
abb0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73  sert( nByte < us
abc0: 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20  ableSize-8 );.. 
abd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
abe0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
abf0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
ac00: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
ac10: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
ac20: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
ac30: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
ac40: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
ac50: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
ac60: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
ac70: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
ac80: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b     if( top==0 ){
ac90: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
aca0: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
acb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
acc0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
acd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ace0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
acf0: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
ad00: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
ad10: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
ad20: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
ad30: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
ad40: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
ad50: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
ad60: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
ad70: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
ad80: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
ad90: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
ada0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
adb0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
adc0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
add0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
ade0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
adf0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
ae00: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
ae10: 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26  f( gap+2<=top &&
ae20: 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c   (data[hdr+1] ||
ae30: 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b   data[hdr+2]) ){
ae40: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
ae50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 75 38 20  LITE_OK;.    u8 
ae60: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
ae70: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
ae80: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
ae90: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
aea0: 63 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  c;.    if( pSpac
aeb0: 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  e ){.      *pIdx
aec0: 20 3d 20 70 53 70 61 63 65 20 2d 20 64 61 74 61   = pSpace - data
aed0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
aee0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
aef0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
af00: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
af10: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
af20: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
af30: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
af40: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
af50: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
af60: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
af70: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
af80: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
af90: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
afa0: 6f 70 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  op ){.    testca
afb0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
afc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
afd0: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
afe0: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
aff0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b000: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b010: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
b020: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
b030: 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74  rt( gap+nByte<=t
b040: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
b050: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
b060: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
b070: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
b080: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
b090: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
b0a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
b0b0: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
b0c0: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
b0d0: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
b0e0: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
b0f0: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
b100: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
b110: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
b120: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
b130: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
b140: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
b150: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
b160: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
b170: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
b180: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
b190: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
b1a0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
b1b0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b1c0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
b1d0: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
b1e0: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
b1f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b200: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
b210: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
b220: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b230: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
b240: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
b250: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
b260: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
b270: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
b280: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
b290: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
b2a0: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
b2b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
b2c0: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
b2d0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
b2e0: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
b2f0: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
b300: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
b310: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
b320: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
b330: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
b340: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
b350: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
b360: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
b370: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
b380: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
b390: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
b3a0: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
b3b0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
b3c0: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
b3d0: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
b3e0: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
b3f0: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
b400: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
b410: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
b420: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
b430: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
b440: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b450: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
b460: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
b470: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
b480: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
b490: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
b4a0: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
b4b0: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b4e0: 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66  of ptr to next f
b4f0: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31  reeblock */.  u1
b500: 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20  6 iFreeBlk;     
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b530: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
b540: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72  lock */.  u8 hdr
b550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73  /* Page header s
b580: 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  ize.  0 or 100 *
b590: 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30  /.  u8 nFrag = 0
b5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64            /* Red
b5c0: 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65  uction in fragme
b5d0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36  ntation */.  u16
b5e0: 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69   iOrigSize = iSi
b5f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
b600: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
b610: 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f  alue of iSize */
b620: 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70  .  u32 iLast = p
b630: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b640: 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67  eSize-4; /* Larg
b650: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
b660: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b670: 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53  .  u32 iEnd = iS
b680: 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20  tart + iSize;   
b690: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b6a0: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
b6b0: 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f  iStart buffer */
b6c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b6d0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
b6e0: 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65  aData;   /* Page
b6f0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
b700: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b710: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b720: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
b730: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
b740: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b750: 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70  ssert( iStart>=p
b760: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
b770: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
b780: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
b790: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
b7a0: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
b7b0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b7c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b7d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b7e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b7f0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
b800: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
b810: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
b820: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
b830: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61  ert( iStart<=iLa
b840: 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72  st );..  /* Over
b850: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
b860: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
b870: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
b880: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
b890: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
b8a0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ed */.  if( pPag
b8b0: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
b8c0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
b8d0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
b8e0: 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  et(&data[iStart]
b8f0: 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  , 0, iSize);.  }
b900: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
b910: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
b920: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
b930: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
b940: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
b950: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
b960: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
b970: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
b980: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
b990: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
b9a0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
b9b0: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
b9c0: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
b9d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
b9e0: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
b9f0: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
ba00: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
ba10: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
ba20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
ba30: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
ba40: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ba50: 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72  iPtr]))>0 && iFr
ba60: 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a  eeBlk<iStart ){.
ba70: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
ba80: 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75  lk<iPtr+4 ) retu
ba90: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
baa0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50  T_BKPT;.      iP
bab0: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
bac0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
bad0: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
bae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
baf0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
bb00: 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69  sert( iFreeBlk>i
bb10: 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d  Ptr || iFreeBlk=
bb20: 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  =0 );.  .    /* 
bb30: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20  At this point:. 
bb40: 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c     **    iFreeBl
bb50: 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62  k:   First freeb
bb60: 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72  lock after iStar
bb70: 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  t, or zero if no
bb80: 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74  ne.    **    iPt
bb90: 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64  r:       The add
bba0: 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65  ress of a pointe
bbb0: 72 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  r iFreeBlk.    *
bbc0: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
bbd0: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
bbe0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
bbf0: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
bc00: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
bc10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
bc20: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
bc30: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
bc40: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
bc50: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
bc60: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
bc70: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
bc80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
bc90: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69  ;.      iEnd = i
bca0: 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79  FreeBlk + get2by
bcb0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
bcc0: 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69  k+2]);.      iSi
bcd0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
bce0: 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
bcf0: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
bd00: 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
bd10: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
bd20: 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
bd30: 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
bd40: 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
bd50: 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
bd60: 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
bd70: 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
bd80: 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
bd90: 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
bda0: 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
bdb0: 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
bdc0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
bdd0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
bde0: 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
bdf0: 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
be00: 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
be10: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
be20: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
be30: 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
be40: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
be50: 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
be60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
be70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
be80: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
be90: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
bea0: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
beb0: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
bec0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
bed0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
bee0: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
bef0: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
bf00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bf10: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74  PT_BKPT;.    dat
bf20: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
bf30: 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74  g;.  }.  if( iSt
bf40: 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64  art==get2byte(&d
bf50: 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20  ata[hdr+5]) ){. 
bf60: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
bf70: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
bf80: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
bf90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
bfa0: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
bfb0: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
bfc0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
bfd0: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
bfe0: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
bff0: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
c000: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  ry */.    if( iP
c010: 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
c020: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c030: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32  T_BKPT;.    put2
c040: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
c050: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
c060: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c070: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
c080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
c090: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
c0a0: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
c0b0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
c0c0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c0d0: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
c0e0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
c0f0: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
c100: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
c110: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
c120: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
c130: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
c140: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
c150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c160: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
c170: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
c180: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
c190: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
c1a0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
c1b0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
c1c0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
c1d0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
c1e0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
c1f0: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
c200: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
c210: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
c220: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
c230: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
c240: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
c250: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
c260: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
c270: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
c280: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
c290: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
c2a0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
c2b0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
c2c0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
c2d0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
c2e0: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
c2f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
c300: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
c310: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c320: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
c330: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
c340: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
c350: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
c360: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
c370: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
c380: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
c390: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c3a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c3b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c3c0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
c3d0: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
c3e0: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
c3f0: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
c400: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
c410: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
c420: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
c430: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
c440: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
c450: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
c460: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
c470: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
c480: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
c490: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
c4a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c4b0: 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d 3e  eyLeaf = pPage->
c4c0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
c4d0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70 50  >noPayload = !pP
c4e0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
c4f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
c500: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
c510: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
c520: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
c530: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
c540: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
c550: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
c560: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
c570: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
c580: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  yLeaf = 0;.    p
c590: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
c5a0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
c5b0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
c5c0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
c5d0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
c5e0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
c5f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
c600: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c610: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
c620: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
c630: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
c640: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
c650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c670: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
c680: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
c690: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
c6a0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
c6b0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
c6c0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
c6d0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
c6e0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
c6f0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
c700: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
c710: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
c720: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
c730: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
c740: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
c750: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
c760: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
c770: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
c780: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
c790: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
c7a0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
c7b0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
c7c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
c7d0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
c7e0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
c7f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
c800: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c820: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c830: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
c840: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
c850: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
c860: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
c870: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c880: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
c890: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c8a0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
c8b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c8c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
c8d0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c8e0: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c8f0: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
c900: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
c910: 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20      u16 pc;     
c920: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
c930: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
c940: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
c950: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
c960: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
c970: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
c980: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
c990: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
c9a0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
c9b0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
c9c0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
c9d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
c9e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
c9f0: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
ca00: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73  re */.    int us
ca10: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
ca20: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
ca30: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
ca40: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
ca50: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
ca60: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
ca70: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
ca80: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
ca90: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65   */.    int nFre
caa0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
cab0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
cac0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
cad0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   */.    int top;
cae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
caf0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
cb00: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
cb10: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  a */.    int iCe
cb20: 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
cb30: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
cb40: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
cb50: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69   offset */.    i
cb60: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
cb70: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
cb80: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
cb90: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
cba0: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
cbb0: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
cbc0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
cbd0: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
cbe0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
cbf0: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
cc00: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
cc10: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
cc20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
cc30: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
cc40: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
cc50: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
cc60: 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
cc70: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
cc80: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
cc90: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
cca0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
ccb0: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
ccc0: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
ccd0: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
cce0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
ccf0: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
cd00: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
cd10: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
cd20: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
cd30: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
cd40: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
cd50: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
cd60: 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d  fset];.    top =
cd70: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
cd80: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
cd90: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
cda0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
cdb0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
cdc0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
cdd0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
cde0: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
cdf0: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
ce00: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
ce10: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
ce20: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
ce30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ce40: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
ce50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
ce60: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
ce70: 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  LL(pBt) );..    
ce80: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
ce90: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
cea0: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
ceb0: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
cec0: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
ced0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
cee0: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
cef0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
cf00: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
cf10: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
cf20: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
cf30: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
cf40: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
cf50: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
cf60: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
cf70: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
cf80: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
cf90: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
cfa0: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
cfb0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
cfc0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
cfd0: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
cfe0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
cff0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
d000: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
d010: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
d020: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69     {.      int i
d030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d040: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
d050: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
d060: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
d070: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
d080: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
d090: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
d0a0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
d0b0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
d0c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
d0d0: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
d0e0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
d0f0: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
d100: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
d110: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d120: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
d130: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
d140: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
d150: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
d160: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
d170: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
d180: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d190: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d1a0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
d1b0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
d1c0: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
d1d0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
d1e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d1f0: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
d200: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
d210: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
d220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
d230: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d240: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
d250: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
d260: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
d270: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
d280: 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a  .    }  .#endif.
d290: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
d2a0: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
d2b0: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
d2c0: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
d2d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d2e0: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
d2f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
d300: 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  op;.    while( p
d310: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
d320: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
d330: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
d340: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
d350: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
d360: 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65  /* Start of free
d370: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
d380: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
d390: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d3a0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
d3b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
d3c0: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
d3d0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
d3e0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
d3f0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
d400: 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
d410: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
d420: 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
d430: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
d440: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
d450: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
d460: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
d470: 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
d480: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
d490: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
d4a0: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
d4b0: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
d4c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d4d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d4e0: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
d4f0: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
d500: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
d510: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
d520: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
d530: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
d540: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
d550: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
d560: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
d570: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
d580: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
d590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
d5a0: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
d5b0: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
d5c0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
d5d0: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
d5e0: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
d5f0: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
d600: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
d610: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
d620: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
d630: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
d640: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
d650: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
d660: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
d670: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
d680: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
d690: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
d6a0: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
d6b0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
d6c0: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
d6d0: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
d6e0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
d6f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d700: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
d710: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
d720: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
d730: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
d740: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
d750: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
d760: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d770: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
d780: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
d790: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
d7a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
d7b0: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
d7c0: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
d7d0: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
d7e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
d7f0: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
d800: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
d810: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
d820: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d830: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
d840: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
d850: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
d860: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
d870: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
d880: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
d890: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
d8a0: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
d8b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
d8c0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
d8d0: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
d8e0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
d8f0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d900: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
d910: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
d920: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d930: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
d940: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
d950: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
d960: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d970: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d980: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
d990: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
d9a0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
d9b0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
d9c0: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
d9d0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
d9e0: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
d9f0: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
da00: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
da10: 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
da20: 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
da30: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
da40: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
da50: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
da60: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
da70: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
da80: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
da90: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
daa0: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
dab0: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
dac0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
dad0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
dae0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
daf0: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
db00: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
db10: 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
db20: 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
db30: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
db40: 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rst];.  pPage->n
db50: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
db60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
db70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
db80: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
db90: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
dba0: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
dbb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
dbc0: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
dbd0: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
dbe0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
dbf0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
dc00: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
dc10: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
dc20: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
dc30: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
dc40: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
dc50: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
dc60: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
dc70: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
dc80: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
dc90: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
dca0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
dcb0: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
dcc0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
dcd0: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
dce0: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
dcf0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
dd00: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
dd10: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
dd20: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
dd30: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
dd40: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
dd50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
dd60: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
dd70: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
dd80: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
dd90: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
dda0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
ddb0: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
ddc0: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
ddd0: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
dde0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
ddf0: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
de00: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
de10: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
de20: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
de30: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
de40: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
de50: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
de60: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
de70: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
de80: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
de90: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
dea0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
deb0: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
dec0: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
ded0: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
dee0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
def0: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
df00: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
df10: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
df20: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
df30: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
df40: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
df50: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
df60: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
df70: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
df80: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
df90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
dfa0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
dfb0: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
dfc0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
dfd0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
dfe0: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
dff0: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
e000: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
e010: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
e020: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
e030: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
e040: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
e050: 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
e060: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
e070: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
e080: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
e090: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
e0a0: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
e0b0: 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
e0c0: 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
e0d0: 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
e0e0: 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
e0f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e100: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
e110: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
e120: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
e130: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
e140: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
e150: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
e160: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e170: 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
e180: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
e190: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
e1a0: 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
e1b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e1c0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
e1d0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
e1e0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
e1f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
e200: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
e210: 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
e220: 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
e230: 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
e240: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
e250: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
e260: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
e270: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
e280: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
e290: 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
e2a0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
e2b0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
e2c0: 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
e2d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e2e0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
e2f0: 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
e300: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
e310: 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
e320: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
e330: 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
e340: 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
e350: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
e360: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
e370: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e380: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e390: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
e3a0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
e3b0: 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
e3c0: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
e3d0: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
e3e0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
e3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
e400: 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
e410: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
e420: 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
e430: 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
e440: 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
e450: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
e460: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
e470: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
e480: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
e490: 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
e4a0: 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
e4b0: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
e4c0: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
e4d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
e4e0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
e4f0: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
e500: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
e510: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
e520: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
e530: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
e540: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
e550: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
e560: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
e570: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
e580: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
e590: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
e5a0: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
e5b0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
e5c0: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
e5d0: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
e5e0: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
e5f0: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
e600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
e610: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
e620: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
e650: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
e660: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
e670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e680: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
e690: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
e6a0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e6c0: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
e6d0: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
e6e0: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  /* PAGER_GET_REA
e710: 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b  DONLY or 0 */.){
e720: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
e730: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e740: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e750: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e760: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45   bReadonly==PAGE
e770: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c  R_GET_READONLY |
e780: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
e790: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
e7a0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
e7b0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
e7c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e7d0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
e7e0: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
e7f0: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
e800: 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b  age, bReadonly);
e810: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e820: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
e830: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
e840: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
e850: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
e860: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
e870: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e880: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
e890: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
e8a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e8b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
e8c0: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
e8d0: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
e8e0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
e8f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e900: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
e910: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
e920: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
e930: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
e940: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
e950: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
e960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
e970: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
e980: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
e990: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
e9a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
e9b0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
e9c0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
e9d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e9e0: 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
e9f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
ea00: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
ea10: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
ea20: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
ea30: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
ea40: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
ea50: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
ea60: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
ea70: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
ea80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ea90: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
eaa0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
eab0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
eac0: 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
ead0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
eae0: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
eaf0: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
eb00: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
eb10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
eb20: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
eb30: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
eb40: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
eb50: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
eb60: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
eb70: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
eb80: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
eb90: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
eba0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ebb0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
ebc0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
ebd0: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
ebe0: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
ebf0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
ec00: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
ec10: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
ec20: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
ec30: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
ec40: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
ec50: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
ec60: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
ec70: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
ec80: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
ec90: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
eca0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
ecb0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
ecc0: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
ecd0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
ece0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ecf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ed00: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ed10: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
ed20: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
ed30: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
ed40: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
ed50: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
ed60: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
ed70: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
ed80: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
ed90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
eda0: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
edb0: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
edc0: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
edd0: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
ede0: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
edf0: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
ee00: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
ee10: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
ee20: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
ee30: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
ee40: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
ee50: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
ee60: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
ee70: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
ee80: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
ee90: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
eea0: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
eeb0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
eec0: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
eed0: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
eee0: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
eef0: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
ef00: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
ef10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ef20: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
ef30: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
ef40: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
ef50: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
ef60: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
ef70: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
ef80: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
ef90: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
efa0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
efb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
efc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
efd0: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
efe0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
eff0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
f000: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
f010: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
f020: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
f030: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
f040: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
f050: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
f060: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
f070: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
f080: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
f090: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
f0a0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
f0b0: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
f0c0: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
f0d0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
f0e0: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
f0f0: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
f100: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
f110: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
f120: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
f130: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
f140: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
f150: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
f160: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f170: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
f180: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
f190: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
f1a0: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
f1b0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
f1c0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
f1d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
f1e0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
f1f0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
f200: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
f210: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
f220: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
f230: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
f240: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
f250: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
f260: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
f270: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
f280: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
f290: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
f2a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f2b0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
f2c0: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
f2d0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
f2e0: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
f2f0: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
f300: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
f310: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
f320: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
f330: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
f340: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
f350: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
f360: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
f370: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
f380: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
f390: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
f3a0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
f3b0: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
f3c0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
f3d0: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
f3e0: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
f3f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f400: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
f410: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
f420: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
f430: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
f440: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
f450: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
f460: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
f470: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
f480: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
f490: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f4a0: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
f4b0: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
f4c0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f4e0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
f4f0: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
f500: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
f510: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
f520: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
f530: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
f540: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
f550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
f560: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
f570: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
f580: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
f5b0: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
f5c0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
f5d0: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
f5e0: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
f5f0: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
f600: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
f610: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
f620: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
f630: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
f640: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
f650: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f670: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
f680: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
f690: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
f6a0: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
f6b0: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
f6c0: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
f6d0: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
f6e0: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
f6f0: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
f700: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
f710: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
f720: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
f730: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
f740: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
f750: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
f760: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
f770: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
f780: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
f790: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
f7a0: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
f7b0: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
f7c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f7d0: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
f7e0: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
f7f0: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
f800: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
f810: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
f820: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
f830: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
f860: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
f870: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
f8a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
f8b0: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
f8c0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
f8d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
f8e0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f8f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f900: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
f910: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
f920: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
f930: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
f940: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
f950: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
f960: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
f970: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
f980: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
f990: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
f9a0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
f9b0: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
f9c0: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
f9d0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
f9e0: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
f9f0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
fa00: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
fa10: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
fa20: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
fa30: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
fa40: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
fa50: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
fa60: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
fa70: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
fa80: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
fa90: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
faa0: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
fab0: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
fac0: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
fad0: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
fae0: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
faf0: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
fb00: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
fb10: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
fb20: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
fb30: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
fb40: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
fb50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fb60: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
fb70: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
fb80: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
fb90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
fba0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
fbb0: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
fbc0: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
fbd0: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
fbe0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
fbf0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
fc00: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
fc10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
fc20: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
fc30: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
fc40: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
fc50: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
fc60: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
fc70: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
fc80: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
fc90: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
fca0: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
fcb0: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
fcc0: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
fcd0: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
fce0: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
fcf0: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
fd00: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
fd10: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
fd20: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
fd30: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
fd40: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
fd50: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
fd60: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
fd70: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
fd80: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
fd90: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
fda0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
fdb0: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
fdc0: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
fdd0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
fde0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
fdf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
fe00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fe10: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fe20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fe30: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
fe40: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
fe50: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
fe60: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
fe70: 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
fe80: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
fe90: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
fea0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
feb0: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
fec0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
fef0: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
ff00: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
ff10: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
ff20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ff30: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
ff40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ff50: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
ff60: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ff70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff80: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
ff90: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
ffa0: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
ffb0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ffc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
ffd0: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
ffe0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
fff0: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
10000 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
10010 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
10020 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
10030 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
10040 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10050 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
10060 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
10070 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
10080 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10090 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
100a0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
100b0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
100c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
100d0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
100e0 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
100f0 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
10100 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
10110 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
10120 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
10130 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
10140 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
10150 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
10160 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
10170 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
10180 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
10190 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
101a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
101b0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
101c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
101d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
101e0 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
101f0 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
10200 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
10210 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10220 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
10230 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
10240 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10250 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
10260 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
10270 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10280 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
102a0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
102c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
102d0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
102e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
102f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
10300 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
10310 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
10320 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10340 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
10350 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
10360 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
10370 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
10380 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
10390 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
103a0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
103b0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
103c0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
103d0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
103e0 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
103f0 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
10400 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
10410 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
10420 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
10430 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
10440 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
10450 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
10460 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
10470 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
10480 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
10490 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
104a0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
104b0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
104c0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
104d0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
104e0 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
104f0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
10500 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
10510 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
10520 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
10530 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
10540 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
10550 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
10560 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
10570 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
10580 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
10590 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
105a0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
105b0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
105c0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
105d0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
105e0 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
105f0 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
10600 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
10610 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
10620 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
10630 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
10640 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
10650 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
10660 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
10670 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
10680 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
10690 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
106a0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
106b0 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
106c0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
106d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
106e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
106f0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
10700 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
10710 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
10720 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
10730 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10750 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
10760 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
10770 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
10780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
107a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
107b0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
107c0 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
107d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
107e0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
107f0 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
10800 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
10810 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
10820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10840 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
10850 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10860 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
10870 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
10880 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
10890 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
108a0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
108b0 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
108c0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
108d0 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
108e0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
108f0 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
10900 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
10910 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
10920 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
10930 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
10940 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
10950 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
10960 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
10970 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
10980 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
10990 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
109a0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
109b0 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e  #endif.    pBt->
109c0 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
109d0 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
109e0 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
109f0 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
10a00 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
10a10 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
10a20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10a30 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
10a40 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
10a50 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
10a60 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
10a70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
10a80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10a90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
10aa0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10ab0 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
10ac0 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
10ad0 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
10ae0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
10af0 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
10b00 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
10b10 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
10b20 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
10b30 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
10b40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
10b50 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
10b60 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
10b70 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
10b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
10b90 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
10ba0 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
10bb0 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
10bc0 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
10bd0 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
10be0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
10bf0 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
10c00 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
10c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10c20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
10c30 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
10c40 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
10c50 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
10c60 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10c70 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
10c80 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
10c90 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
10ca0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
10cb0 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
10cc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10cd0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
10ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10cf0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
10d00 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
10d10 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
10d20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
10d30 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
10d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10d50 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
10d60 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
10d70 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
10d80 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
10d90 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
10da0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
10db0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
10dc0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
10dd0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
10de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10df0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10e00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
10e10 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
10e20 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
10e30 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
10e40 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
10e50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
10e60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
10e70 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
10e80 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
10e90 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
10ea0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
10eb0 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
10ec0 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
10ed0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10ee0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
10ef0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
10f00 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
10f10 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
10f20 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
10f30 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
10f40 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
10f50 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
10f60 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
10f70 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
10f80 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
10f90 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
10fa0 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42  ared; ).      pB
10fb0 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
10fc0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
10fd0 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
10fe0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10ff0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
11000 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
11010 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
11020 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
11030 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
11040 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
11050 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
11060 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
11070 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
11080 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
11090 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
110a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
110b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
110c0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
110d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
110e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
110f0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
11100 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
11110 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11120 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
11130 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
11140 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
11150 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
11160 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
11170 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
11180 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
11190 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
111a0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
111b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
111c0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
111d0 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
111e0 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
111f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11200 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
11210 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
11220 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
11230 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
11240 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
11250 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
11260 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
11270 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
11280 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
11290 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
112a0 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
112b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
112c0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
112d0 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
112e0 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
112f0 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
11300 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
11310 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
11320 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
11330 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
11340 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
11350 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
11360 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
11370 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
11380 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
11390 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
113a0 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
113b0 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
113c0 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
113d0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
113e0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
113f0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
11400 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
11410 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
11420 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
11430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
11440 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
11450 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
11460 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
11470 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
11480 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
11490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
114a0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
114b0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
114c0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
114d0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
114e0 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
114f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11500 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
11510 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
11520 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
11530 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
11540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
11550 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11560 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
11570 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
11580 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
11590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
115a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
115b0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
115c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
115d0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
115e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
115f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11600 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
11610 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
11620 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
11630 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
11640 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
11650 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
11660 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
11670 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
11680 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
11690 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
116a0 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
116b0 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
116c0 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
116d0 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
116e0 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
116f0 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
11700 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
11710 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
11720 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
11730 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
11740 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
11750 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
11760 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
11770 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
11780 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
11790 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
117a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
117b0 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
117c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
117d0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
117e0 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Open);.  }.  ret
117f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11800 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
11810 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
11820 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
11830 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
11840 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
11850 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
11860 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
11870 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
11880 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
11890 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
118a0 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
118b0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
118c0 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
118d0 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
118e0 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
118f0 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
11900 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11920 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11930 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
11940 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
11950 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
11960 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
11970 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
11980 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11990 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
119a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
119b0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
119c0 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
119d0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
119e0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
119f0 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
11a00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11a10 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
11a20 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
11a30 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
11a40 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
11a50 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
11a60 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
11a70 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
11a80 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
11a90 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
11aa0 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
11ab0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
11ac0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
11ad0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
11ae0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
11af0 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
11b00 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
11b10 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
11b20 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
11b30 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
11b40 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
11b50 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
11b60 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
11b70 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
11b80 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
11b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11ba0 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
11bb0 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
11bc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
11bd0 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
11be0 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
11bf0 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
11c00 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
11c10 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
11c20 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
11c30 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
11c40 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
11c50 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
11c60 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
11c70 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
11c80 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
11c90 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
11ca0 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
11cb0 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
11cc0 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
11cd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
11ce0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
11cf0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11d00 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
11d10 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
11d20 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
11d30 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
11d40 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
11d50 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
11d60 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
11d70 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
11d80 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
11d90 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
11da0 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
11db0 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
11dc0 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
11dd0 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
11de0 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
11df0 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
11e00 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
11e10 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
11e20 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
11e30 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
11e40 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
11e50 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
11e60 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
11e70 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
11e80 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
11e90 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
11ea0 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
11eb0 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
11ec0 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
11ed0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
11ee0 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
11ef0 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
11f00 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
11f10 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
11f20 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
11f30 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
11f40 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
11f50 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
11f60 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
11f70 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
11f80 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
11f90 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
11fa0 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
11fb0 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
11fc0 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
11fd0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
11fe0 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
11ff0 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
12000 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
12010 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
12020 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
12030 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
12040 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
12050 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
12060 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
12070 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
12080 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
12090 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
120a0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
120b0 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
120c0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
120d0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
120e0 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
120f0 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
12100 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12110 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
12120 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
12130 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
12140 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
12150 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
12160 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
12170 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
12180 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
12190 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
121a0 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
121b0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
121c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
121d0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
121e0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
121f0 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
12200 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
12210 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
12220 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
12230 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
12240 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
12250 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12260 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
12270 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
12280 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
12290 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
122a0 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
122b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
122c0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
122d0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
122e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
122f0 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
12300 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
12310 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
12320 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
12330 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
12340 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
12350 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
12360 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
12370 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
12380 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
12390 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
123a0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
123b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
123c0 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
123d0 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
123e0 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
123f0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
12400 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
12410 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
12420 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
12430 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
12440 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
12450 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
12460 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12470 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
12480 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
12490 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
124a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
124b0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
124c0 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
124d0 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
124e0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
124f0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
12500 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
12510 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
12520 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
12530 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
12540 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
12550 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
12560 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
12570 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
12580 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
12590 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
125a0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
125b0 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
125c0 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
125d0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
125e0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
125f0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
12600 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
12610 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
12620 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
12630 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
12640 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
12650 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
12660 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
12670 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
12680 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
12690 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
126a0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
126b0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
126c0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
126d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
126e0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
126f0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
12700 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
12710 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
12720 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12730 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
12740 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
12750 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
12760 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
12770 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
12780 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
12790 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
127a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
127b0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
127c0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
127d0 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
127e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
127f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
12810 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
12820 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12830 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
12840 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
12850 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
12860 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
12870 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
12880 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
12890 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
128a0 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
128b0 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
128c0 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
128d0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
128e0 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
128f0 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
12900 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
12910 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
12920 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
12930 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
12940 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
12950 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
12960 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
12970 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
12980 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
12990 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
129a0 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
129b0 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
129c0 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
129d0 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
129e0 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
129f0 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
12a00 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
12a10 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
12a20 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
12a30 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
12a40 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
12a50 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
12a60 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
12a70 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
12a80 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
12a90 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
12aa0 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
12ab0 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
12ac0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12ad0 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
12ae0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
12af0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
12b00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12b10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12b20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
12b30 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
12b40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12b50 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
12b60 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
12b70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
12b80 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
12b90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12bb0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
12bc0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
12bd0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
12be0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
12bf0 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
12c00 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
12c10 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
12c20 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
12c30 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
12c40 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
12c50 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
12c60 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
12c70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12c80 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
12c90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12ca0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
12cb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12cc0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
12cd0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
12ce0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
12cf0 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
12d00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12d10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12d20 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
12d30 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
12d40 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
12d50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
12d60 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
12d70 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
12d80 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
12d90 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
12da0 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
12db0 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
12dc0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
12dd0 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
12de0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
12df0 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
12e00 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
12e10 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
12e20 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
12e30 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
12e40 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
12e50 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
12e60 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
12e70 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
12e80 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
12e90 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
12ea0 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
12eb0 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
12ec0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
12ed0 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
12ee0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
12ef0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
12f00 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
12f10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f20 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
12f30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12f40 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
12f50 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
12f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
12f70 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
12f80 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
12f90 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
12fa0 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
12fb0 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
12fc0 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
12fd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12fe0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
12ff0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13000 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
13010 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13020 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
13030 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
13040 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
13050 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
13060 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13080 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
13090 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
130a0 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
130b0 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
130c0 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
130d0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
130e0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
130f0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
13100 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
13110 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
13120 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
13130 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
13140 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13150 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
13160 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13170 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13180 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
13190 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
131a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
131b0 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
131c0 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
131d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
131e0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
131f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13200 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13210 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13220 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
13230 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
13240 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
13250 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
13260 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
13270 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
13280 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
13290 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
132a0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
132b0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
132c0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
132d0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
132e0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
132f0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
13300 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
13310 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
13320 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
13330 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
13340 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
13350 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
13360 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
13370 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
13380 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
13390 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
133a0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
133b0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
133c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
133d0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
133e0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
133f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
13400 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
13410 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
13420 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
13430 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
13440 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
13450 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
13460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
13470 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
13480 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
13490 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
134a0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
134b0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
134c0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
134d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
134e0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
134f0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13500 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
13510 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
13520 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
13530 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
13540 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
13550 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
13560 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
13570 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
13580 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
13590 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
135a0 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
135b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
135c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
135d0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
135e0 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
135f0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
13600 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13610 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
13620 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
13630 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
13640 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
13650 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13660 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13670 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
13680 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
13690 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
136a0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
136b0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
136c0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
136d0 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
136e0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
136f0 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
13700 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
13710 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
13720 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
13730 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
13740 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
13750 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
13760 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
13770 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
13780 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
13790 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
137a0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
137b0 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
137c0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
137d0 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
137e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
137f0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
13800 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
13810 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
13820 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
13830 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
13840 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
13850 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
13860 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
13870 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
13880 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
13890 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
138a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
138b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
138c0 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
138d0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
138e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
138f0 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
13900 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
13910 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
13920 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  e;.}..#if define
13930 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
13940 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  EC) || defined(S
13950 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
13960 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13970 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
13980 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
13990 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
139a0 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
139b0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
139c0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
139d0 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
139e0 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
139f0 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
13a00 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
13a10 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
13a20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
13a30 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
13a40 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
13a50 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
13a60 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
13a70 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
13a80 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
13a90 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13aa0 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
13ab0 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
13ac0 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
13ad0 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
13ae0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
13af0 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
13b00 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
13b10 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
13b20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
13b30 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
13b40 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
13b50 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
13b60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13b70 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
13b80 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
13b90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13ba0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
13bb0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
13bc0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
13bd0 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
13be0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23  >usableSize;.}.#
13bf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13c00 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c  HAS_CODEC || SQL
13c10 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
13c20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13c30 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13c40 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
13c50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
13c60 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  CUUM)./*.** Retu
13c70 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13c80 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
13c90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
13ca0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
13cb0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
13cc0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
13cd0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
13ce0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
13cf0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
13d00 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
13d10 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
13d20 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
13d30 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
13d40 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
13d50 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13d60 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
13d70 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
13d80 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
13d90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13da0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
13db0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
13dc0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
13dd0 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
13de0 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
13df0 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
13e00 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
13e10 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
13e20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
13e30 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
13e40 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
13e50 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
13e60 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
13e70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13e80 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
13e90 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
13ea0 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
13eb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13ec0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
13ed0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
13ee0 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
13ef0 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
13f00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13f10 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13f20 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
13f30 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  et the BTS_SECUR
13f40 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66  E_DELETE flag if
13f50 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
13f60 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
13f70 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
13f80 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
13f90 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
13fa0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
13fb0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13fc0 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74  E.** setting aft
13fd0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a  er the change..*
13fe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13ff0 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
14000 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
14010 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
14020 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
14030 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
14040 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14050 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
14060 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
14070 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
14080 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
14090 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
140a0 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
140b0 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
140c0 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62  DELETE;.  } .  b
140d0 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
140e0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
140f0 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20  E_DELETE)!=0;.  
14100 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14110 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
14120 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
14130 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14140 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
14150 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
14160 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
14170 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
14180 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
14190 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
141a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
141b0 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
141c0 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
141d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
141e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
141f0 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
14200 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
14210 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
14220 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
14230 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
14240 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
14250 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
14260 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
14270 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
14280 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
14290 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
142a0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
142b0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
142c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
142d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
142e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
142f0 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
14300 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14310 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
14320 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14330 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
14340 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
14350 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14360 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
14370 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
14380 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
14390 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
143a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
143b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
143c0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
143d0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
143e0 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
143f0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
14400 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
14410 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
14420 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
14440 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
14450 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
14460 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
14470 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
14480 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
14490 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
144a0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
144b0 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
144c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
144d0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
144e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
144f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14500 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
14510 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
14520 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
14530 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14540 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
14550 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
14560 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
14570 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
14580 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
14590 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
145a0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
145b0 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
145c0 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
145d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
145e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
145f0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
14600 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
14610 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
14620 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
14630 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
14640 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
14650 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
14660 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
14670 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
14680 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
14690 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
146a0 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
146b0 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
146c0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
146d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
146e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
146f0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
14700 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
14710 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
14720 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
14730 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
14740 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
14750 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
14760 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
14770 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14780 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
14790 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
147a0 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
147b0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
147c0 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
147d0 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
147e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
147f0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
14800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14810 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
14820 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
14830 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20    int nPageFile 
14840 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
14850 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
14860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
14870 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61  /.  int nPageHea
14880 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
14890 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
148a0 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
148b0 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
148c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
148d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
148e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
148f0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
14900 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
14910 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
14920 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
14930 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
14940 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
14950 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
14960 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
14970 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
14980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14990 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
149a0 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
149b0 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
149c0 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
149d0 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
149e0 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
149f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
14a00 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e    */.  nPage = n
14a10 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74  PageHeader = get
14a20 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
14a30 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
14a40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
14a50 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
14a60 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a  r, &nPageFile);.
14a70 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c    if( nPage==0 |
14a80 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a  | memcmp(24+(u8*
14a90 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  )pPage1->aData, 
14aa0 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  92+(u8*)pPage1->
14ab0 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20  aData,4)!=0 ){. 
14ac0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
14ad0 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  File;.  }.  if( 
14ae0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
14af0 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
14b00 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
14b10 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
14b20 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
14b30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14b40 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20  NOTADB;.    if( 
14b50 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
14b60 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
14b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
14b80 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
14b90 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
14ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
14bb0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
14bc0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
14bd0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14be0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
14bf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
14c00 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
14c10 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14c20 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14c30 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
14c40 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
14c50 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14c60 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
14c70 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
14c80 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
14c90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14ca0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
14cb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
14cc0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
14cd0 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
14ce0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
14cf0 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
14d00 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
14d10 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
14d20 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14d30 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
14d40 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
14d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
14d60 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
14d70 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
14d80 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
14d90 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
14da0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
14db0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
14dc0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
14dd0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
14de0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
14df0 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
14e00 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
14e10 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
14e20 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
14e30 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
14e40 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
14e50 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
14e60 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
14e70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14e80 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
14e90 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
14ea0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
14eb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
14ec0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
14ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14ee0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
14ef0 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
14f00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14f10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14f20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
14f30 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
14f40 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
14f50 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
14f60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14f70 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
14f80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
14fa0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
14fb0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
14fc0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
14fd0 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
14fe0 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
14ff0 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
15000 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
15010 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
15020 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
15030 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
15040 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
15050 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
15060 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
15070 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
15080 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
15090 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
150a0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
150b0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
150c0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
150d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
150e0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
150f0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
15100 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
15110 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
15120 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
15130 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65  pageSize = (page
15140 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67  1[16]<<8) | (pag
15150 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  e1[17]<<16);.   
15160 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
15170 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
15180 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
15190 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
151a0 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
151b0 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
151c0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
151d0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
151e0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
151f0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
15200 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73   7)==0 );.    us
15210 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
15220 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
15230 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
15240 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
15250 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
15260 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
15270 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
15280 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
15290 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
152a0 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
152b0 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
152c0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
152d0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
152e0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
152f0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
15300 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
15310 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
15320 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
15330 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
15340 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
15350 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
15360 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
15370 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
15380 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
15390 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
153a0 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
153b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
153c0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
153d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
153e0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
153f0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
15400 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
15410 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
15420 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
15430 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15440 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
15450 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
15460 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
15490 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
154a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
154b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
154c0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
154d0 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d  SQLITE_RecoveryM
154e0 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ode)==0 && nPage
154f0 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
15500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15510 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
15520 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15530 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15540 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
15550 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
15560 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
15570 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
15580 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
15590 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
155a0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
155b0 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
155c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
155d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
155e0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
155f0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
15600 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
15610 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
15620 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
15630 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
15640 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
15650 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
15660 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
15670 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
15680 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
15690 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
156a0 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
156b0 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
156c0 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
156d0 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
156e0 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
156f0 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
15700 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
15710 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
15720 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
15730 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
15740 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
15750 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
15760 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
15770 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
15780 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
15790 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
157a0 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
157b0 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
157c0 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
157d0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
157e0 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
157f0 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
15800 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
15810 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
15820 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
15830 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
15840 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
15850 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
15860 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
15870 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
15880 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
15890 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
158a0 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
158b0 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
158c0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
158d0 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
158e0 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
158f0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
15900 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
15910 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
15920 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
15930 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
15940 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
15950 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
15960 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
15970 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
15980 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
15990 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
159a0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
159b0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
159c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
159d0 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
159e0 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
159f0 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
15a00 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
15a10 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
15a20 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
15a30 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
15a40 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
15a50 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
15a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15a70 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
15a80 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
15a90 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
15aa0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
15ab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15ac0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
15ad0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15ae0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
15af0 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
15b00 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
15b10 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
15b20 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
15b30 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
15b40 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
15b50 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
15b60 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
15b70 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
15b80 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
15b90 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
15ba0 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
15bb0 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
15bc0 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
15bd0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
15be0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
15bf0 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
15c00 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
15c10 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
15c20 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
15c30 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
15c40 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
15c50 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
15c60 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
15c70 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
15c80 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
15c90 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
15ca0 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
15cb0 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
15cc0 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
15cd0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
15ce0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
15cf0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
15d00 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
15d10 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
15d20 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
15d30 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
15d40 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
15d50 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
15d60 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
15d70 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
15d80 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
15d90 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
15da0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
15db0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
15dc0 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
15dd0 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
15de0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
15df0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
15e00 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
15e10 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
15e20 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
15e30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
15e40 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
15e50 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
15e60 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
15e70 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
15e80 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
15e90 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
15ea0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
15eb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
15ec0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
15ed0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
15ee0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
15ef0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
15f00 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
15f10 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
15f20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15f30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
15f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
15f50 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
15f60 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
15f70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
15f80 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
15f90 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
15fa0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
15fb0 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
15fc0 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
15fd0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
15fe0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
15ff0 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
16000 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
16010 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
16020 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
16030 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
16040 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
16050 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16060 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
16070 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
16080 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
16090 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
160a0 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
160b0 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
160c0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
160d0 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
160e0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
160f0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
16100 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16110 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
16120 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
16130 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
16140 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
16150 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
16160 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16170 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
16180 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
16190 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
161a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
161b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
161c0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
161d0 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
161e0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
161f0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
16200 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16210 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
16220 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16230 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
16240 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
16250 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
16260 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
16270 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
16280 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
16290 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
162a0 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
162b0 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
162c0 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
162d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
162e0 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
162f0 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
16300 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
16310 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
16320 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
16330 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
16340 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
16350 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
16360 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
16370 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
16380 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
16390 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
163a0 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
163b0 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
163c0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
163d0 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
163e0 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
163f0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
16400 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
16410 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
16420 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
16430 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
16440 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16450 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
16460 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
16470 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
16480 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
16490 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
164a0 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
164b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
164c0 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
164d0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
164e0 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
164f0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
16500 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
16510 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
16520 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
16530 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
16540 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
16550 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16560 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
16570 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
16580 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
16590 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
165a0 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
165b0 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
165c0 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
165d0 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
165e0 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
165f0 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
16600 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
16610 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
16620 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
16630 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
16640 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
16650 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
16660 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16670 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
16680 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
16690 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
166a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
166b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
166c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
166d0 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
166e0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
166f0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
16700 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
16710 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
16720 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
16730 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
16740 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
16750 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
16760 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
16770 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
16780 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
16790 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
167a0 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
167b0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
167c0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
167d0 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
167e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
167f0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
16800 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
16810 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
16820 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
16830 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
16840 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
16850 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
16860 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
16870 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
16880 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
16890 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
168a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
168b0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
168c0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
168d0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
168e0 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
168f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16900 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
16910 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
16920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16930 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
16940 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
16950 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
16960 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
16970 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
16980 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
16990 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
169a0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
169b0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
169c0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
169d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
169e0 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
169f0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
16a00 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
16a10 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
16a20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
16a30 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
16a40 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
16a50 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
16a60 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
16a70 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
16a80 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
16a90 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
16aa0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
16ab0 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
16ac0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
16ad0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
16ae0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
16af0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
16b00 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
16b10 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
16b20 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
16b30 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
16b40 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
16b50 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
16b60 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
16b70 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
16b80 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
16b90 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
16ba0 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
16bb0 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
16bc0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
16bd0 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
16be0 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
16bf0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
16c00 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
16c10 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
16c20 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
16c30 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
16c40 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
16c50 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
16c60 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
16c70 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
16c80 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
16c90 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
16ca0 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
16cb0 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
16cc0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
16cd0 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
16ce0 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
16cf0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
16d00 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
16d10 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
16d20 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
16d30 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
16d40 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
16d50 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
16d60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16d70 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
16d80 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
16d90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
16da0 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
16db0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16dc0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
16dd0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
16de0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16df0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
16e00 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
16e10 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
16e20 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
16e30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
16e40 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
16e50 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
16e60 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
16e70 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
16e80 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
16e90 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
16ea0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
16eb0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
16ec0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
16ed0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
16ee0 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
16ef0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
16f00 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
16f10 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
16f20 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
16f30 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
16f40 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
16f50 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
16f60 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
16f70 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
16f80 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
16f90 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
16fa0 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
16fb0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
16fc0 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
16fd0 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
16fe0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16ff0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
17000 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
17010 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17020 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
17030 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
17040 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
17050 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
17060 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
17070 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
17080 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
17090 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
170a0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
170b0 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
170c0 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
170d0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
170e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
170f0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
17100 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
17110 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
17120 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17130 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
17140 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
17150 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
17160 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
17170 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
17180 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
17190 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
171a0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
171b0 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
171c0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
171d0 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
171e0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
171f0 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
17200 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
17210 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17220 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
17230 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
17240 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
17250 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
17260 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
17270 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
17280 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
17290 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
172a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
172b0 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
172c0 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
172d0 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
172e0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
172f0 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
17300 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
17310 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
17320 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
17330 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
17340 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
17350 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
17360 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
17370 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
17380 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
17390 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
173a0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
173b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
173c0 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
173d0 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
173e0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
173f0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
17400 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
17410 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
17420 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
17430 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
17440 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
17450 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
17460 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
17470 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
17480 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
17490 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
174a0 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
174b0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
174c0 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
174d0 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
174e0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
174f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
17500 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
17510 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
17520 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
17530 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
17540 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
17550 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
17560 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
17570 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
17580 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
17590 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
175a0 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
175b0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
175c0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
175d0 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
175e0 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
175f0 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
17600 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
17610 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
17620 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17630 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
17640 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
17650 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
17660 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
17670 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17680 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17690 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
176a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
176b0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
176c0 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
176d0 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
176e0 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
176f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
17700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17710 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
17720 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
17730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17740 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17750 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17760 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
17770 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
17780 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
17790 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
177a0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
177b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
177c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
177d0 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
177e0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
177f0 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
17800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17810 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
17820 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
17830 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
17840 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
17850 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17860 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
17870 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
17880 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
17890 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
178a0 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
178b0 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
178c0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
178d0 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
178e0 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
178f0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
17900 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
17910 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
17920 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
17930 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
17940 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
17950 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
17960 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
17970 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
17980 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
17990 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
179a0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
179b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
179c0 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
179d0 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
179e0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
179f0 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
17a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
17a10 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
17a20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
17a30 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
17a40 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
17a50 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
17a60 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
17a70 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
17a80 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
17a90 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17aa0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
17ab0 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
17ac0 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
17ad0 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
17ae0 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
17af0 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
17b00 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
17b10 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
17b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17b30 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
17b40 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
17b50 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
17b60 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
17b70 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
17b80 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
17b90 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
17ba0 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
17bb0 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
17bc0 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
17bd0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
17be0 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
17bf0 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
17c00 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
17c10 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
17c20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
17c30 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
17c40 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
17c50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
17c60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17c70 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
17c80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17c90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17ca0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
17cb0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
17cc0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
17cd0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
17ce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17cf0 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
17d00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17d10 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
17d20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
17d30 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
17d40 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
17d50 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
17d60 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
17d70 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
17d80 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
17d90 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
17da0 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
17db0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
17dc0 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
17dd0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
17de0 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
17df0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
17e00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17e10 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
17e20 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
17e30 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
17e40 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
17e50 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
17e60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17e80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17e90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17ea0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
17eb0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
17ec0 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
17ed0 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
17ee0 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
17ef0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
17f00 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
17f10 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
17f20 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
17f30 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
17f40 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
17f50 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
17f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
17f70 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
17f80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
17f90 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
17fc0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
17fd0 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
18000 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
18010 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18040 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
18050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
18060 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
18070 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
18080 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
18090 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
180a0 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
180b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
180c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
180d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
180e0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
180f0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
18100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18110 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
18120 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
18130 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
18140 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
18150 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
18160 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
18170 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
18180 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
18190 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
181a0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
181b0 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
181c0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
181d0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
181e0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
181f0 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
18200 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
18210 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
18220 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
18230 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
18240 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
18250 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
18260 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
18270 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
18280 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
18290 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
182a0 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
182b0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
182c0 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
182d0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
182e0 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
182f0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
18300 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
18310 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
18320 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
18330 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
18340 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
18350 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
18360 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
18370 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
18380 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
18390 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
183a0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
183b0 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
183c0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
183d0 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
183e0 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
183f0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
18400 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
18410 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
18420 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
18430 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
18440 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
18450 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
18460 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
18470 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
18480 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
184b0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
184c0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
184d0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
184e0 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
184f0 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
18500 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
18510 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
18520 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
18530 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
18540 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
18550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
18560 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
18570 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
18580 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
18590 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
185a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
185b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
185c0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
185d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
185e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
185f0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
18600 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
18610 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
18620 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
18630 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
18640 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
18650 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
18660 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
18670 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
18680 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
18690 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
186a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
186b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
186c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
186d0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
186e0 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
186f0 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
18700 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
18710 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
18720 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
18730 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
18740 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43  e(pPage);.    nC
18750 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
18760 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
18770 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
18780 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
18790 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
187a0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
187b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
187c0 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
187d0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
187e0 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
187f0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
18800 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
18810 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
18820 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
18830 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
18840 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
18850 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
18860 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
18870 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
18880 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
18890 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
188a0 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
188b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
188c0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
188d0 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
188e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
188f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
18910 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
18920 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
18930 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
18940 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
18950 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18970 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
18980 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
18990 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
189a0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
189b0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
189c0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
189d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
189e0 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
189f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
18a00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18a10 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
18a20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
18a30 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
18a40 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
18a50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
18a60 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
18a70 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
18a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18a90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
18aa0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
18ab0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
18ac0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
18ad0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
18ae0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
18af0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
18b00 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
18b10 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
18b20 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
18b30 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
18b40 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
18b50 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
18b60 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
18b70 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
18b80 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
18b90 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
18ba0 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
18bb0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
18bc0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
18bd0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
18be0 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
18bf0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
18c00 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
18c10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18c20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
18c30 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
18c40 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
18c50 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
18c60 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
18c70 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
18c80 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
18c90 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
18ca0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
18cb0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
18cc0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
18cd0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
18ce0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
18cf0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
18d00 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
18d10 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
18d20 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
18d30 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
18d40 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
18d50 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
18d60 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
18d70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
18d80 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
18d90 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
18da0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
18db0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
18dc0 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
18dd0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
18de0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
18df0 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
18e00 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
18e10 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
18e20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
18e30 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
18e40 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
18e50 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
18e60 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
18e70 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
18e80 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
18e90 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
18ea0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18eb0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
18ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
18ed0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
18ee0 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
18ef0 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
18f00 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
18f10 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
18f20 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
18f30 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
18f40 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
18f50 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
18f60 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
18f70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
18f80 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
18f90 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
18fa0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
18fb0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
18fc0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
18fd0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
18fe0 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
18ff0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
19000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
19010 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
19020 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
19030 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
19040 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
19050 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
19060 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
19070 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
19080 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
19090 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
190a0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
190b0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
190c0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
190d0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
190e0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
190f0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
19100 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
19110 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
19120 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
19130 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
19140 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
19150 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
19160 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
19170 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
19180 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
19190 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
191a0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
191b0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
191c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
191d0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
191e0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
191f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
19200 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
19210 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
19220 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
19230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
19250 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
19260 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
19270 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
19280 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
19290 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
192a0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
192b0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
192c0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
192d0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
192e0 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
192f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19320 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
19330 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
19340 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
19350 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
19360 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
19370 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
19380 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
19390 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
193a0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
193b0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
193c0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
193d0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
193e0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
193f0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
19400 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
19410 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
19420 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
19430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19440 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19450 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
19460 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
19470 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
19480 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
19490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
194a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
194b0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
194c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
194d0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
194e0 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
194f0 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
19500 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
19510 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
19520 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
19530 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19540 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
19550 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
19560 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
19570 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
19580 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19590 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
195a0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
195b0 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
195c0 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
195d0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
195e0 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
195f0 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
19600 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
19610 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
19620 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
19630 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
19640 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
19650 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
19660 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
19670 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
19680 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
19690 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
196a0 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
196b0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
196c0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
196d0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
196e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
196f0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
19700 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
19710 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
19720 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
19730 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
19740 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
19750 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
19760 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
19770 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
19780 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
19790 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
197a0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
197b0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
197c0 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
197d0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
197e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
197f0 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
19800 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
19810 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
19820 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
19830 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
19840 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
19850 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
19860 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
19870 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
19880 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
19890 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
198a0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
198b0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
198c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
198d0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
198e0 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
198f0 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
19900 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
19910 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
19920 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
19930 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
19940 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
19950 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
19960 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
19970 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
19980 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
19990 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
199a0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
199b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
199c0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
199d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
199e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
199f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19a00 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
19a10 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
19a20 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
19a30 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
19a40 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
19a50 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
19a60 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
19a70 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
19a80 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
19a90 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
19aa0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
19ab0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
19ac0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
19ad0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
19ae0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
19af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
19b00 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
19b10 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
19b20 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
19b30 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
19b40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19b50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
19b60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
19b70 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
19b80 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
19b90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19ba0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19bb0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
19bc0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
19bd0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
19be0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
19bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
19c00 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
19c10 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
19c20 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
19c30 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
19c40 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
19c50 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
19c60 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
19c70 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
19c80 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
19c90 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
19ca0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
19cb0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
19cc0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
19cd0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
19ce0 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
19cf0 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
19d00 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
19d10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
19d20 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
19d30 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
19d40 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
19d50 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
19d60 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
19d70 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
19d80 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
19d90 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
19da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
19dc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
19dd0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
19de0 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
19df0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
19e00 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
19e10 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
19e20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
19e30 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
19e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19e50 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
19e60 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
19e70 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
19e80 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
19e90 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
19ea0 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
19eb0 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
19ec0 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
19ed0 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
19ee0 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
19ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
19f00 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
19f10 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
19f20 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
19f30 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
19f40 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
19f50 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
19f60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19f70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19f90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
19fa0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
19fb0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
19fc0 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
19fd0 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
19fe0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
19ff0 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1a000 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1a010 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1a020 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1a030 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1a040 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1a050 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1a060 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1a070 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1a080 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1a090 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1a0a0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1a0b0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1a0c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1a0d0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1a0e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1a0f0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1a100 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1a110 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1a120 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1a130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1a140 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1a150 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1a160 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1a170 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1a180 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1a190 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1a1a0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1a1b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a1c0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1a1d0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1a1e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1a1f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1a200 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1a210 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1a220 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1a230 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1a240 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1a250 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1a260 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1a270 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1a280 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1a290 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1a2a0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1a2b0 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1a2c0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1a2d0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1a2e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a2f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a300 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1a310 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1a320 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1a330 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1a340 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1a350 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1a360 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1a370 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1a380 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1a390 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1a3a0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1a3b0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1a3c0 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1a3d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a3e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1a3f0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1a400 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1a410 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1a420 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1a430 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1a440 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1a450 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1a460 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1a470 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1a480 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1a490 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1a4a0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1a4b0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1a4c0 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1a4d0 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1a4e0 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1a4f0 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1a500 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a520 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1a530 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1a540 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1a550 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1a560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a570 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1a580 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1a590 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1a5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a5b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1a5c0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1a5d0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1a5e0 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1a5f0 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1a600 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1a610 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1a620 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1a630 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1a640 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1a650 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1a660 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1a670 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1a680 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1a690 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1a6a0 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1a6b0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1a6c0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1a6d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1a6e0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1a6f0 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1a700 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1a710 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1a720 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1a730 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1a740 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1a750 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1a760 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1a770 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1a780 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1a790 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1a7a0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1a7b0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1a7c0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1a7d0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1a7e0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1a7f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1a800 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1a810 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1a820 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1a830 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1a840 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1a850 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1a860 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1a870 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1a880 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1a890 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1a8a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a8b0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1a8c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1a8d0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1a8e0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1a8f0 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1a900 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a910 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1a920 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1a930 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1a940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1a950 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1a960 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1a970 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1a980 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1a990 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1a9a0 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1a9b0 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1a9c0 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1a9d0 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1a9e0 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1a9f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1aa00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1aa10 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1aa20 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1aa30 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1aa40 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1aa50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aa60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1aa70 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1aa80 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1aa90 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1aaa0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1aab0 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1aac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1aad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aae0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1aaf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ab00 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1ab10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ab20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1ab30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1ab40 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1ab50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1ab60 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1ab70 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1ab80 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1ab90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1aba0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1abb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1abc0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1abd0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1abe0 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1abf0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1ac00 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1ac10 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1ac20 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1ac30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1ac40 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1ac50 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1ac60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1ac70 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1ac80 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1ac90 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1aca0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1acb0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1acc0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1acd0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1ace0 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1acf0 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1ad00 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1ad10 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1ad20 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1ad30 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1ad40 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1ad50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ad60 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ad70 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1ad80 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1ad90 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1ada0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1adb0 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
1adc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1add0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1ade0 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1adf0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1ae00 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1ae10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1ae20 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1ae30 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1ae40 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1ae50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1ae60 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1ae70 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1ae80 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1ae90 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1aea0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1aeb0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1aec0 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1aed0 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
1aee0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
1aef0 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
1af00 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
1af10 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
1af20 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
1af30 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
1af40 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
1af50 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1af60 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
1af70 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1af80 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1af90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1afa0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1afb0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1afc0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1afd0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1afe0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1aff0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1b000 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1b010 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1b020 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1b030 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1b040 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1b050 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1b060 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1b070 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1b080 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b090 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1b0a0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1b0b0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1b0c0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1b0d0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1b0e0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1b0f0 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1b100 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1b110 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1b120 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1b130 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1b140 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1b150 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1b160 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1b170 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1b180 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1b190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1b1a0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1b1b0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1b1c0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1b1d0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1b1e0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1b1f0 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1b200 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1b210 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1b220 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1b230 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1b240 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b250 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1b260 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1b270 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1b280 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1b290 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1b2a0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1b2b0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1b2c0 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1b2d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1b2e0 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1b2f0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1b300 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1b310 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b320 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1b330 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1b340 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1b350 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1b360 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1b370 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1b380 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1b390 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1b3a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b3b0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1b3c0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1b3d0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1b3e0 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1b3f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1b400 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1b410 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1b420 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1b430 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1b440 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1b450 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1b460 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1b470 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1b480 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1b490 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1b4a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1b4b0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1b4c0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1b4d0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1b4e0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1b4f0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1b500 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1b510 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1b520 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1b530 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1b540 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1b550 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1b560 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1b570 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1b580 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1b590 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1b5a0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1b5b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1b5c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1b5d0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1b5e0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1b5f0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1b600 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1b610 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1b620 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1b630 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1b640 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1b650 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1b660 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1b670 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1b680 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1b690 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1b6a0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1b6b0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1b6c0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1b6d0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1b6e0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1b6f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1b700 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1b710 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1b720 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1b730 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1b740 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1b750 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1b760 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1b770 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1b780 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1b790 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1b7a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1b7b0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1b7c0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1b7d0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1b7e0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1b7f0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1b800 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1b810 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1b820 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1b830 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1b840 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1b850 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1b860 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1b870 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1b880 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1b890 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1b8a0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1b8b0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1b8c0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1b8d0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1b8e0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1b8f0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1b900 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1b910 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1b920 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1b930 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1b940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1b950 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1b960 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1b970 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1b980 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b990 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1b9a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b9b0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1b9c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1b9d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b9e0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1b9f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ba00 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1ba10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1ba20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1ba30 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1ba40 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1ba50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ba60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ba70 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ba80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ba90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1baa0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1bab0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1bac0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1bad0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1bae0 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1baf0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1bb00 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1bb10 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1bb20 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1bb30 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1bb40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1bb50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1bb60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1bb70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1bb80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1bb90 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1bba0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1bbb0 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1bbc0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1bbd0 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1bbe0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1bbf0 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1bc00 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1bc10 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1bc20 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1bc30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1bc40 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1bc50 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1bc60 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1bc70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bc80 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1bc90 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1bca0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1bcb0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1bcc0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1bcd0 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1bce0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1bcf0 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1bd00 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1bd10 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1bd20 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1bd30 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1bd40 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1bd50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1bd60 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1bd70 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1bd80 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1bd90 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1bda0 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1bdb0 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1bdc0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1bdd0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1bde0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1bdf0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1be00 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1be10 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1be20 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1be30 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1be40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1be50 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1be60 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1be70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1be80 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1be90 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1bea0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1beb0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1bec0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1bed0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1bee0 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1bef0 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1bf00 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1bf10 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1bf20 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1bf30 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1bf40 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1bf50 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1bf60 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1bf70 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1bf80 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1bf90 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bfa0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1bfb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bfc0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1bfd0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1bfe0 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1bff0 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1c000 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1c010 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1c020 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1c030 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1c040 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1c050 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1c060 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1c070 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1c080 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1c090 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1c0a0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1c0b0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1c0c0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1c0d0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1c0e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1c0f0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1c100 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1c110 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1c120 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1c130 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1c140 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1c150 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1c160 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1c170 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1c180 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1c190 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1c1a0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1c1b0 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1c1c0 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1c1d0 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1c1e0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1c1f0 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1c200 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1c210 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1c220 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1c230 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1c240 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1c250 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1c260 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1c270 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1c280 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1c290 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1c2a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1c2b0 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1c2c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1c2d0 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1c2e0 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1c2f0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1c300 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1c310 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1c320 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1c330 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1c340 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1c350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1c360 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1c370 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1c380 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1c390 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1c3a0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1c3b0 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1c3c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1c3d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1c3e0 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1c3f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1c400 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1c410 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1c420 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1c430 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c440 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1c450 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1c460 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1c470 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1c480 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1c490 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1c4a0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1c4b0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1c4c0 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1c4d0 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1c4e0 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1c4f0 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1c500 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1c510 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1c520 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1c530 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1c540 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1c550 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1c560 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1c570 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1c580 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1c590 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1c5a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1c5b0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1c5c0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1c5d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c5e0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1c5f0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1c600 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1c610 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1c620 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1c630 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1c640 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1c650 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1c660 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1c670 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1c680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c690 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1c6a0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1c6b0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1c6c0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1c6d0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1c6e0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1c6f0 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1c700 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1c710 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1c720 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1c730 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1c740 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1c750 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c760 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1c770 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1c780 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c790 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1c7a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c7b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1c7c0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1c7d0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1c7e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1c7f0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1c800 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1c810 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1c820 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1c830 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1c840 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1c850 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1c860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c870 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1c880 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1c890 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1c8a0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1c8b0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1c8c0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1c8d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1c8e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1c8f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c900 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1c910 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1c920 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1c930 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1c940 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1c950 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1c960 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1c970 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1c980 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1c990 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1c9a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c9b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c9c0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1c9d0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1c9e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c9f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ca00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ca10 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1ca20 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1ca30 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1ca40 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1ca50 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1ca60 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
1ca70 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
1ca80 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
1ca90 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
1caa0 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
1cab0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
1cac0 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
1cad0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1cae0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1caf0 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
1cb00 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
1cb10 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
1cb20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cb30 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
1cb40 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
1cb50 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
1cb60 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
1cb70 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
1cb80 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
1cb90 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
1cba0 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
1cbb0 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
1cbc0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
1cbd0 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
1cbe0 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
1cbf0 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
1cc00 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
1cc10 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
1cc20 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
1cc30 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1cc40 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
1cc50 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
1cc60 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
1cc70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1cc80 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1cc90 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1cca0 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
1ccb0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1ccc0 69 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20  if( pBtree==0 ) 
1ccd0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1cce0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1ccf0 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
1cd00 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
1cd10 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1cd20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1cd30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1cd40 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
1cd50 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
1cd60 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
1cd70 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
1cd80 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69  rCode;.    for(i
1cd90 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
1cda0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1cdb0 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
1cdc0 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  ge[i]);.      p-
1cdd0 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
1cde0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1cdf0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1ce00 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
1ce10 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
1ce20 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
1ce30 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
1ce40 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
1ce50 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
1ce60 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
1ce70 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
1ce80 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
1ce90 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
1cea0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
1ceb0 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
1cec0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
1ced0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
1cee0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1cef0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1cf00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1cf10 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1cf20 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1cf30 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1cf40 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1cf50 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1cf60 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
1cf70 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69  back(Btree *p, i
1cf80 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
1cf90 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1cfa0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1cfb0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1cfc0 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
1cfd0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1cfe0 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
1cff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d000 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
1d010 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1d020 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  t, 0, 0);.  }els
1d030 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1d040 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1d050 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
1d060 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1d070 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
1d080 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20  ripCode);.  }.  
1d090 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1d0a0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
1d0b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1d0c0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
1d0d0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
1d0e0 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
1d0f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1d100 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
1d110 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1d120 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1d130 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
1d140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d150 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
1d160 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
1d170 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
1d180 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
1d190 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
1d1a0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
1d1b0 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
1d1c0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
1d1d0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
1d1e0 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
1d1f0 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
1d200 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
1d210 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1d220 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
1d230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d240 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
1d250 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
1d260 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1d270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d280 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
1d290 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1d2a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1d2b0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1d2c0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1d2d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
1d2e0 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
1d2f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1d300 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
1d310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1d320 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
1d330 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
1d340 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20  lidCursors(pBt, 
1d350 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  1)==0 );.    pBt
1d360 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1d370 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1d380 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1d390 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
1d3a0 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1d3b0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1d3c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1d3d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d3e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
1d3f0 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
1d400 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1d410 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
1d420 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
1d430 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
1d440 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
1d450 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
1d460 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
1d470 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
1d480 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
1d490 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1d4a0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1d4b0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
1d4c0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
1d4d0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
1d4e0 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
1d4f0 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
1d500 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
1d510 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1d520 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
1d530 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
1d540 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
1d550 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
1d560 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
1d570 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
1d580 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
1d590 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
1d5a0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
1d5b0 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
1d5c0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
1d5d0 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
1d5e0 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
1d5f0 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
1d600 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
1d610 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1d620 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
1d630 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
1d640 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1d650 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
1d660 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
1d670 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
1d680 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1d690 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
1d6a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
1d6b0 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
1d6c0 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
1d6d0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
1d6e0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
1d6f0 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
1d700 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1d710 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
1d720 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
1d730 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
1d740 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
1d750 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
1d760 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
1d770 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
1d780 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
1d790 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
1d7a0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
1d7b0 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
1d7c0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1d7d0 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
1d7e0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
1d7f0 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
1d800 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1d810 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1d820 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1d830 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
1d840 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1d850 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1d860 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
1d870 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1d880 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61  _ONLY)==0 );.  a
1d890 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1d8a0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1d8b0 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
1d8c0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
1d8d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1d8e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1d8f0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1d900 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
1d910 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
1d920 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1d930 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
1d940 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
1d950 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
1d960 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
1d970 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
1d980 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
1d990 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
1d9a0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
1d9b0 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
1d9c0 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
1d9d0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
1d9e0 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
1d9f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1da00 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
1da10 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
1da20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1da30 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1da40 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
1da50 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
1da60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1da70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1da80 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1da90 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
1daa0 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
1dab0 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
1dac0 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
1dad0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1dae0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1daf0 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
1db00 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
1db10 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
1db20 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
1db30 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
1db40 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
1db50 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
1db60 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
1db70 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
1db80 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1db90 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
1dba0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
1dbb0 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
1dbc0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
1dbd0 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
1dbe0 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
1dbf0 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
1dc00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1dc10 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1dc20 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
1dc30 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
1dc40 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
1dc50 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
1dc60 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
1dc70 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
1dc80 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
1dc90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
1dca0 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
1dcb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
1dcc0 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
1dcd0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
1dce0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
1dcf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dd00 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
1dd10 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1dd20 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1dd30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1dd40 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
1dd50 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
1dd60 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
1dd70 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
1dd80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
1dd90 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
1dda0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
1ddb0 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
1ddc0 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
1ddd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1dde0 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
1ddf0 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
1de00 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1de10 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
1de20 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1de30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1de40 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
1de50 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
1de60 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
1de70 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
1de80 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1de90 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
1dea0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
1deb0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1dec0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1ded0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
1dee0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1def0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
1df00 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1df10 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
1df20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
1df30 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
1df40 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
1df50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1df60 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
1df70 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
1df80 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
1df90 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
1dfa0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1dfb0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
1dfc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1dfd0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1dfe0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1dff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
1e000 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
1e010 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
1e020 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
1e030 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
1e040 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
1e050 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
1e060 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
1e070 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
1e080 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
1e090 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
1e0a0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1e0b0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
1e0c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
1e0d0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
1e0e0 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
1e0f0 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
1e100 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
1e110 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
1e120 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
1e130 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
1e140 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
1e150 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1e160 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
1e170 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
1e180 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
1e190 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
1e1a0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1e1b0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
1e1c0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
1e1d0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
1e1e0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
1e1f0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
1e200 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
1e210 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
1e220 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
1e230 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
1e240 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
1e250 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
1e260 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1e270 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
1e280 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
1e290 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1e2a0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
1e2b0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
1e2c0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
1e2d0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
1e2e0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
1e2f0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
1e300 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
1e310 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
1e320 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
1e330 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
1e340 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
1e350 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
1e360 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
1e370 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
1e380 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
1e390 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
1e3a0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
1e3b0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1e3c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
1e3d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
1e3e0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
1e3f0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
1e400 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
1e410 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
1e420 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
1e430 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
1e440 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
1e450 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1e460 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
1e470 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
1e480 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
1e490 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
1e4a0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
1e4b0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
1e4c0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
1e4d0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
1e4e0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1e4f0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
1e500 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
1e510 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1e520 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
1e530 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
1e540 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
1e550 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1e560 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
1e570 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
1e580 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1e590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e5b0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1e5c0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1e5f0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1e600 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1e610 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1e640 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1e650 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1e660 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1e670 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1e680 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
1e690 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
1e6a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
1e6d0 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
1e6e0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
1e6f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e710 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
1e720 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73   handle */..  as
1e730 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1e740 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1e750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1e760 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
1e770 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1e780 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1e790 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
1e7a0 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
1e7b0 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
1e7c0 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
1e7d0 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
1e7e0 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
1e7f0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1e800 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
1e810 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
1e820 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
1e830 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
1e840 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
1e850 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
1e860 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
1e870 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
1e880 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
1e890 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
1e8a0 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b  =0, wrFlag+1) );
1e8b0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1e8c0 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
1e8d0 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
1e8e0 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
1e8f0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
1e900 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
1e910 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
1e920 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
1e930 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1e940 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
1e950 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1e960 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
1e970 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1e980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1e990 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
1e9a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1e9b0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72  ..  if( NEVER(wr
1e9c0 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62 74  Flag && (pBt->bt
1e9d0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1e9e0 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20  D_ONLY)!=0) ){. 
1e9f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ea00 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
1ea10 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
1ea20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
1ea30 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
1ea40 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
1ea50 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
1ea60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1ea70 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
1ea80 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
1ea90 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
1eaa0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1eab0 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
1eac0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1ead0 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
1eae0 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
1eaf0 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
1eb00 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
1eb10 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
1eb20 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
1eb30 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
1eb40 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
1eb50 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
1eb60 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
1eb70 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
1eb80 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
1eb90 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1eba0 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
1ebb0 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
1ebc0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73 73  pBt = pBt;.  ass
1ebd0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1ebe0 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57  | wrFlag==BTCF_W
1ebf0 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70 43  riteFlag );.  pC
1ec00 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77  ur->curFlags = w
1ec10 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70  rFlag;.  pCur->p
1ec20 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
1ec30 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  sor;.  if( pCur-
1ec40 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
1ec50 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
1ec60 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70   = pCur;.  }.  p
1ec70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
1ec80 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
1ec90 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1eca0 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  LID;.  return SQ
1ecb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1ecc0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1ecd0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1ed10 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed40 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1ed50 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1ed60 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed90 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1eda0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1edb0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1edc0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1edd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1ede0 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1edf0 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1ee00 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1ee30 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1ee40 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1ee50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1ee60 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1ee70 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1ee80 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1ee90 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1eea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1eeb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1eec0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1eed0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1eee0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1eef0 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1ef00 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1ef10 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1ef20 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1ef30 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1ef40 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1ef50 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1ef60 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1ef70 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1ef80 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1ef90 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1efa0 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1efb0 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1efc0 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1efd0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1efe0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1eff0 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1f000 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1f010 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
1f020 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
1f030 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
1f040 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
1f050 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1f060 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
1f070 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
1f080 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
1f090 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
1f0a0 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
1f0b0 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
1f0c0 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
1f0d0 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
1f0e0 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
1f0f0 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
1f100 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
1f110 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
1f120 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
1f130 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
1f140 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
1f150 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
1f160 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1f170 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
1f180 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
1f190 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
1f1a0 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
1f1b0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1f1c0 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
1f1d0 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
1f1e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
1f1f0 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
1f200 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1f210 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
1f220 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
1f230 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
1f240 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
1f250 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
1f260 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
1f270 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
1f280 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
1f290 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
1f2a0 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
1f2b0 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
1f2c0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1f2d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1f2e0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1f2f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f300 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1f310 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r);.    if( pCur
1f320 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
1f330 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
1f340 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
1f350 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
1f360 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
1f370 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1f380 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1f390 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1f3a0 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1f3b0 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
1f3c0 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  rev;.    }.    f
1f3d0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
1f3e0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1f3f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f400 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
1f410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
1f420 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f430 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
1f440 33 44 62 46 72 65 65 28 70 42 74 72 65 65 2d 3e  3DbFree(pBtree->
1f450 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  db, pCur->aOverf
1f460 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
1f470 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1f480 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1f490 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1f4a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f4b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f4c0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1f4d0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
1f4e0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1f4f0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
1f500 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
1f510 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
1f520 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1f530 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
1f540 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
1f550 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
1f560 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
1f570 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
1f580 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1f590 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1f5a0 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
1f5b0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
1f5c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f5d0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
1f5e0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
1f5f0 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
1f600 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
1f610 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
1f620 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
1f630 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1f640 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
1f650 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
1f660 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1f670 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
1f680 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
1f690 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
1f6a0 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
1f6b0 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
1f6c0 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
1f6d0 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
1f6e0 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
1f6f0 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
1f700 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
1f710 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
1f720 67 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  ggressive inlini
1f730 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1f740 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1f750 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1f760 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1f770 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1f780 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1f790 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1f7a0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1f7b0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1f7c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1f7d0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1f7e0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1f7f0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1f800 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1f810 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1f820 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1f830 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1f840 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1f850 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1f860 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1f870 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
1f880 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1f890 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1f8a0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1f8b0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1f8c0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1f8d0 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1f8e0 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1f8f0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1f900 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1f910 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1f920 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1f930 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1f940 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1f950 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1f960 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1f970 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1f980 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1f990 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1f9a0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1f9b0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1f9c0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1f9d0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1f9e0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1f9f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
1fa00 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
1fa10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fa20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1fa30 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1fa40 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1fa50 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1fa60 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1fa70 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1fa80 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1fa90 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1faa0 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1fab0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1fb00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1fb10 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1fb50 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1fb60 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1fba0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1fbb0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1fbc0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1fbd0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1fbe0 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70  ;        \.    p
1fbf0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
1fc00 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1fc40 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1fc90 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1fca0 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1fce0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
1fcf0 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
1fd00 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
1fd10 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
1fd20 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1fd30 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1fd40 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
1fd50 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
1fd60 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
1fd70 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
1fd80 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
1fd90 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
1fda0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
1fdb0 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
1fdc0 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
1fdd0 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
1fde0 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
1fdf0 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
1fe00 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1fe10 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
1fe20 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1fe30 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
1fe40 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1fe50 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
1fe60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1fe70 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
1fe80 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
1fe90 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1fea0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1feb0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1fec0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1fed0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1fee0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1fef0 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1ff00 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1ff10 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1ff20 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1ff30 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1ff40 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1ff50 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1ff60 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1ff70 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ff80 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1ff90 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1ffa0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1ffb0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1ffc0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
1ffd0 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
1ffe0 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
1fff0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
20000 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
20010 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
20020 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
20030 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
20040 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
20050 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
20060 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
20070 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
20080 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20090 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
200a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
200b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
200c0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
200d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
200e0 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
200f0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
20100 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
20110 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
20120 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
20130 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
20140 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
20150 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
20160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
20180 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
20190 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
201a0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
201b0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
201c0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
201d0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
201e0 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
201f0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
20200 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
20210 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
20220 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
20230 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
20240 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
20250 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
20260 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
20270 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
20280 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
20290 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
202a0 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
202b0 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
202c0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
202d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
202e0 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
202f0 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
20300 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
20310 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
20320 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
20330 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
20340 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
20350 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
20360 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
20370 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
20380 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
20390 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
203a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
203b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
203c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
203d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
203e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
203f0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
20400 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
20410 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b 0a  ntKeyLeaf==1 );.
20420 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
20430 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
20440 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
20450 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
20460 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20470 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
20480 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
20490 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
204a0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
204b0 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
204c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
204d0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
204e0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
204f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
20500 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
20510 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
20520 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
20530 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
20540 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
20550 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
20560 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
20570 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
20580 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
20590 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
205a0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
205b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
205c0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
205d0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
205e0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
205f0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
20600 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
20610 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
20620 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
20630 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
20640 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
20650 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
20660 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
20670 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
20680 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
20690 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
206a0 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
206b0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
206c0 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
206d0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
206e0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
206f0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
20700 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
20710 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
20720 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
20730 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
20740 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
20750 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
20760 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
20770 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
20780 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
20790 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
207a0 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
207b0 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
207c0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
207d0 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
207e0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
207f0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
20800 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
20810 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
20820 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
20830 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
20840 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
20850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20870 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
208a0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
208b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
208c0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
208d0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
208e0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
208f0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
20900 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
20910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
20920 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
20930 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
20940 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
20950 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
20960 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
20970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
20980 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20990 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
209a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
209b0 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
209c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
209d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
209e0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
209f0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
20a00 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
20a10 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
20a20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
20a30 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
20a40 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
20a50 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
20a60 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
20a70 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
20a80 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
20a90 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
20aa0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
20ab0 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
20ac0 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
20ad0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
20ae0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
20af0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
20b00 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
20b10 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
20b20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20b30 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
20b40 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
20b50 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
20b60 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
20b70 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
20b80 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
20b90 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
20ba0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20bb0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
20bc0 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
20bd0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
20be0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
20bf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
20c00 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
20c10 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
20c20 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
20c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20c40 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
20c50 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
20c60 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
20c70 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
20c80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20c90 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
20ca0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
20cb0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
20cc0 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
20cd0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
20ce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20cf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
20d00 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
20d10 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
20d20 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
20d30 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
20d40 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
20d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
20d60 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
20d70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20d80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
20d90 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
20da0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
20db0 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
20dc0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
20dd0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
20de0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
20df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
20e00 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
20e10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
20e20 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
20e30 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
20e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
20e50 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
20e60 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
20e70 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
20e80 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
20e90 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
20ea0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
20eb0 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
20ec0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
20ed0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
20ee0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
20ef0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
20f00 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
20f10 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
20f20 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
20f30 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
20f40 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
20f50 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
20f60 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
20f70 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
20f80 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
20f90 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
20fa0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
20fb0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
20fc0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
20fd0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20fe0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
20ff0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
21000 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
21010 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
21020 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
21030 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
21040 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
21050 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
21060 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
21070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
21080 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
21090 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
210b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
210c0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
210d0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
210e0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
210f0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
21100 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
21110 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
21120 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
21130 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
21140 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
21150 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
21160 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
21170 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
21180 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
21190 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
211a0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
211b0 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
211c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
211d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
211e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
211f0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
21200 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
21210 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
21220 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
21230 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
21240 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
21250 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
21260 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
21270 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
21280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
21290 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
212a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
212b0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
212c0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
212d0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
212e0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
212f0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
21300 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
21310 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
21320 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
21330 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
21340 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
21350 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
21360 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
21370 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
21380 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
21390 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
213a0 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
213b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
213c0 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65  che..**   2: The
213d0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
213e0 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70  read. Do not pop
213f0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
21400 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
21410 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
21420 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
21430 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
21440 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
21450 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
21460 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
21470 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
21480 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
21490 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
214a0 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
214b0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
214c0 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
214d0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
214e0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
214f0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
21500 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
21510 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
21520 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
21530 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ow pages and the
21540 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e 74  .** eOp argument
21550 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73 20   is not 2, this 
21560 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c  function may all
21570 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
21580 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70  and lazily .** p
21590 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76 65  opulates the ove
215a0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
215b0 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
215c0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
215d0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
215e0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
215f0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
21600 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
21610 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
21620 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
21630 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
21640 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
21650 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
21660 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
21670 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
21680 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
21690 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
216a0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
216b0 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
216c0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
216d0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
216e0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
216f0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
21700 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
21710 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
21720 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
21730 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
21740 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
21750 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
21760 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
21770 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
21780 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
21790 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
217a0 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
217b0 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
217c0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
217d0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
217e0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
217f0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
21800 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
21810 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
21820 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
21830 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
21840 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
21850 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
21860 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
21870 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
21880 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
21890 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
218a0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
218b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
218c0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
218d0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
218e0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
218f0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
21900 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
21910 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
21920 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
21930 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
21940 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
21950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
21960 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
21970 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
21980 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21990 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72  ->iPage]; /* Btr
219a0 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
219b0 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
219c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
219d0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
219e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
219f0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
21a00 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66  elongs to */.#if
21a10 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
21a20 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
21a30 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21a40 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72  * const pBufStar
21a50 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74 20  t = pBuf;.  int 
21a60 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  bEnd;           
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21a90 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64 20   reading to end 
21aa0 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69  of data */.#endi
21ab0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
21ac0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
21ad0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21ae0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21af0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
21b00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21b10 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
21b20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21b30 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21b40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
21b50 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d  Op!=2 || offset=
21b60 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61  =0 );    /* Alwa
21b70 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62 65  ys start from be
21b80 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d  ginning for eOp=
21b90 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c  =2 */..  getCell
21ba0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
21bb0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
21bc0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69  nfo.pPayload;.#i
21bd0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
21be0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
21bf0 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65 74  .  bEnd = offset
21c00 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f  +amt==pCur->info
21c10 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69  .nPayload;.#endi
21c20 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  f.  assert( offs
21c30 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
21c40 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
21c50 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c 6f 61  ..  if( &aPayloa
21c60 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
21c70 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
21c80 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
21c90 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20  Size] ){.    /* 
21ca0 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
21cb0 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
21cc0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
21cd0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
21ce0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21cf0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21d00 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
21d10 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
21d20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
21d30 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
21d40 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
21d50 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
21d60 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
21d70 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
21d80 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
21d90 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
21da0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
21db0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
21dc0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
21dd0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
21de0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
21df0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
21e00 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31  , a, (eOp & 0x01
21e10 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ), pPage->pDbPag
21e20 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
21e30 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
21e40 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
21e50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
21e60 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
21e70 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
21e80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21e90 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
21ea0 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
21eb0 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
21ec0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
21ed0 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
21ee0 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
21ef0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
21f00 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
21f10 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
21f20 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
21f30 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20  o.nLocal]);..   
21f40 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72   /* If the BtCur
21f50 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  sor.aOverflow[] 
21f60 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
21f70 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
21f80 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20   it now..    ** 
21f90 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61  Except, do not a
21fa0 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f  llocate aOverflo
21fb0 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a  w[] for eOp==2..
21fc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21fd0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
21fe0 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
21ff0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
22000 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
22010 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
22020 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
22030 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
22040 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
22050 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
22060 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
22070 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
22080 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
22090 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
220a0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
220b0 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
220c0 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
220d0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
220e0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
220f0 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70  if( eOp!=2 && (p
22100 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
22110 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
22120 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
22130 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
22140 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
22150 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
22160 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
22170 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
22180 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c  Ovfl>pCur->nOvfl
22190 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
221a0 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
221b0 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62 52 65  gno*)sqlite3DbRe
221c0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
221d0 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d     pCur->pBtree-
221e0 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72  >db, pCur->aOver
221f0 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
22200 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
22210 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
22220 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
22230 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22240 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22260 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c     pCur->nOvflAl
22270 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20  loc = nOvfl*2;. 
22280 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
22290 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
222a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
222b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
222c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
222d0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
222e0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
222f0 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
22300 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43  no));.        pC
22310 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
22320 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
22330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
22340 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
22350 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
22360 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
22370 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
22380 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
22390 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
223a0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
223b0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
223c0 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
223d0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
223e0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
223f0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
22400 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20  alidOvfl)!=0.   
22410 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72    && pCur->aOver
22420 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
22430 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20  Size].    ){.   
22440 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
22450 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
22460 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
22470 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
22480 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
22490 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
224a0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Size);.    }..  
224b0 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
224c0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
224d0 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
224e0 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20  x++){..      /* 
224f0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
22500 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
22510 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
22520 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
22530 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
22540 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
22550 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
22560 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
22570 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
22580 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
22590 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
225a0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
225b0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
225c0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
225d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
225e0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
225f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
22600 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
22610 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
22620 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
22630 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
22640 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
22650 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
22660 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
22670 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
22680 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
22690 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
226a0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
226b0 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
226c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
226d0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
226e0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
226f0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
22700 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
22710 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
22720 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
22730 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
22740 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  t the aOverflow[
22750 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20  ] array must be 
22760 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73  allocated becaus
22770 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20  e eOp!=2.       
22780 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f   ** here.  If eO
22790 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65  p==2, then offse
227a0 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72  t==0 and this br
227b0 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61  anch is never ta
227c0 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ken..        */.
227d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
227e0 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20  eOp!=2 );.      
227f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22800 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
22810 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
22820 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
22830 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
22840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
22850 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
22860 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
22870 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22880 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22890 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
228a0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
228b0 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
228c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
228d0 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
228e0 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
228f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
22900 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
22910 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
22920 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
22930 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
22940 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
22950 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
22960 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
22970 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
22980 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
22990 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
229a0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
229b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
229c0 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20  e *fd;.#endif.  
229d0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
229e0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
229f0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
22a00 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
22a10 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
22a20 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
22a30 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
22a40 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
22a50 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
22a60 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
22a70 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
22a80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
22a90 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
22aa0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
22ab0 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
22ac0 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
22ad0 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
22ae0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
22af0 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
22b00 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
22b10 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61     3) the databa
22b20 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
22b30 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
22b40 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20  *   4) there is 
22b50 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72  no open write-tr
22b60 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
22b70 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
22b80 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
22b90 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  ot a WAL databas
22ba0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  e,.        **   
22bb0 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  6) all data from
22bc0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
22bd0 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20  ng read..       
22be0 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73   **   7) at leas
22bf0 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
22c00 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
22c10 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
22c20 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
22c30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
22c40 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
22c50 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
22c60 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
22c70 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
22c80 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
22c90 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
22ca0 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
22cb0 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
22cc0 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
22cd0 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
22ce0 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
22cf0 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
22d00 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
22d10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
22d20 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30  f( (eOp&0x01)==0
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
22d60 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
22d70 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22da0 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
22db0 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d    && (bEnd || a=
22dc0 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20  =ovflSize)      
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
22df0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
22e00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22e10 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
22e40 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
22e50 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
22e60 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
22e70 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29  thods     /* (3)
22e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
22e90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
22ea0 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20  ta[19]==0x01    
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
22ed0 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
22ee0 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22f10 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  7) */.        ){
22f20 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
22f30 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
22f40 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
22f50 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
22f60 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
22f70 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63           /* henc
22fa0 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  e (7) */.       
22fb0 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
22fc0 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
22fd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22fe0 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
22ff0 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
23000 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
23010 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
23020 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
23030 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
23040 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
23050 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
23060 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
23070 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
23080 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
23090 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
230a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
230b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
230c0 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
230d0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
230e0 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
230f0 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29       ((eOp&0x01)
23100 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
23110 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
23120 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
23130 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23150 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
23160 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
23170 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
23180 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
23190 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
231a0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
231b0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
231c0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
231d0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
231e0 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c  , a, (eOp&0x01),
231f0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
23200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
23210 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
23220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
23230 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
23240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23250 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
23260 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  a;.        pBuf 
23270 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
23280 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
23290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
232a0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
232b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
232c0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
232d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
232e0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
232f0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
23300 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
23310 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
23320 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
23330 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64  l be transferred
23340 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
23350 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
23360 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
23370 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  "..**.** The cal
23380 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
23390 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
233a0 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
233b0 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74   row.** in the t
233c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  able..**.** Retu
233d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
233e0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
233f0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
23400 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
23410 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
23420 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
23430 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
23440 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
23450 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
23460 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
23470 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
23480 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
23490 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
234a0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
234b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
234c0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
234d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
234e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
234f0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
23500 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
23510 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
23520 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
23530 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23540 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23550 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
23560 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
23570 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
23580 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
23590 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
235a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
235b0 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
235c0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
235d0 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
235e0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
235f0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
23600 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
23610 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
23620 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
23630 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
23640 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
23650 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
23660 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
23670 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
23680 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
23690 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
236a0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
236b0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
236c0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
236d0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
236e0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
236f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23700 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
23710 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
23720 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
23730 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
23740 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
23750 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
23760 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
23770 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23780 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
23790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
237a0 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
237b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
237c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
237d0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
237e0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
237f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
23800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23810 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23820 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23830 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
23840 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23850 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
23860 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23870 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23880 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23890 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
238a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
238b0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
238c0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
238d0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
238e0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
238f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23910 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
23920 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
23930 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
23940 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
23950 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
23960 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
23970 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
23980 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
23990 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64  * the key if ind
239a0 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65  ex btrees (pPage
239b0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64  ->intKey==0) and
239c0 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72   is the data for
239d0 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73  .** table btrees
239e0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
239f0 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  =1). The number 
23a00 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
23a10 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74  lable.** key/dat
23a20 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
23a30 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
23a40 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
23a50 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65  value.** returne
23a60 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20  d will not be a 
23a70 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
23a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23a90 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
23aa0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
23ab0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
23ac0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
23ad0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
23ae0 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
23af0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
23b00 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
23b10 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
23b20 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
23b30 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
23b40 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
23b50 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
23b60 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
23b70 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
23b80 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
23b90 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
23ba0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
23bb0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
23bc0 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
23bd0 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
23be0 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
23bf0 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
23c00 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
23c10 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
23c20 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
23c30 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
23c40 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
23c50 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
23c60 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
23c70 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
23c80 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
23c90 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
23ca0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
23cb0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
23cc0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
23cd0 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68  onst void *fetch
23ce0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
23cf0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
23d00 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
23d10 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
23d20 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
23d30 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20  2 *pAmt         
23d40 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
23d50 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
23d60 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
23d70 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
23d80 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
23d90 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
23da0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23db0 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
23dc0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23dd0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23de0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23df0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
23e00 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
23e10 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
23e20 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23e30 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23e40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
23e50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
23e60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23e70 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
23e80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23e90 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
23ea0 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43   );.  *pAmt = pC
23eb0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
23ec0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
23ed0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  )pCur->info.pPay
23ee0 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
23ef0 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
23f00 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
23f10 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
23f20 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
23f30 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
23f40 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
23f50 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
23f60 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
23f70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
23f80 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
23f90 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
23fa0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
23fb0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
23fc0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
23fd0 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
23fe0 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
23ff0 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
24000 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
24010 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
24020 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
24030 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
24040 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
24050 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
24060 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
24070 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
24080 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
24090 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
240a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
240b0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
240c0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
240d0 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
240e0 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
240f0 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
24100 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
24110 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
24120 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
24130 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
24140 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
24150 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
24160 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
24170 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
24180 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63  pCur, pAmt);.}.c
24190 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
241a0 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
241b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
241c0 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
241d0 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
241e0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
241f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
24200 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
24210 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
24220 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
24230 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
24240 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
24250 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
24260 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
24270 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24280 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
24290 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
242a0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
242b0 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
242c0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
242d0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
242e0 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
242f0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
24300 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
24310 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
24320 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
24330 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
24340 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
24350 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
24360 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
24370 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
24380 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
24390 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
243a0 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
243b0 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
243c0 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
243d0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
243e0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
243f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24400 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24410 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24420 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24440 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
24450 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
24460 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
24470 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
24480 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
24490 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
244a0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
244b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
244c0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
244d0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
244e0 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
244f0 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20 20 20  &pNewPage,.     
24500 20 20 20 20 20 20 20 20 20 20 28 70 43 75 72 2d            (pCur-
24510 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
24520 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f  _WriteFlag)==0 ?
24530 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
24540 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  NLY : 0);.  if( 
24550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24560 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
24570 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  +1] = pNewPage;.
24580 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b    pCur->aiIdx[i+
24590 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  1] = 0;.  pCur->
245a0 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72  iPage++;..  pCur
245b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
245c0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
245d0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
245e0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
245f0 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 4e  dOvfl);.  if( pN
24600 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
24610 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74  || pNewPage->int
24620 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  Key!=pCur->apPag
24630 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[i]->intKey ){.
24640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24650 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
24670 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30  ITE_OK;.}..#if 0
24680 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
24690 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
246a0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
246b0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
246c0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
246d0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
246e0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
246f0 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
24700 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
24710 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
24720 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
24730 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
24740 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
24750 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
24760 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
24770 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
24780 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
24790 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
247a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
247b0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
247c0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
247d0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
247e0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
247f0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
24800 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
24810 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
24820 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
24830 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
24840 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
24850 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
24860 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
24870 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24880 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
24890 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
248a0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
248b0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
248c0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
248d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
248e0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
248f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
24900 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
24910 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
24920 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
24930 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
24940 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
24950 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
24960 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
24970 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
24980 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
24990 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
249a0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
249b0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
249c0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
249d0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
249e0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
249f0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
24a00 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
24a10 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
24a20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
24a30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24a40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24a50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24a60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
24a70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
24a80 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
24a90 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
24aa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
24ab0 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49  ..  /* UPDATE: I
24ac0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f  t is actually po
24ad0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63  ssible for the c
24ae0 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20  ondition tested 
24af0 62 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20  by the assert.  
24b00 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75  ** below to be u
24b10 6e 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74  ntrue if the dat
24b20 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
24b30 72 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20  rrupt. This can 
24b40 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e  occur if.  ** on
24b50 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64  e cursor has mod
24b60 69 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65  ified page pPare
24b70 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72  nt while a refer
24b80 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65  ence to it is he
24b90 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65  ld .  ** by a se
24ba0 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69  cond cursor. Whi
24bb0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
24bc0 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  en if a single p
24bd0 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20  age is linked.  
24be0 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ** into more tha
24bf0 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
24c00 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72  ucture in a corr
24c10 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a  upt database.  *
24c20 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
24c30 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
24c40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24c50 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
24c60 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
24c70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
24c80 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
24c90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
24ca0 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  gno.  );.#endif.
24cb0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
24cc0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24cd0 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
24ce0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24cf0 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  e-1]->nCell );..
24d00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
24d10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24d20 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
24d30 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
24d40 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24d50 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
24d60 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
24d70 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
24d80 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  idOvfl);.}../*.*
24d90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
24da0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
24db0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
24dc0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
24dd0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
24de0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
24df0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
24e00 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
24e10 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
24e20 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
24e30 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
24e40 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
24e50 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
24e60 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
24e70 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
24e80 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
24e90 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
24ea0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
24eb0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
24ec0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
24ed0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
24ee0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
24ef0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
24f00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
24f10 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
24f20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
24f30 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
24f40 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
24f50 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
24f60 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
24f70 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
24f80 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
24f90 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
24fa0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
24fb0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
24fc0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
24fd0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
24fe0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
24ff0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
25000 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
25010 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
25020 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
25030 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
25040 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
25050 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
25060 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
25070 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
25080 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
25090 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
250a0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
250b0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
250c0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
250d0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
250e0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
250f0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
25100 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
25110 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
25120 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
25130 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
25140 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
25150 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
25160 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
25170 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
25180 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
25190 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
251a0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
251b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
251c0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
251d0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
251e0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
251f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25200 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25210 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25220 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
25230 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
25240 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
25250 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
25260 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
25270 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
25280 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
25290 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
252a0 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
252b0 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
252c0 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
252d0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
252e0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
252f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
25300 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
25310 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
25320 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
25330 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25340 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
25350 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25360 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
25370 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
25380 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
25390 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
253a0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72   pCur->iPage ) r
253b0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
253c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
253d0 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65  age--]);.  }else
253e0 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
253f0 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
25400 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
25410 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
25420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25430 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
25440 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
25450 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
25460 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
25470 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
25480 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20  Page[0],.       
25490 20 20 20 20 20 20 20 20 20 20 28 70 43 75 72 2d            (pCur-
254a0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
254b0 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f  _WriteFlag)==0 ?
254c0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
254d0 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  NLY : 0);.    if
254e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
254f0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
25500 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
25510 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
25520 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
25530 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
25540 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20   0;.  }.  pRoot 
25550 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
25560 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
25570 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
25580 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
25590 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
255a0 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
255b0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
255c0 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
255d0 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
255e0 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
255f0 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
25600 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
25610 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
25620 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
25630 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
25640 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
25650 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
25660 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
25670 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
25680 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
25690 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
256a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
256b0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
256c0 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
256d0 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
256e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
256f0 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
25700 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
25710 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
25720 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
25730 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
25740 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
25750 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
25760 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
25770 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
25780 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
25790 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
257a0 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
257b0 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
257c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
257d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
257e0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
257f0 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
25800 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
25810 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
25820 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
25830 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
25840 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
25850 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25860 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  BKPT;.  }..  pCu
25870 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
25880 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
25890 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
258a0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
258b0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
258c0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
258d0 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66  alidOvfl);..  if
258e0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
258f0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
25900 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
25910 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
25920 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
25930 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
25940 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
25950 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
25960 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25970 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
25980 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
25990 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
259a0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
259b0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
259c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
259d0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
259e0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
259f0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
25a00 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
25a10 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
25a20 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
25a30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
25a40 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
25a50 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
25a60 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
25a70 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
25a80 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
25a90 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
25aa0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
25ab0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
25ac0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
25ad0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
25ae0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
25af0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
25b00 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
25b10 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
25b20 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
25b30 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
25b40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25b50 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
25b60 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
25b70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25b80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25b90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25ba0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25bb0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
25bc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
25bd0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
25be0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25bf0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
25c00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25c10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25c20 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
25c30 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
25c40 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
25c50 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
25c60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
25c70 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
25c80 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
25c90 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
25ca0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
25cb0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
25cc0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
25cd0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
25ce0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
25cf0 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
25d00 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
25d10 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
25d20 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
25d30 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
25d40 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
25d50 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
25d60 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
25d70 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
25d80 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
25d90 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
25da0 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
25db0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
25dc0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
25dd0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
25de0 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
25df0 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
25e00 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
25e10 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
25e20 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
25e30 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
25e40 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
25e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
25e60 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
25e70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25e80 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
25e90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25ea0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
25eb0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
25ec0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25ed0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25ee0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25ef0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25f00 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
25f10 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
25f20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25f30 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
25f40 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
25f50 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
25f60 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
25f70 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
25f80 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25f90 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
25fa0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
25fb0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
25fc0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
25fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25fe0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
25ff0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
26000 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
26010 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
26020 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
26030 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
26040 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26050 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
26060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26070 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
26080 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
26090 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
260a0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
260b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
260c0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
260d0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
260e0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
260f0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
26100 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
26110 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
26120 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
26130 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
26140 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
26150 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
26160 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
26170 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26180 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26190 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
261a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
261b0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
261c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
261d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
261e0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
261f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26200 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
26210 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
26220 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
26230 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
26240 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
26250 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26260 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
26270 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
26280 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
26290 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
262a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
262b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
262c0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
262d0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
262e0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
262f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
26300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26310 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
26320 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
26330 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
26340 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
26350 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
26360 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
26370 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
26380 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
26390 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
263a0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
263b0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
263c0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
263d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
263e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
263f0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
26400 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
26410 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26420 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26430 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
26440 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
26450 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
26460 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
26470 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
26480 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
26490 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
264a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
264b0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
264c0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
264d0 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
264e0 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
264f0 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
26500 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
26510 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
26520 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
26530 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
26540 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
26550 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
26560 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
26570 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
26580 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
26590 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
265a0 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
265b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
265c0 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
265d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
265e0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
265f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
26600 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26610 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
26620 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26630 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
26640 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
26650 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26660 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
26670 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
26680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
26690 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
266a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
266b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
266c0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
266d0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
266e0 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
266f0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
26700 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
26710 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26720 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
26730 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
26740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26750 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26760 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
26770 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
26780 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
26790 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
267a0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
267b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
267c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
267d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
267e0 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
267f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26800 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
26810 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
26820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
26830 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26840 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
26850 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
26860 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
26870 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
26880 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
26890 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
268a0 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
268b0 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
268c0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
268d0 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
268e0 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
268f0 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
26900 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
26910 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
26920 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
26930 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
26940 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
26950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
26960 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
26970 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
26980 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
26990 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
269a0 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
269b0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
269c0 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
269d0 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
269e0 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
269f0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
26a00 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
26a10 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
26a20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
26a30 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
26a40 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
26a50 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
26a60 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
26a70 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
26a80 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
26a90 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
26aa0 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
26ab0 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
26ac0 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
26ad0 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
26ae0 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
26af0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
26b00 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
26b10 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
26b20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
26b30 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26b50 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
26b60 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
26b70 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
26b80 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
26b90 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
26ba0 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
26bb0 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
26bc0 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
26bd0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
26be0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
26bf0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
26c00 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
26c10 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
26c20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
26c30 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
26c40 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
26c50 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
26c60 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
26c70 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
26c80 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
26ca0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
26cb0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
26cc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26cd0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
26ce0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
26cf0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
26d00 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
26d10 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
26d20 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
26d30 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
26d40 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
26d50 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
26d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26d70 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
26d80 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
26d90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
26da0 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
26db0 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
26dc0 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
26dd0 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
26de0 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
26df0 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
26e00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
26e10 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20    RecordCompare 
26e20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  xRecordCompare;.
26e30 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26e40 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26e50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
26e60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26e70 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
26e80 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
26e90 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
26ea0 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
26eb0 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
26ec0 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
26ed0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
26ee0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
26ef0 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
26f00 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
26f10 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
26f20 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
26f30 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
26f40 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
26f50 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
26f60 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
26f70 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
26f80 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
26f90 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70  NKey)!=0.   && p
26fa0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
26fb0 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
26fc0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
26fd0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
26fe0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
26ff0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27000 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
27010 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
27020 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
27030 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72  Last)!=0 && pCur
27040 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
27050 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
27060 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
27070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27080 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
27090 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
270a0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
270b0 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
270c0 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
270d0 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
270e0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
270f0 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
27100 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
27110 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
27120 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
27130 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
27140 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
27150 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
27160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
27170 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
27180 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
27190 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
271a0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
271b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
271c0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
271d0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
271e0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
271f0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
27200 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27210 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
27220 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
27230 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
27240 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
27250 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
27260 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27270 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
27280 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
27290 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
272a0 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
272b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
272c0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
272d0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
272e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
272f0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
27300 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27310 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27320 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
27330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
27340 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27350 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
27360 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
27370 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
27380 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
27390 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
273a0 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
273b0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
273c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
273d0 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70  Page];.    u8 *p
273e0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27400 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
27410 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
27420 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
27430 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
27440 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
27450 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
27460 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
27470 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
27480 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
27490 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
274a0 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
274b0 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
274c0 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
274d0 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
274e0 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
274f0 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
27500 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
27510 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
27520 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
27530 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
27540 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
27550 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
27560 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
27570 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
27580 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
27590 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
275a0 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
275b0 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
275c0 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
275d0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
275e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
275f0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
27600 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
27610 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
27620 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
27630 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
27640 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
27650 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
27660 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
27670 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
27680 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
27690 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
276a0 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
276b0 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
276c0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  */.    pCur->aiI
276d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
276e0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
276f0 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
27700 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
27710 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
27720 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
27730 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
27740 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
27750 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
27760 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
27770 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
27780 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  KeyLeaf ){.     
27790 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30       while( 0x80
277a0 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29   <= *(pCell++) )
277b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
277c0 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e  ( pCell>=pPage->
277d0 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72  aDataEnd ) retur
277e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
277f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
27800 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27810 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
27820 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
27830 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
27840 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
27850 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
27860 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
27870 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
27880 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
27890 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
278a0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
278b0 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
278c0 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
278d0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
278e0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
278f0 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
27900 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
27920 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
27930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
27940 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
27950 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
27960 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
27970 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
27980 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
27990 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
279a0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
279b0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
279c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
279d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
279e0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
279f0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27a00 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
27a10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27a20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
27a30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
27a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
27a60 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
27a70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27a90 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
27aa0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
27ab0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
27ac0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
27ad0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
27ae0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
27af0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
27b00 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a       int nCell;.
27b10 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
27b20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
27b30 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
27b40 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20  ildPtrSize;..   
27b50 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
27b60 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
27b70 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
27b80 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
27b90 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
27ba0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
27bb0 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
27bc0 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
27bd0 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
27be0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
27bf0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
27c00 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
27c10 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
27c20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
27c30 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
27c40 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
27c50 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
27c60 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
27c70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
27c80 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
27c90 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
27ca0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
27cb0 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
27cc0 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
27cd0 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
27ce0 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
27cf0 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
27d00 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
27d10 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
27d20 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
27d30 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
27d40 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
27d50 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
27d60 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
27d70 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
27d80 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
27d90 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
27da0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
27db0 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
27dc0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
27dd0 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
27de0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
27df0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
27e00 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
27e10 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
27e20 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
27e30 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
27e40 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
27e50 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
27e60 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
27e70 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
27e80 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
27e90 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
27ea0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
27eb0 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
27ec0 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
27ed0 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
27ee0 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
27ef0 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
27f00 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
27f10 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
27f20 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
27f30 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
27f40 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
27f50 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
27f60 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
27f70 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
27f80 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
27f90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27fa0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
27fb0 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
27fc0 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
27fd0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
27fe0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
27ff0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
28000 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
28010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
28020 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
28030 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
28040 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
28050 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
28060 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
28070 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
28080 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
28090 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
280a0 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
280b0 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
280c0 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
280d0 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
280e0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
280f0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
28100 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
28110 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
28120 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
28130 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
28140 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
28150 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
28160 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
28170 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
28180 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
28190 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
281a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
281b0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
281c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
281d0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
281e0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
281f0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
28200 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
28210 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
28220 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
28230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
28250 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
28260 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
28270 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
28280 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
28290 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
282a0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
282b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
282c0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
282d0 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
282e0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
282f0 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20  llKey, 2);.     
28300 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
28310 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28320 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
28330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
28340 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
28350 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
28360 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
28370 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
28380 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
28390 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
283a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
283b0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
283c0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
283d0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
283e0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
283f0 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
28400 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
28410 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
28420 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
28430 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
28440 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
28450 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
28460 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
28470 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
28480 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
28490 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
284a0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
284b0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
284c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
284d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
284e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
284f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28500 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28510 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
28520 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28530 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
28540 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
28550 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
28560 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
28570 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
28580 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
28590 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
285a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
285b0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
285c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
285d0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
285e0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
285f0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
28600 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
28610 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
28620 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
28630 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
28640 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
28650 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
28660 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28670 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
28680 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
28690 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
286a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
286b0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
286c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
286d0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
286e0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
286f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
28700 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
28710 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
28720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28730 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
28740 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
28750 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
28760 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
28770 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
28780 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
28790 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
287a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
287b0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
287c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
287d0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
287e0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
287f0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
28800 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28810 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
28820 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
28830 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
28840 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
28850 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
28860 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
28870 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
28880 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
28890 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
288a0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
288b0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
288c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
288d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
288e0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
288f0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
28900 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
28910 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
28920 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
28930 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
28940 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
28950 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
28960 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
28970 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
28980 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
28990 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
289a0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
289b0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
289c0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
289d0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
289e0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
289f0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
28a00 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
28a10 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
28a20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
28a30 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28a40 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
28a50 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
28a60 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
28a70 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
28a80 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
28a90 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
28aa0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
28ab0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
28ac0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
28ad0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
28ae0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
28af0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
28b00 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
28b10 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
28b20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
28b30 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
28b40 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
28b50 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
28b60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
28b70 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
28b80 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
28b90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
28ba0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
28bb0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
28bc0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
28bd0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
28be0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
28bf0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
28c00 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
28c10 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
28c20 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
28c30 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
28c40 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
28c50 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
28c60 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
28c70 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
28c80 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
28c90 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
28ca0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
28cb0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
28cc0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
28cd0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
28ce0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
28cf0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
28d00 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
28d10 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
28d20 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
28d30 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
28d40 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
28d50 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
28d60 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
28d70 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
28d80 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
28d90 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
28da0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
28db0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
28dc0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
28dd0 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
28de0 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
28df0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
28e00 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
28e10 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
28e20 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
28e30 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
28e40 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
28e50 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
28e60 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
28e70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
28e80 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
28e90 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
28ea0 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
28eb0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
28ec0 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
28ed0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
28ee0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
28ef0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
28f00 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
28f10 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
28f20 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
28f30 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
28f40 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
28f50 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
28f60 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
28f70 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
28f80 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
28f90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
28fa0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
28fb0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
28fc0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28fd0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28fe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
28ff0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
29000 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
29010 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
29020 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
29030 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
29040 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
29050 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
29060 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
29070 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
29080 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
29090 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
290a0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
290b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
290c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
290d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
290e0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
290f0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
29100 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
29110 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
29120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29140 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
29150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29160 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29170 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
29180 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29190 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
291a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
291b0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
291c0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
291d0 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
291e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
291f0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
29200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29210 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
29220 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
29230 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
29240 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
29250 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29260 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
29270 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
29280 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
29290 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
292a0 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
292b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
292c0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
292d0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
292e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
292f0 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
29300 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
29310 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
29320 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
29330 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
29340 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
29350 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
29360 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
29370 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
29380 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
29390 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
293a0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
293b0 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
293c0 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
293d0 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
293e0 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
293f0 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
29400 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
29410 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
29420 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
29430 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
29440 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
29450 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
29460 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
29470 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
29480 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
29490 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
294a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
294b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
294c0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
294d0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
294e0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
294f0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
29500 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
29510 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
29520 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29530 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
29540 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29550 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
29560 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
29570 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
29580 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
29590 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
295a0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
295b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
295c0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
295d0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
295e0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
295f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
29600 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
29610 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
29620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
29630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29640 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
29650 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
29660 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29670 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
29680 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
29690 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
296a0 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33   }.}.int sqlite3
296b0 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
296c0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
296d0 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Res){.  MemPage 
296e0 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
296f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
29700 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
29710 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
29720 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
29730 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
29740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29750 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
29760 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
29770 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29780 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
29790 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
297a0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
297b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
297c0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
297d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
297e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
297f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
29800 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
29810 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
29820 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29830 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
29840 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
29850 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29860 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
29870 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
29880 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29890 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
298a0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
298b0 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
298c0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
298d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
298e0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
298f0 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
29900 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
29910 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
29920 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
29930 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
29940 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
29950 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
29960 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
29970 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
29980 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
29990 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
299a0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
299b0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
299c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
299d0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
299e0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
299f0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
29a00 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
29a10 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
29a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
29a30 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
29a40 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
29a50 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
29a60 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
29a70 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
29a80 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
29a90 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
29aa0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
29ab0 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
29ac0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
29ad0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
29ae0 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
29af0 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
29b00 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
29b10 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
29b20 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
29b30 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
29b40 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
29b50 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
29b60 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
29b70 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
29b80 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
29b90 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
29ba0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
29bb0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
29bc0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
29bd0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
29be0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
29bf0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
29c00 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
29c10 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
29c20 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
29c30 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
29c40 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
29c50 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
29c60 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
29c70 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
29c80 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
29c90 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
29ca0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
29cb0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
29cc0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
29cd0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
29ce0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
29cf0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
29d00 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
29d10 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
29d20 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
29d30 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
29d40 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
29d50 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
29d60 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
29d70 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
29d80 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
29d90 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
29da0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
29db0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
29dc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
29dd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
29de0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
29df0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
29e00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29e10 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
29e20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
29e30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29e40 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
29e50 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
29e60 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29e70 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
29e80 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
29e90 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
29ea0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
29eb0 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
29ec0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29ed0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
29ee0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
29ef0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
29f00 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
29f10 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
29f20 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
29f30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29f40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29f50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
29f60 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
29f70 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
29f80 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
29f90 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
29fa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
29fb0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
29fc0 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
29fd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29fe0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29ff0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2a000 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2a010 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2a020 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2a030 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2a040 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2a050 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
2a060 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2a070 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2a080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2a0a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2a0b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2a0c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2a0d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2a0f0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2a100 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2a110 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
2a120 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2a130 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
2a140 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2a150 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
2a160 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2a170 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
2a180 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2a190 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2a1a0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2a1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
2a1c0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2a1d0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
2a1e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2a1f0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2a200 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2a210 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2a220 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
2a230 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2a240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a260 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2a270 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
2a280 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2a290 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
2a2a0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2a2b0 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2a2c0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2a2d0 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
2a2e0 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
2a2f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2a300 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
2a310 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a320 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
2a330 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2a340 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
2a350 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2a360 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2a370 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
2a380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a3a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a3b0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
2a3c0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2a3d0 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2a3e0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2a3f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2a400 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2a410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2a420 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2a430 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2a440 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2a450 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2a460 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2a470 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2a480 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
2a490 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2a4a0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2a4b0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2a4c0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2a4d0 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  Key);.  pCur->in
2a4e0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2a4f0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2a500 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20  !=CURSOR_VALID. 
2a510 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78    || pCur->aiIdx
2a520 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2a530 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  .   || pCur->apP
2a540 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a550 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20  ->leaf==0.  ){. 
2a560 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
2a570 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2a580 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  es);.  }.  pCur-
2a590 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a5a0 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  ge]--;.  return 
2a5b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2a5c0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
2a5d0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
2a5e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2a5f0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
2a600 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
2a610 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
2a620 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
2a630 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
2a640 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2a650 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
2a660 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
2a670 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
2a680 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
2a690 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
2a6a0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
2a6b0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
2a6c0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
2a6d0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2a6e0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
2a6f0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
2a700 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2a710 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2a720 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
2a730 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
2a740 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
2a750 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
2a760 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
2a770 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
2a780 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
2a790 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
2a7a0 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
2a7b0 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
2a7c0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
2a7d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2a7e0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
2a7f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
2a800 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
2a810 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
2a820 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
2a830 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
2a840 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
2a850 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
2a860 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
2a870 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
2a880 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
2a890 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
2a8a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2a8b0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
2a8c0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
2a8d0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2a8e0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
2a8f0 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
2a900 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
2a910 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
2a920 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
2a930 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
2a940 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2a950 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
2a960 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
2a970 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
2a980 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
2a990 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
2a9a0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
2a9b0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2a9c0 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
2a9d0 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
2a9e0 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
2a9f0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
2aa00 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
2aa10 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
2aa20 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
2aa30 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2aa40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2aa50 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
2aa60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2aa70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2aa80 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
2aa90 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
2aaa0 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
2aab0 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
2aac0 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
2aad0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
2aae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
2aaf0 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
2ab00 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
2ab10 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
2ab20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2ab30 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
2ab40 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
2ab50 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
2ab60 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
2ab70 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
2ab80 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
2ab90 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
2aba0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
2abb0 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
2abc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2abd0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2abe0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
2abf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ac00 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
2ac10 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
2ac20 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
2ac30 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
2ac40 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
2ac50 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
2ac60 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
2ac70 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2ac80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2ac90 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2aca0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2acb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2acc0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2acd0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
2ace0 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
2acf0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
2ad00 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
2ad10 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2ad20 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
2ad30 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2ad40 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
2ad50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2ad60 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
2ad70 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
2ad80 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
2ad90 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2ada0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2adb0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
2adc0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
2add0 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
2ade0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
2adf0 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
2ae00 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
2ae10 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
2ae20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
2ae30 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
2ae40 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
2ae50 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
2ae60 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
2ae70 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
2ae80 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
2ae90 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
2aea0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
2aeb0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
2aec0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
2aed0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
2aee0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2aef0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
2af00 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
2af10 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
2af20 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
2af30 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2af40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2af50 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
2af60 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2af70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
2af80 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
2af90 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
2afa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2afb0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
2afc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2afd0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2afe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2aff0 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
2b000 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
2b010 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b030 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
2b040 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2b050 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
2b060 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2b070 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b080 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
2b090 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2b0a0 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
2b0b0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
2b0c0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
2b0d0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
2b0e0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
2b0f0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
2b100 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
2b110 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
2b120 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2b130 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
2b140 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
2b150 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2b160 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b170 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2b180 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2b190 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
2b1a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2b1b0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
2b1c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
2b1d0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
2b1e0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
2b1f0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
2b200 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
2b210 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
2b220 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
2b230 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
2b240 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
2b250 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
2b260 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
2b270 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2b280 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
2b290 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2b2a0 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
2b2b0 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
2b2c0 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
2b2d0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
2b2e0 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
2b2f0 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
2b300 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
2b310 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
2b320 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2b330 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2b340 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
2b350 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
2b360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b370 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
2b380 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2b390 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2b3a0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
2b3b0 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
2b3c0 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
2b3d0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
2b3e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b3f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b400 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2b410 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2b420 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2b430 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2b440 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2b450 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2b460 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2b470 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b480 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2b4a0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
2b4b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2b4c0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
2b4d0 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20  0 );..      k = 
2b4e0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2b4f0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20  ->aData[4]); /* 
2b500 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  # of leaves on t
2b510 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  his trunk page *
2b520 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  /.      if( k==0
2b530 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
2b540 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2b550 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
2b560 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
2b570 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
2b580 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
2b590 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
2b5a0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2b5b0 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
2b5c0 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
2b5d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
2b5e0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
2b5f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2b600 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
2b610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b620 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2b630 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2b640 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2b650 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2b660 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b670 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2b680 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
2b690 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
2b6a0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2b6b0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2b6c0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2b6d0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2b6e0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2b6f0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2b700 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2b710 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2b720 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2b730 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2b740 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
2b750 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
2b760 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2b770 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
2b780 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
2b790 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
2b7a0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
2b7b0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
2b7c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2b7d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b7e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2b7f0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
2b800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b810 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2b820 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
2b830 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
2b840 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
2b850 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
2b860 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
2b870 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
2b880 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b890 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
2b8a0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
2b8b0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
2b8c0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
2b8d0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
2b8e0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
2b8f0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
2b900 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
2b910 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
2b920 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2b930 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2b940 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2b950 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2b960 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2b970 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b980 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2b990 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2b9a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2b9b0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2b9c0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2b9d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
2b9e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2b9f0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2ba00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2ba10 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2ba20 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2ba30 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2ba40 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2ba60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ba70 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2ba80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2ba90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2baa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bab0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2bac0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2bad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2bae0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2baf0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
2bb00 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2bb10 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2bb20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bb30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb40 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2bb50 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
2bb60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2bb70 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
2bb80 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2bb90 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
2bba0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
2bbb0 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
2bbc0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
2bbd0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2bbe0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
2bbf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2bc00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2bc10 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
2bc20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
2bc30 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2bc40 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
2bc50 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
2bc60 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
2bc70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
2bc80 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2bc90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2bca0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2bcb0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2bcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bcd0 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
2bce0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2bcf0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bd00 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2bd10 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
2bd20 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
2bd30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2bd40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bd50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2bd60 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2bd70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bd80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2bd90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2bda0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
2bdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bdc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
2bde0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2bdf0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
2be00 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2be10 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2be20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
2be30 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2be40 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2be50 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2be60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
2be70 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
2be80 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
2be90 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2bea0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2beb0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
2bec0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
2bed0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
2bee0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2bef0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2bf00 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2bf10 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2bf20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2bf30 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2bf40 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2bf50 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2bf60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2bf70 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2bf80 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2bf90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bfa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2bfb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2bfc0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
2bfd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2bfe0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2bff0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2c000 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2c010 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c020 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2c030 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2c040 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
2c050 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2c060 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c070 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2c080 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2c090 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2c0a0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2c0b0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2c0c0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
2c0d0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
2c0e0 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
2c0f0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
2c100 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
2c110 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
2c120 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
2c130 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
2c140 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2c150 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
2c160 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
2c170 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
2c180 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2c190 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
2c1a0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2c1b0 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
2c1c0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2c1e0 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
2c200 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2c210 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c230 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
2c240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c250 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2c270 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c290 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
2c2a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2c2b0 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
2c2c0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
2c2d0 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
2c2e0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
2c2f0 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2c300 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
2c310 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2c320 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
2c330 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
2c340 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2c350 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
2c360 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
2c370 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
2c380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c390 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2c3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c3b0 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
2c3c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2c3f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2c400 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2c410 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
2c420 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2c430 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
2c440 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
2c450 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2c460 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2c470 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
2c480 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
2c490 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2c4a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2c4b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2c4c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2c4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2c4e0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2c4f0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2c500 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
2c510 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
2c520 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
2c530 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
2c540 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2c550 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
2c560 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
2c570 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
2c580 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
2c590 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
2c5a0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2c5b0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
2c5c0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
2c5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c5e0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
2c5f0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
2c600 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
2c610 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
2c620 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
2c630 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
2c640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c650 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2c660 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2c670 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2c680 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2c690 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2c6a0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
2c6b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2c6c0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
2c6d0 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
2c6e0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
2c6f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c700 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
2c710 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2c720 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
2c730 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
2c740 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
2c750 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
2c760 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
2c770 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2c780 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2c790 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2c7a0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
2c7b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c7d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c7e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2c7f0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2c800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2c810 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c830 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2c840 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2c850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c860 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
2c870 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2c880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c890 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c8a0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
2c8b0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
2c8c0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
2c8d0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
2c8e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
2c8f0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
2c900 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
2c910 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
2c920 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
2c930 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
2c940 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
2c950 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
2c960 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
2c970 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
2c980 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
2c990 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
2c9a0 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
2c9b0 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
2c9c0 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
2c9d0 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
2c9e0 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
2c9f0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
2ca00 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
2ca10 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
2ca20 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
2ca30 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
2ca40 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2ca50 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
2ca60 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
2ca70 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
2ca80 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
2ca90 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2caa0 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
2cab0 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
2cac0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
2cad0 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
2cae0 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
2caf0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2cb00 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
2cb10 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
2cb20 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
2cb30 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
2cb40 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
2cb50 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
2cb60 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
2cb70 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
2cb80 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
2cb90 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2cba0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
2cbb0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
2cbc0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
2cbd0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
2cbe0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
2cbf0 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
2cc00 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
2cc10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2cc20 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
2cc30 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
2cc40 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
2cc50 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
2cc60 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
2cc70 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
2cc80 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
2cc90 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
2cca0 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
2ccb0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
2ccc0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2ccd0 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
2cce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ccf0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
2cd00 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
2cd10 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
2cd20 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
2cd30 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
2cd40 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72  ONTENT:0;..    r
2cd50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2cd60 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
2cd70 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
2cd80 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2cd90 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
2cda0 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
2cdb0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
2cdc0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2cdd0 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
2cde0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2cdf0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2ce00 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
2ce10 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
2ce20 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2ce30 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
2ce40 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
2ce50 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
2ce60 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2ce70 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
2ce80 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
2ce90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2cea0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
2ceb0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
2cec0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
2ced0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
2cee0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
2cef0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
2cf00 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
2cf10 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
2cf20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
2cf30 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
2cf40 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2cf50 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
2cf60 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
2cf70 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
2cf80 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
2cf90 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2cfa0 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
2cfb0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2cfc0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
2cfd0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
2cfe0 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
2cff0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2d000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d020 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d030 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
2d040 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2d050 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
2d060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d070 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2d080 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
2d090 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
2d0a0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2d0b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2d0c0 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
2d0d0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
2d0e0 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
2d0f0 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
2d100 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
2d110 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
2d120 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
2d130 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
2d140 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
2d150 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2d160 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
2d170 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
2d180 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
2d190 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
2d1a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2d1b0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
2d1c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2d1d0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2d1e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d1f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2d210 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2d220 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2d230 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
2d240 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
2d250 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
2d260 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
2d270 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2d280 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
2d290 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
2d2a0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2d2b0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
2d2c0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69  pPrevTrunk);.  i
2d2d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d2e0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
2d2f0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2d300 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
2d310 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
2d320 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2d330 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
2d340 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
2d350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d360 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2d370 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
2d380 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
2d390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
2d3a0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
2d3b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2d3c0 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
2d3d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2d3e0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2d3f0 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
2d400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2d410 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2d420 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
2d430 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
2d440 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
2d450 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
2d460 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
2d470 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
2d480 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
2d490 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
2d4a0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
2d4b0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2d4c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
2d4d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d4e0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
2d4f0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
2d500 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
2d510 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
2d520 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
2d530 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2d540 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
2d550 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
2d560 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
2d570 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
2d580 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
2d590 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
2d5a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
2d5b0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
2d5c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2d5d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
2d5e0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
2d5f0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
2d600 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
2d610 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2d620 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
2d630 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
2d640 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
2d650 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
2d660 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2d670 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d680 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
2d690 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
2d6a0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
2d6b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d6c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2d6d0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
2d6e0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
2d6f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d700 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2d710 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
2d720 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
2d730 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
2d740 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2d750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d760 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
2d770 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
2d780 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d7b0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
2d7c0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7e0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
2d7f0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
2d800 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
2d810 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2d820 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2d830 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2d840 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
2d850 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
2d860 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
2d870 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
2d880 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
2d890 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
2d8a0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
2d8b0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
2d8c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
2d8d0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
2d8e0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2d8f0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
2d900 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
2d910 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
2d920 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
2d930 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
2d940 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2d950 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
2d960 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2d970 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
2d980 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
2d990 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2d9a0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2d9b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2d9c0 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
2d9d0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
2d9e0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
2d9f0 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
2da00 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
2da10 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
2da20 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
2da30 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
2da40 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
2da50 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
2da60 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
2da70 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
2da80 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
2da90 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
2daa0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
2dab0 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
2dac0 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
2dad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dae0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2daf0 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
2db00 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2db10 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2db20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
2db30 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
2db40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
2db50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2db60 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
2db70 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
2db80 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
2db90 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
2dba0 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
2dbb0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2dbc0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
2dbd0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2dbe0 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
2dbf0 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
2dc00 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
2dc10 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
2dc20 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
2dc30 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
2dc40 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
2dc50 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
2dc60 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
2dc70 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
2dc80 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
2dc90 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
2dca0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2dcb0 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
2dcc0 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
2dcd0 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
2dce0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2dcf0 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
2dd00 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
2dd10 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
2dd20 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
2dd30 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
2dd40 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
2dd50 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
2dd60 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
2dd70 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
2dd80 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
2dd90 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
2dda0 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
2ddb0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
2ddc0 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
2ddd0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
2dde0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
2ddf0 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
2de00 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
2de10 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2de20 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
2de30 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
2de40 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
2de50 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2de60 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2de70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
2de80 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
2de90 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2dea0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2deb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dec0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2ded0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
2dee0 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
2def0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2df00 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
2df10 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2df20 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
2df30 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
2df40 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2df50 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
2df60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2df70 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
2df80 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2df90 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
2dfa0 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
2dfb0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
2dfc0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
2dfd0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2dfe0 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
2dff0 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
2e000 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
2e010 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
2e020 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
2e030 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2e040 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
2e050 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
2e060 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
2e070 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
2e080 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2e090 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
2e0a0 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
2e0b0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
2e0c0 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
2e0d0 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
2e0e0 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
2e0f0 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
2e100 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
2e110 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
2e120 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
2e130 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
2e140 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
2e150 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
2e160 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2e170 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
2e180 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
2e190 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
2e1a0 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
2e1b0 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
2e1c0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
2e1d0 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
2e1e0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
2e1f0 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
2e200 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
2e210 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
2e220 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
2e230 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
2e240 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
2e250 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
2e260 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
2e270 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
2e280 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
2e290 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
2e2a0 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
2e2b0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
2e2c0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
2e2d0 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
2e2e0 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
2e2f0 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
2e300 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
2e310 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -8"..      */.  
2e320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e330 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2e340 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2e350 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e370 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
2e380 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
2e390 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
2e3a0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2e3b0 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
2e3c0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2e3d0 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
2e3e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2e3f0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2e400 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
2e410 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
2e420 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
2e430 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2e440 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2e450 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
2e460 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
2e470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
2e480 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2e490 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
2e4a0 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
2e4b0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
2e4c0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2e4d0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2e4e0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2e4f0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
2e500 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
2e510 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
2e520 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
2e530 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
2e540 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2e550 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
2e560 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
2e570 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
2e580 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
2e590 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
2e5a0 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
2e5b0 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
2e5c0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
2e5d0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
2e5e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2e5f0 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
2e600 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
2e610 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
2e620 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
2e630 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
2e640 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2e650 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
2e660 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
2e670 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
2e680 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2e690 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2e6a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
2e6b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2e6c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e6d0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2e6e0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2e6f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e700 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2e710 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
2e720 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
2e730 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
2e740 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2e750 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
2e760 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2e770 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
2e780 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
2e790 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
2e7a0 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
2e7b0 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
2e7c0 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
2e7d0 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
2e7e0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
2e7f0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
2e800 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
2e810 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2e820 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2e830 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
2e840 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
2e850 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
2e860 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2e870 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
2e880 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
2e890 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
2e8a0 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
2e8b0 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
2e8c0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
2e8d0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
2e8e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2e8f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2e900 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20  he given Cell.  
2e910 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  Write the.** loc
2e920 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68  al Cell size (th
2e930 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2e940 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  s on the origina
2e950 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67  l page, omitting
2e960 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e  .** overflow) in
2e970 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73  to *pnSize..*/.s
2e980 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
2e990 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2e9a0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2e9b0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
2e9c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
2e9d0 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
2e9e0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
2e9f0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
2ea00 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
2ea10 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  u16 *pnSize     
2ea20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2ea30 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2ea40 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29  e Cell here */.)
2ea50 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2ea60 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2ea70 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2ea80 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
2ea90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2eaa0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
2eab0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
2eac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ead0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2eae0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2eaf0 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2eb00 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2eb10 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e  l, &info);.  *pn
2eb20 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
2eb30 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  e;.  if( info.iO
2eb40 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
2eb50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2eb60 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
2eb70 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
2eb80 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2eb90 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
2eba0 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
2ebb0 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70  .iOverflow+3 > p
2ebc0 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
2ebd0 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20  e->maskPage ){. 
2ebe0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ebf0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
2ec00 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
2ec10 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
2ec20 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
2ec30 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
2ec40 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
2ec50 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
2ec60 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2ec70 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
2ec80 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
2ec90 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
2eca0 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
2ecb0 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
2ecc0 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
2ecd0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
2ece0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
2ecf0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
2ed00 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
2ed10 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
2ed20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
2ed30 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
2ed40 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
2ed50 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
2ed60 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
2ed70 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
2ed80 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
2ed90 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
2eda0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
2edb0 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
2edc0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
2edd0 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
2ede0 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
2edf0 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
2ee00 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
2ee10 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
2ee20 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
2ee30 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
2ee40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2ee50 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
2ee60 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
2ee70 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
2ee80 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
2ee90 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
2eea0 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
2eeb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2eec0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
2eed0 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
2eee0 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
2eef0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
2ef00 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
2ef10 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
2ef20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
2ef30 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
2ef40 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
2ef50 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
2ef60 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
2ef70 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
2ef80 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2ef90 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
2efa0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2efb0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
2efc0 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
2efd0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
2efe0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
2eff0 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
2f000 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
2f010 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2f020 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
2f030 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
2f040 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
2f050 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
2f060 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
2f070 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
2f080 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
2f090 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
2f0a0 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
2f0b0 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
2f0c0 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
2f0d0 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
2f0e0 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
2f0f0 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
2f100 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
2f110 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
2f120 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
2f130 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
2f140 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
2f150 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
2f160 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
2f170 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
2f180 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
2f190 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
2f1a0 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
2f1b0 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
2f1c0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2f1d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f1e0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2f1f0 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
2f200 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
2f210 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
2f220 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
2f230 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2f240 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
2f250 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
2f260 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
2f270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
2f280 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
2f290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2f2a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2f2b0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
2f2c0 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
2f2d0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
2f2e0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
2f2f0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
2f300 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
2f310 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
2f320 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
2f330 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
2f340 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
2f350 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
2f360 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
2f370 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
2f380 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
2f390 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
2f3a0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
2f3b0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
2f3c0 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
2f3d0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
2f3e0 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
2f3f0 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
2f400 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
2f410 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
2f420 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
2f430 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
2f440 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
2f450 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
2f460 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
2f470 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
2f480 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
2f490 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
2f4a0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
2f4b0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
2f4c0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
2f4d0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
2f4e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2f4f0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2f500 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
2f510 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2f520 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
2f530 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
2f540 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
2f550 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
2f560 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
2f570 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
2f580 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2f590 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
2f5a0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
2f5b0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
2f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f5d0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
2f5e0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
2f5f0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
2f600 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
2f610 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2f620 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
2f630 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
2f640 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
2f650 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
2f660 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
2f670 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
2f680 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
2f690 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
2f6a0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
2f6b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2f6c0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
2f6d0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
2f6e0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2f6f0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2f700 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
2f710 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
2f720 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
2f730 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f740 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2f750 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
2f760 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
2f770 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
2f780 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
2f790 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
2f7a0 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
2f7b0 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
2f7c0 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
2f7d0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
2f7e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
2f7f0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2f800 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
2f810 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2f820 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2f830 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2f840 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2f850 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2f860 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2f870 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
2f880 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
2f890 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
2f8a0 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
2f8b0 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
2f8c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
2f8d0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2f8e0 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
2f8f0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2f900 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
2f910 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2f920 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  nData==0 );.    
2f930 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30  assert( nZero==0
2f940 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   );.  }.  nHeade
2f950 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2f960 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2f970 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
2f980 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
2f990 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  he payload size 
2f9a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
2f9b0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
2f9c0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2f9d0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2f9e0 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
2f9f0 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
2fa00 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
2fa10 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
2fa20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fa30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fa40 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2fa50 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29  nPayload = (int)
2fa60 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
2fa70 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
2fa80 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
2fa90 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
2faa0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2fab0 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61   ){.    n = nHea
2fac0 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a  der + nPayload;.
2fad0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
2fae0 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =3 );.    testca
2faf0 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  se( n==4 );.    
2fb00 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b  if( n<4 ) n = 4;
2fb10 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
2fb20 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
2fb30 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
2fb40 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a  pPrior = pCell;.
2fb50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
2fb60 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
2fb70 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d  Local;.    n = m
2fb80 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
2fb90 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
2fba0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2fbb0 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
2fbc0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
2fbd0 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
2fbe0 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
2fbf0 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
2fc00 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
2fc10 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
2fc20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66  mn;.    spaceLef
2fc30 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69  t = n;.    *pnSi
2fc40 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
2fc50 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72   + 4;.    pPrior
2fc60 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
2fc70 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79  r+n];.  }.  pPay
2fc80 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
2fc90 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74  eader];..  /* At
2fca0 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
2fcb0 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
2fcc0 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
2fcd0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
2fce0 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
2fcf0 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
2fd00 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
2fd10 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
2fd20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
2fd30 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
2fd40 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
2fd50 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
2fd60 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
2fd70 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
2fd80 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
2fd90 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
2fda0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
2fdb0 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
2fdc0 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
2fdd0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
2fde0 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
2fdf0 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
2fe00 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
2fe10 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
2fe20 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
2fe30 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
2fe40 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
2fe50 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
2fe60 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
2fe70 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
2fe80 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
2fe90 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2fea0 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
2feb0 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
2fec0 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
2fed0 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
2fee0 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ..  */.#if SQLIT
2fef0 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  E_DEBUG.  {.    
2ff00 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2ff10 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
2ff20 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2ff30 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
2ff40 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28  ssert( nHeader=(
2ff50 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f  int)(info.pPaylo
2ff60 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20  ad - pCell) );. 
2ff70 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e     assert( info.
2ff80 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
2ff90 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a    assert( *pnSiz
2ffa0 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  e == info.nSize 
2ffb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
2ffc0 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f  paceLeft == info
2ffd0 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61  .nLocal );.    a
2ffe0 73 73 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d  ssert( pPrior ==
2fff0 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
30000 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23  erflow] );.  }.#
30010 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74  endif..  /* Writ
30020 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
30030 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c  to the local Cel
30040 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20  l and any extra 
30050 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
30060 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ges */.  while( 
30070 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
30080 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
30090 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
300a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
300b0 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
300c0 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
300d0 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
300e0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
300f0 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
30100 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
30110 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
30120 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
30130 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
30140 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
30150 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
30160 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
30170 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
30180 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
30190 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
301a0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
301b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
301c0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
301d0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
301e0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
301f0 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
30200 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30210 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
30220 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
30230 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
30240 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
30250 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
30260 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
30270 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
30280 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
30290 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
302a0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
302b0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
302c0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
302d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
302e0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
302f0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
30300 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
30310 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
30320 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
30330 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
30340 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
30350 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
30360 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
30370 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
30380 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
30390 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
303a0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
303b0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
303c0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
303d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
303e0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
303f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
30400 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
30410 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
30420 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
30430 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
30440 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
30450 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
30460 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
30470 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
30480 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
30490 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
304a0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
304b0 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
304c0 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
304d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
304e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
304f0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
30500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30510 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
30520 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30530 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
30540 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
30550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30560 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
30570 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
30580 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
30590 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
305a0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
305b0 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
305c0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
305d0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
305e0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
305f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
30600 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
30610 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
30620 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
30630 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
30640 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
30650 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
30660 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
30670 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
30680 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
30690 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
306a0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
306b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
306c0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
306d0 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
306e0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
306f0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
30700 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
30710 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30720 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
30730 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
30740 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
30750 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
30760 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
30770 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
30780 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
30790 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
307a0 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
307b0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
307c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
307d0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
307e0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
307f0 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
30800 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
30810 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
30820 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
30830 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
30840 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
30850 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
30860 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
30870 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
30880 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
30890 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
308a0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
308b0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
308c0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
308d0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
308e0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
308f0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
30900 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30910 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
30920 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
30930 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
30940 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
30950 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
30960 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
30970 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
30980 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
30990 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
309a0 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
309b0 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
309c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
309d0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
309e0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
309f0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
30a00 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
30a10 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
30a20 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
30a30 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
30a40 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
30a50 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
30a60 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
30a70 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
30a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
30a90 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
30aa0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
30ab0 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
30ac0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
30ad0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
30ae0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
30af0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
30b00 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
30b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
30b20 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
30b30 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
30b40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
30b50 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
30b60 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
30b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
30b80 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
30b90 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
30ba0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
30bb0 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
30bc0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
30bd0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
30be0 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
30bf0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
30c00 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
30c10 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
30c20 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
30c30 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
30c40 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
30c50 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
30c60 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
30c70 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
30c80 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
30c90 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
30ca0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
30cb0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
30cc0 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
30cd0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
30ce0 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
30cf0 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
30d00 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
30d10 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
30d20 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
30d30 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
30d40 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
30d50 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
30d60 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
30d70 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
30d80 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
30d90 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
30da0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
30db0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
30dc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
30dd0 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
30de0 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
30df0 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
30e00 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
30e10 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
30e20 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
30e30 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
30e40 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
30e50 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
30e60 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
30e70 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
30e80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30e90 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30ea0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
30eb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30ec0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
30ed0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
30ee0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
30ef0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
30f00 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
30f10 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63  Idx[2*idx];.  pc
30f20 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
30f30 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
30f40 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
30f50 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
30f60 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
30f70 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
30f80 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
30f90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
30fa0 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75  );.  if( pc < (u
30fb0 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74  32)get2byte(&dat
30fc0 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
30fd0 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
30fe0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
30ff0 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
31000 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31010 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
31020 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
31030 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
31040 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31050 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
31060 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
31070 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d  ge->nCell--;.  m
31080 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
31090 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
310a0 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 70 75  ll - idx));.  pu
310b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
310c0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
310d0 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
310e0 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee += 2;.}../*.*
310f0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
31100 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
31110 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
31120 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
31130 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
31140 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
31150 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
31160 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
31170 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
31180 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
31190 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
311a0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
311b0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
311c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
311d0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
311e0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
311f0 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
31200 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
31210 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
31220 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
31230 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
31240 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
31250 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
31260 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
31270 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
31280 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
31290 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
312a0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
312b0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
312c0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
312d0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
312e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
312f0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
31300 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
31310 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
31320 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
31330 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
31340 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
31350 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
31360 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
31370 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
31380 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
31390 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
313a0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
313b0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
313c0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
313d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
313e0 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
313f0 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
31400 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
31410 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
31420 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
31430 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
31440 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
31450 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
31460 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
31470 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
31480 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
31490 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
314a0 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
314b0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
314c0 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
314d0 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
314e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
314f0 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
31500 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
31510 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
31520 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31530 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
31540 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
31550 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
31560 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
31570 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
31580 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
31590 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
315a0 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
315b0 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
315c0 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
315d0 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
315e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
315f0 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
31600 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
31610 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
31620 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
31630 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
31640 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20   page */..  if( 
31650 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
31660 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
31670 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
31680 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
31690 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
316a0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
316b0 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
316c0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
316d0 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
316e0 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
316f0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
31700 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
31710 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
31720 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
31730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
31740 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
31750 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
31760 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
31770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
31780 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31790 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
317a0 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
317b0 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
317c0 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
317d0 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
317e0 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
317f0 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
31800 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
31810 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
31820 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
31830 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
31840 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
31850 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
31860 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
31870 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
31880 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
31890 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
318a0 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
318b0 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
318c0 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
318d0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
318e0 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
318f0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
31900 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
31910 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
31920 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
31930 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
31940 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
31950 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
31960 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
31970 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
31980 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
31990 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
319a0 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
319b0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
319c0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
319d0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
319e0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
319f0 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
31a00 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
31a10 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
31a20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
31a30 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
31a40 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
31a50 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
31a60 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
31a70 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
31a80 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
31a90 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
31aa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
31ab0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
31ac0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
31ad0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
31ae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31af0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
31b00 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
31b10 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
31b20 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
31b30 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
31b40 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
31b50 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
31b60 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
31b70 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
31b80 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
31b90 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
31ba0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
31bb0 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
31bc0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
31bd0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
31be0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
31bf0 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
31c00 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
31c10 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
31c20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
31c30 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
31c40 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
31c50 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
31c60 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
31c70 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
31c80 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
31c90 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
31ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
31cb0 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
31cc0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
31cd0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
31ce0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
31cf0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
31d00 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
31d10 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
31d20 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  idx], pCell, sz)
31d30 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
31d40 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
31d50 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
31d60 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
31d70 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
31d80 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e  ins+2], &data[in
31d90 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20  s], end-ins);.  
31da0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
31db0 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
31dc0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
31dd0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31de0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
31df0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
31e00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31e10 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
31e20 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
31e30 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
31e40 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
31e50 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
31e60 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
31e70 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
31e80 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
31e90 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
31ea0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
31eb0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
31ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
31ed0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
31ee0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
31ef0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
31f00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61   }.}../*.** Arra
31f10 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
31f20 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
31f30 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67  nCell b-tree pag
31f40 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a  e cells. The .**
31f50 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20   szCell[] array 
31f60 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
31f70 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
31f80 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
31f90 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63  nction.** replac
31fa0 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
31fb0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
31fc0 70 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e  pPg with the con
31fd0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c  tents of the cel
31fe0 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  l.** array..**.*
31ff0 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  * Some of the ce
32000 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
32010 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
32020 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20   stored in pPg. 
32030 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
32040 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72   works around pr
32050 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
32060 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20   this by making 
32070 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a  a copy of any .*
32080 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66  * such cells bef
32090 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
320a0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
320b0 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65  *.** The MemPage
320c0 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  .nFree field is 
320d0 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74  invalidated by t
320e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  his function. It
320f0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
32100 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
32110 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
32120 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
32130 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 62  .static void reb
32140 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50  uildPage(.  MemP
32150 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
32160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
32170 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f  dit this page */
32180 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
32190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321a0 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62     /* Final numb
321b0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70  er of cells on p
321c0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
321d0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
321e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
321f0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
32200 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32220 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
32230 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   sizes */.){.  c
32240 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
32250 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  Pg->hdrOffset;  
32260 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
32270 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
32280 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  Pg */.  u8 * con
32290 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
322a0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
322b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
322c0 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20  ata for pPg */. 
322d0 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c   const int usabl
322e0 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
322f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
32300 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
32310 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53  = &aData[usableS
32320 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ize];.  int i;. 
32330 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20   u8 *pCellptr = 
32340 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20  pPg->aCellIdx;. 
32350 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
32360 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
32370 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
32380 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  er);.  u8 *pData
32390 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74  ;..  i = get2byt
323a0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  e(&aData[hdr+5])
323b0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70  ;.  memcpy(&pTmp
323c0 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20  [i], &aData[i], 
323d0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b  usableSize - i);
323e0 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64  ..  pData = pEnd
323f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
32400 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
32410 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
32420 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ll[i];.    if( p
32430 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70 43  Cell>aData && pC
32440 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ell<pEnd ){.    
32450 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
32460 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
32470 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
32480 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
32490 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
324a0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d  pCell, szCell[i]
324b0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
324c0 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61  pCellptr, (pData
324d0 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
324e0 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
324f0 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c     assert( szCel
32500 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  l[i]==cellSizePt
32510 72 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 29 3b  r(pPg, pCell) );
32520 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70  .  }..  /* The p
32530 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
32540 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72  is now set incor
32550 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c  rectly. The call
32560 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20  er will fix it. 
32570 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  */.  pPg->nCell 
32580 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e  = nCell;.  pPg->
32590 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
325a0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
325b0 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20  a[hdr+1], 0);.  
325c0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
325d0 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
325e0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
325f0 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
32600 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20  Data - aData);. 
32610 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20   aData[hdr+7] = 
32620 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  0x00;.}../*.** A
32630 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
32640 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
32650 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
32660 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
32670 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ell.** contains 
32680 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
32690 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
326a0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
326b0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a  on attempts to .
326c0 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73  ** add the cells
326d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
326e0 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50 67  rray to page pPg
326f0 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28  . If it cannot (
32700 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  because .** the 
32710 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
32720 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65   defragmented be
32730 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77  fore the cells w
32740 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65  ill fit), non-ze
32750 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ro.** is returne
32760 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
32770 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61   the cells are a
32780 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
32790 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65  y, zero is.** re
327a0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  turned..**.** Ar
327b0 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20  gument pCellptr 
327c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
327d0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
327e0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
327f0 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20  ray.** (part of 
32800 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70  page pPg) to pop
32810 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c  ulate. After cel
32820 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77  l apCell[0] is w
32830 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
32840 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36   page body, a 16
32850 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20 77  -bit offset is w
32860 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70  ritten to pCellp
32870 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66  tr. And so on, f
32880 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20  or each.** cell 
32890 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49 74  in the array. It
328a0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
328b0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
328c0 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a  ller to ensure.*
328d0 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  * that it is saf
328e0 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74  e to overwrite t
328f0 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
32900 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
32910 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ay..**.** When t
32920 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32930 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20  called, *ppData 
32940 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
32950 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  art of the .** c
32960 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70  ontent area on p
32970 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65 20  age pPg. If the 
32980 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  size of the cont
32990 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74 65  ent area is exte
329a0 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61  nded,.** *ppData
329b0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 70   is updated to p
329c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
329d0 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e  start of the con
329e0 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66  tent area.** bef
329f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
32a00 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72  *.** Finally, ar
32a10 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f  gument pBegin po
32a20 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74 65  ints to the byte
32a30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
32a40 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e  lowing the.** en
32a50 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20 72  d of the space r
32a60 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73 20  equired by this 
32a70 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c  page for the cel
32a80 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28  l-pointer area (
32a90 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73  for.** all cells
32aa0 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73   - not just thos
32ab0 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68  e inserted by th
32ac0 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e  e current call).
32ad0 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a   If the content.
32ae0 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65 20  ** area must be 
32af0 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f  extended to befo
32b00 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  re this point in
32b10 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f   order to accomo
32b20 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c  date all.** cell
32b30 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74  s in apCell[], t
32b40 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f  hen the cells do
32b50 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e   not fit and non
32b60 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
32b70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
32b80 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
32b90 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
32ba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32bb0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61      /* Page to a
32bc0 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20  dd cells to */. 
32bd0 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20   u8 *pBegin,    
32be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bf0 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d   /* End of cell-
32c00 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
32c10 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20  .  u8 **ppData, 
32c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c30 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61     /* IN/OUT: Pa
32c40 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61  ge content -area
32c50 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
32c60 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20   *pCellptr,     
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32c80 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
32c90 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f  -pointer area */
32ca0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
32cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32cd0 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
32ce0 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  pPg */.  u8 **ap
32cf0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
32d00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
32d10 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
32d20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
32d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d40 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
32d50 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   sizes */.){.  i
32d60 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74  nt i;.  u8 *aDat
32d70 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
32d80 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70    u8 *pData = *p
32d90 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69  pData;.  const i
32da0 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20 61  nt bFreelist = a
32db0 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61  Data[1] || aData
32dc0 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 43  [2];.  assert( C
32dd0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67  ORRUPT_DB || pPg
32de0 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
32df0 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  ;    /* Never ca
32e00 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a  lled on page 1 *
32e10 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
32e20 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
32e30 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b  int sz = szCell[
32e40 69 5d 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f  i];.    u8 *pSlo
32e50 74 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  t;.    if( bFree
32e60 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f  list==0 || (pSlo
32e70 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  t = pageFindSlot
32e80 28 70 50 67 2c 20 73 7a 2c 20 30 29 29 3d 3d 30  (pPg, sz, 0))==0
32e90 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20   ){.      pData 
32ea0 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28  -= sz;.      if(
32eb0 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20   pData<pBegin ) 
32ec0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
32ed0 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20  pSlot = pData;. 
32ee0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
32ef0 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69 5d  pSlot, apCell[i]
32f00 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62  , sz);.    put2b
32f10 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
32f20 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a  Slot - aData));.
32f30 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
32f40 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61  2;.  }.  *ppData
32f50 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75   = pData;.  retu
32f60 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
32f70 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
32f80 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
32f90 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
32fa0 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
32fb0 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ell .** contains
32fc0 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
32fd0 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
32fe0 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
32ff0 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ion adds the.** 
33000 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64  space associated
33010 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20   with each cell 
33020 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61  in the array tha
33030 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
33040 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e  tored .** within
33050 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67   the body of pPg
33060 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65   to the pPg free
33070 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d  -list. The cell-
33080 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68  pointers and oth
33090 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20  er.** fields of 
330a0 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74  the page are not
330b0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
330c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
330d0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
330e0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
330f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
33100 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e-list..*/.stati
33110 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72  c int pageFreeAr
33120 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
33130 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
33140 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
33150 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20  o edit */.  int 
33160 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
33170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
33180 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ells to delete *
33190 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
331a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331b0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
331c0 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a  cells */.  u16 *
331d0 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  szCell          
331e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
331f0 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65  ray of cell size
33200 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63  s */.){.  u8 * c
33210 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
33220 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
33230 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44  const pEnd = &aD
33240 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73  ata[pPg->pBt->us
33250 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  ableSize];.  int
33260 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74   nRet = 0;.  int
33270 20 69 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20   i;.  u8 *pFree 
33280 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65  = 0;.  int szFre
33290 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
332a0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
332b0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
332c0 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = apCell[i];.   
332d0 20 69 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61   if( pCell>aData
332e0 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29   && pCell<pEnd )
332f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
33300 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
33310 20 20 69 66 28 20 70 46 72 65 65 21 3d 28 70 43    if( pFree!=(pC
33320 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20  ell + sz) ){.   
33330 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
33340 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
33350 70 46 72 65 65 20 2d 20 61 44 61 74 61 2c 20 73  pFree - aData, s
33360 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  zFree);.        
33370 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
33380 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20         szFree = 
33390 73 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  sz;.      }else{
333a0 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d  .        pFree =
333b0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pCell;.        
333c0 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20  szFree += sz;.  
333d0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74      }.      nRet
333e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
333f0 69 66 28 20 70 46 72 65 65 20 29 20 66 72 65 65  if( pFree ) free
33400 53 70 61 63 65 28 70 50 67 2c 20 70 46 72 65 65  Space(pPg, pFree
33410 20 2d 20 61 44 61 74 61 2c 20 73 7a 46 72 65 65   - aData, szFree
33420 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74  );.  return nRet
33430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
33440 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
33450 69 73 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20  is invalid when 
33460 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
33470 74 75 72 6e 73 2e 20 49 74 20 69 73 20 74 68 65  turns. It is the
33480 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
33490 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
334a0 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65   to set it corre
334b0 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
334c0 76 6f 69 64 20 65 64 69 74 50 61 67 65 28 0a 20  void editPage(. 
334d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334f0 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
33500 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c 64  ge */.  int iOld
33510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33520 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
33530 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 63   of first cell c
33540 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61 67 65  urrently on page
33550 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 2c 20   */.  int iNew, 
33560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33570 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
33580 66 20 6e 65 77 20 66 69 72 73 74 20 63 65 6c 6c  f new first cell
33590 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e   on page */.  in
335a0 74 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20 20  t nNew,         
335b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
335c0 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Final number of
335d0 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a   cells on page *
335e0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33600 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
33610 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a  cells */.  u16 *
33620 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  szCell          
33630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
33640 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65  ray of cell size
33650 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63  s */.){.  u8 * c
33660 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
33670 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74  ->aData;.  const
33680 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
33690 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  hdrOffset;.  u8 
336a0 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67 2d 3e  *pBegin = &pPg->
336b0 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a 20  aCellIdx[nNew * 
336c0 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20  2];.  int nCell 
336d0 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20 20  = pPg->nCell;   
336e0 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74 6f      /* Cells sto
336f0 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  red on pPg */.  
33700 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75 38 20  u8 *pData;.  u8 
33710 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e 74  *pCellptr;.  int
33720 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45 6e   i;.  int iOldEn
33730 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d 3e  d = iOld + pPg->
33740 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f 76  nCell + pPg->nOv
33750 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69 4e  erflow;.  int iN
33760 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20 6e  ewEnd = iNew + n
33770 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  New;..#ifdef SQL
33780 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 2a  ITE_DEBUG.  u8 *
33790 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTmp = sqlite3Pa
337a0 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67  gerTempSpace(pPg
337b0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
337c0 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c 20 61    memcpy(pTmp, a
337d0 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74 2d 3e  Data, pPg->pBt->
337e0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23 65 6e  usableSize);.#en
337f0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  dif..  /* Remove
33800 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20   cells from the 
33810 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 6f 66  start and end of
33820 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
33830 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20 29 7b 0a  f( iOld<iNew ){.
33840 20 20 20 20 69 6e 74 20 6e 53 68 69 66 74 20 3d      int nShift =
33850 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a   pageFreeArray(.
33860 20 20 20 20 20 20 20 20 70 50 67 2c 20 69 4e 65          pPg, iNe
33870 77 2d 69 4f 6c 64 2c 20 26 61 70 43 65 6c 6c 5b  w-iOld, &apCell[
33880 69 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69  iOld], &szCell[i
33890 4f 6c 64 5d 0a 20 20 20 20 29 3b 0a 20 20 20 20  Old].    );.    
338a0 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61 43 65  memmove(pPg->aCe
338b0 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61 43 65  llIdx, &pPg->aCe
338c0 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32 5d 2c  llIdx[nShift*2],
338d0 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 6e   nCell*2);.    n
338e0 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74 3b 0a  Cell -= nShift;.
338f0 20 20 7d 0a 20 20 69 66 28 20 69 4e 65 77 45 6e    }.  if( iNewEn
33900 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b 0a 20  d < iOldEnd ){. 
33910 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61 67 65     nCell -= page
33920 46 72 65 65 41 72 72 61 79 28 0a 20 20 20 20 20  FreeArray(.     
33930 20 20 20 70 50 67 2c 20 69 4f 6c 64 45 6e 64 2d     pPg, iOldEnd-
33940 69 4e 65 77 45 6e 64 2c 20 26 61 70 43 65 6c 6c  iNewEnd, &apCell
33950 5b 69 4e 65 77 45 6e 64 5d 2c 20 26 73 7a 43 65  [iNewEnd], &szCe
33960 6c 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20 20 20 20  ll[iNewEnd].    
33970 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61 20  );.  }..  pData 
33980 3d 20 26 61 44 61 74 61 5b 67 65 74 32 62 79 74  = &aData[get2byt
33990 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  e(&aData[hdr+5])
339a0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70  ];.  if( pData<p
339b0 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69  Begin ) goto edi
339c0 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f  tpage_fail;..  /
339d0 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74  * Add cells to t
339e0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
339f0 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e  page */.  if( iN
33a00 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69  ew<iOld ){.    i
33a10 6e 74 20 6e 41 64 64 20 3d 20 69 4f 6c 64 2d 69  nt nAdd = iOld-i
33a20 4e 65 77 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  New;.    pCellpt
33a30 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64  r = pPg->aCellId
33a40 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26  x;.    memmove(&
33a50 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32 5d  pCellptr[nAdd*2]
33a60 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65 6c  , pCellptr, nCel
33a70 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 70 61  l*2);.    if( pa
33a80 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
33a90 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42           pPg, pB
33aa0 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43  egin, &pData, pC
33ab0 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20  ellptr,.        
33ac0 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c 5b    nAdd, &apCell[
33ad0 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69  iNew], &szCell[i
33ae0 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67 6f 74  New].    ) ) got
33af0 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b  o editpage_fail;
33b00 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41  .    nCell += nA
33b10 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  dd;.  }..  /* Ad
33b20 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  d any overflow c
33b30 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ells */.  for(i=
33b40 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66  0; i<pPg->nOverf
33b50 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  low; i++){.    i
33b60 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64  nt iCell = (iOld
33b70 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69   + pPg->aiOvfl[i
33b80 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69  ]) - iNew;.    i
33b90 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69  f( iCell>=0 && i
33ba0 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20  Cell<nNew ){.   
33bb0 20 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20     u8 *pCellptr 
33bc0 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  = &pPg->aCellIdx
33bd0 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20  [iCell * 2];.   
33be0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c     memmove(&pCel
33bf0 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74  lptr[2], pCellpt
33c00 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c  r, (nCell - iCel
33c10 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e  l) * 2);.      n
33c20 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Cell++;.      if
33c30 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  ( pageInsertArra
33c40 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y(.            p
33c50 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61  Pg, pBegin, &pDa
33c60 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20  ta, pCellptr,.  
33c70 20 20 20 20 20 20 20 20 20 20 31 2c 20 26 61 70            1, &ap
33c80 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65  Cell[iCell + iNe
33c90 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c  w], &szCell[iCel
33ca0 6c 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20 20  l + iNew].      
33cb0 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67  ) ) goto editpag
33cc0 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20  e_fail;.    }.  
33cd0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63  }..  /* Append c
33ce0 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ells to the end 
33cf0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
33d00 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67   pCellptr = &pPg
33d10 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c  ->aCellIdx[nCell
33d20 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49  *2];.  if( pageI
33d30 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20  nsertArray(.    
33d40 20 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c      pPg, pBegin,
33d50 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74   &pData, pCellpt
33d60 72 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 2d  r,.        nNew-
33d70 6e 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69  nCell, &apCell[i
33d80 4e 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43  New+nCell], &szC
33d90 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a  ell[iNew+nCell].
33da0 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
33db0 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67  age_fail;..  pPg
33dc0 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a  ->nCell = nNew;.
33dd0 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77    pPg->nOverflow
33de0 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74   = 0;..  put2byt
33df0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
33e00 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
33e10 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
33e20 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20  hdr+5], pData - 
33e30 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65 66 20  aData);..#ifdef 
33e40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
33e50 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26  or(i=0; i<nNew &
33e60 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b 20 69  & !CORRUPT_DB; i
33e70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
33e80 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e  ll = apCell[i+iN
33e90 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ew];.    int iOf
33ea0 66 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50  f = get2byte(&pP
33eb0 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d  g->aCellIdx[i*2]
33ec0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c  );.    if( pCell
33ed0 3e 3d 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c  >=aData && pCell
33ee0 3c 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74  <&aData[pPg->pBt
33ef0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
33f00 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26  .      pCell = &
33f10 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61  pTmp[pCell - aDa
33f20 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ta];.    }.    a
33f30 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70  ssert( 0==memcmp
33f40 28 70 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69  (pCell, &aData[i
33f50 4f 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69  Off], szCell[i+i
33f60 4e 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  New]) );.  }.#en
33f70 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20  dif..  return;. 
33f80 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20  editpage_fail:. 
33f90 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64   /* Unable to ed
33fa0 69 74 20 74 68 69 73 20 70 61 67 65 2e 20 52 65  it this page. Re
33fb0 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63  build it from sc
33fc0 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a  ratch instead. *
33fd0 2f 0a 20 20 72 65 62 75 69 6c 64 50 61 67 65 28  /.  rebuildPage(
33fe0 70 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65  pPg, nNew, &apCe
33ff0 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c  ll[iNew], &szCel
34000 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  l[iNew]);.}../*.
34010 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
34020 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
34030 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
34040 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
34050 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
34060 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
34070 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
34080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
34090 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
340a0 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
340b0 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
340c0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
340d0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
340e0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
340f0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
34100 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
34110 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
34120 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
34130 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
34140 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
34150 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
34160 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
34170 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
34180 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
34190 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
341a0 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
341b0 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
341c0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
341d0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
341e0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
341f0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
34200 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
34210 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
34220 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
34230 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
34240 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
34250 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
34260 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
34270 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
34280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34290 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
342a0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
342b0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
342c0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
342d0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
342e0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
342f0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
34300 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
34310 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
34320 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
34330 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
34340 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
34350 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
34360 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
34370 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
34380 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
34390 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
343a0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
343b0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
343c0 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
343d0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
343e0 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
343f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
34400 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
34410 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
34420 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
34430 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
34440 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
34450 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
34460 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
34470 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
34480 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
34490 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
344a0 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
344b0 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
344c0 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
344d0 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
344e0 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
344f0 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
34500 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
34510 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
34520 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
34530 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
34540 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
34550 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
34560 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
34570 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
34580 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
34590 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
345a0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
345b0 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
345c0 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
345d0 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
345e0 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
345f0 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
34600 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
34610 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
34620 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
34630 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
34640 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
34650 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
34660 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
34670 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
34680 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
34690 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
346a0 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
346b0 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
346c0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
346d0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
346e0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
346f0 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
34700 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
34710 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
34720 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
34730 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
34740 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
34750 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
34760 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
34770 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
34780 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
34790 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
347a0 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
347b0 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
347c0 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
347d0 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
347e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
347f0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
34800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
34810 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
34820 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
34850 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
34860 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
34870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34880 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
34890 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
348a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
348b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
348c0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
348d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
348e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
348f0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
34900 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
34910 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
34920 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  low==1 );..  /* 
34930 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  This error condi
34940 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67  tion is now caug
34950 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
34960 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  hing this functi
34970 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  on */.  if( pPag
34980 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65  e->nCell==0 ) re
34990 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
349a0 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
349b0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
349c0 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77  age. This page w
349d0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
349e0 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
349f0 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b  .  ** pPage. Mak
34a00 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
34a10 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74  e writable, so t
34a20 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  hat the new divi
34a30 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61  der cell.  ** ma
34a40 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49  y be inserted. I
34a50 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65  f both these ope
34a60 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63  rations are succ
34a70 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e  essful, proceed.
34a80 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
34a90 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
34aa0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
34ab0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69  New, 0, 0);..  i
34ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34ad0 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75   ){..    u8 *pOu
34ae0 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a  t = &pSpace[4];.
34af0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
34b00 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d  pPage->apOvfl[0]
34b10 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
34b20 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
34b30 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
34b40 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
34b50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34b60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34b70 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
34b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34b90 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
34ba0 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
34bb0 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
34bc0 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
34bd0 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
34be0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
34bf0 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
34c00 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 4e 65   rebuildPage(pNe
34c10 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
34c20 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e 65 77  zCell);.    pNew
34c30 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
34c40 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e 65 77  sableSize - pNew
34c50 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d 20 32  ->cellOffset - 2
34c60 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20 20 20   - szCell;..    
34c70 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
34c80 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
34c90 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
34ca0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
34cb0 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
34cc0 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
34cd0 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
34ce0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
34cf0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
34d00 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
34d10 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
34d20 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
34d30 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
34d40 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
34d50 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
34d60 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
34d70 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
34d80 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
34d90 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
34da0 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
34db0 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
34dc0 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
34dd0 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
34de0 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
34df0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
34e00 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
34e10 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
34e20 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
34e30 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
34e40 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
34e50 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
34e60 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
34e70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
34e80 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
34e90 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
34ea0 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
34eb0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
34ec0 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
34ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
34ee0 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
34ef0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  al ){.        pt
34f00 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
34f10 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  New, pCell, &rc)
34f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34f30 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
34f40 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
34f50 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70  to insert into p
34f60 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69  Parent. The divi
34f70 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  der cell.    ** 
34f80 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d  consists of a 4-
34f90 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
34fa0 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (the page numbe
34fb0 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a  r of pPage) and.
34fc0 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c      ** a variabl
34fd0 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c  e length key val
34fe0 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  ue (which must b
34ff0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
35000 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   as the.    ** l
35010 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50  argest key on pP
35020 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  age)..    **.   
35030 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20   ** To find the 
35040 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
35050 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73  e on pPage, firs
35060 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74  t find the right
35070 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65  -most .    ** ce
35080 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65  ll on pPage. The
35090 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
350a0 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
350b0 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  re the .    ** r
350c0 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20  ecord-length (a 
350d0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
350e0 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20  integer at most 
350f0 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29  32-bits in size)
35100 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
35110 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72  key value (a var
35120 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
35130 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61  eger, may have a
35140 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a  ny value)..    *
35150 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  * The first of t
35160 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  he while(...) lo
35170 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20  ops below skips 
35180 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d  over the record-
35190 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69  length.    ** fi
351a0 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  eld. The second 
351b0 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20  while(...) loop 
351c0 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76  copies the key v
351d0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  alue from the.  
351e0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
351f0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61  ge into the pSpa
35200 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ce buffer..    *
35210 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  /.    pCell = fi
35220 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
35230 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
35240 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
35250 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
35260 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38   (*(pCell++)&0x8
35270 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
35280 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  p );.    pStop =
35290 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
352a0 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b  while( ((*(pOut+
352b0 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29  +) = *(pCell++))
352c0 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
352d0 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  pStop );..    /*
352e0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
352f0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
35300 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
35310 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
35320 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e  rent, pParent->n
35330 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69  Cell, pSpace, (i
35340 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29  nt)(pOut-pSpace)
35350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35360 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c   0, pPage->pgno,
35370 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   &rc);..    /* S
35380 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  et the right-chi
35390 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50  ld pointer of pP
353a0 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74  arent to point t
353b0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
353c0 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
353d0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
353e0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
353f0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
35400 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
35410 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
35420 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
35430 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65  . */.    release
35440 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  Page(pNew);.  }.
35450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35460 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
35470 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
35480 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a  CE */..#if 0./*.
35490 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
354a0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
354b0 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f  bute anything to
354c0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
354d0 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20  f SQLite..** it 
354e0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74  is sometimes act
354f0 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69  ivated temporari
35500 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69  ly while debuggi
35510 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69  ng code responsi
35520 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74  ble .** for sett
35530 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  ing pointer-map 
35540 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
35550 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65  ic int ptrmapChe
35560 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ckPages(MemPage 
35570 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50  **apPage, int nP
35580 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  age){.  int i, j
35590 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
355a0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
355b0 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65  Pgno n;.    u8 e
355c0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
355d0 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d  Page = apPage[i]
355e0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
355f0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
35600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
35610 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
35620 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
35630 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b  Page->nCell; j++
35640 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  ){.      CellInf
35650 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38  o info;.      u8
35660 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20   *z;.     .     
35670 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50   z = findCell(pP
35680 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62  age, j);.      b
35690 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
356a0 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f  (pPage, z, &info
356b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66  );.      if( inf
356c0 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
356d0 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c         Pgno ovfl
356e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69   = get4byte(&z[i
356f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
35700 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
35710 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65  et(pBt, ovfl, &e
35720 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
35730 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
35740 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
35750 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a  AP_OVERFLOW1 );.
35760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35770 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
35780 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63  {.        Pgno c
35790 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
357a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  z);.        ptrm
357b0 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
357c0 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
357d0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
357e0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
357f0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
35800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35810 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
35820 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
35830 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
35840 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
35850 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35860 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  +8]);.      ptrm
35870 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
35880 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
35890 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
358a0 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
358b0 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
358c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
358d0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
358e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
358f0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70  n is used to cop
35900 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
35910 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  f the b-tree nod
35920 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20  e stored .** on 
35930 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
35940 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20  ge pTo. If page 
35950 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20  pFrom was not a 
35960 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a  leaf page, then.
35970 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
35980 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ap entries for e
35990 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61  ach child page a
359a0 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  re updated so th
359b0 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74  at the.** parent
359c0 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20   page stored in 
359d0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
359e0 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  is page pTo. If 
359f0 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a  pFrom contained.
35a00 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74  ** any cells wit
35a10 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
35a20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74  pointers, then t
35a30 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
35a40 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
35a50 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f  entries are also
35a60 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
35a70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
35a80 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a   is page pTo..**
35a90 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20  .** If pFrom is 
35aa0 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69  currently carryi
35ab0 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ng any overflow 
35ac0 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69  cells (entries i
35ad0 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65  n the.** MemPage
35ae0 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29  .apOvfl[] array)
35af0 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63  , they are not c
35b00 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a  opied to pTo. .*
35b10 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
35b20 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20  rning, page pTo 
35b30 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  is reinitialized
35b40 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74   using btreeInit
35b50 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
35b60 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
35b70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
35b80 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
35b90 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
35ba0 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
35bb0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
35bc0 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
35bd0 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
35be0 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
35bf0 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
35c00 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
35c10 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
35c20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
35c30 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
35c40 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
35c50 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e  MemPage *pTo, in
35c60 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
35c70 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
35c80 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
35c90 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
35ca0 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75  From->pBt;.    u
35cb0 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
35cc0 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
35cd0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
35ce0 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
35cf0 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
35d00 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
35d10 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
35d20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
35d30 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
35d40 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
35d50 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
35d60 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
35d70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
35d80 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
35d90 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
35da0 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
35db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
35dc0 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
35dd0 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e  omHdr+5]) <= (in
35de0 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
35df0 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  e );.  .    /* C
35e00 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
35e10 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
35e20 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
35e30 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20  age pTo. */.    
35e40 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
35e50 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
35e60 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +5]);.    memcpy
35e70 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
35e80 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
35e90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
35ea0 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ta);.    memcpy(
35eb0 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
35ec0 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
35ed0 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
35ee0 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
35ef0 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ll);.  .    /* R
35f00 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
35f10 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65   pTo so that the
35f20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
35f30 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
35f40 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20  re.    ** match 
35f50 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
35f60 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
35f70 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75   of pTo can actu
35f80 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a  ally fail under.
35f90 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62      ** fairly ob
35fa0 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e  scure circumstan
35fb0 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ces, even though
35fc0 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66   it is a copy of
35fd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   initialized .  
35fe0 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e    ** page pFrom.
35ff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d  .    */.    pTo-
36000 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
36010 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
36020 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66  age(pTo);.    if
36030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36040 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
36050 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
36060 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
36070 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
36080 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
36090 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
360a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
360b0 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
360c0 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
360d0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
360e0 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
360f0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
36100 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
36110 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
36120 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
36130 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
36140 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
36150 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
36160 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
36170 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
36180 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
36190 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
361a0 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
361b0 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
361c0 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
361d0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
361e0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
361f0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
36200 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
36210 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
36220 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
36230 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
36240 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
36250 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
36260 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
36270 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
36280 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
36290 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
362a0 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
362b0 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
362c0 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
362d0 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
362e0 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
362f0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
36300 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
36310 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
36320 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
36330 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
36340 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
36350 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
36360 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
36370 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
36380 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
36390 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
363a0 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
363b0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
363c0 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
363d0 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
363e0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
363f0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
36400 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
36410 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
36420 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
36430 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
36440 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
36450 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
36460 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
36470 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
36480 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
36490 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
364a0 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
364b0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
364c0 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
364d0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
364e0 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
364f0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
36500 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
36510 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
36520 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
36530 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
36540 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
36550 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
36560 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
36570 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
36580 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
36590 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
365a0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
365b0 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
365c0 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
365d0 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
365e0 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
365f0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
36600 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
36610 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
36620 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
36630 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
36640 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
36650 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
36660 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
36670 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
36680 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
36690 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
366a0 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
366b0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
366c0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
366d0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
366e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
366f0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
36700 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
36710 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
36720 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
36730 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
36740 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
36750 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
36760 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
36770 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
36780 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
36790 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
367a0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
367b0 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
367c0 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
367d0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
367e0 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
367f0 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
36800 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
36810 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
36820 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
36830 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
36840 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
36850 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
36860 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
36870 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
36880 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
36890 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
368a0 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
368b0 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
368c0 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
368d0 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
368e0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
368f0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
36900 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
36910 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
36920 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
36930 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
36940 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
36950 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
36960 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
36970 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
36980 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
36990 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
369a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
369b0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
369c0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
369d0 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53  _MSC_VER) && _MS
369e0 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26  C_VER >= 1700 &&
369f0 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29   defined(_M_ARM)
36a00 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a  .#pragma optimiz
36a10 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69  e("", off).#endi
36a20 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  f.static int bal
36a30 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
36a40 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
36a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36a60 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
36a70 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
36a80 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
36a90 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
36aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36ab0 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
36ac0 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
36ad0 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
36ae0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
36af0 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
36b00 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
36b10 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
36b20 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
36b30 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
36b40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
36b50 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
36b60 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e  oot-page */.  in
36b70 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20 20  t bBulk         
36b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36b90 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63 61   True if this ca
36ba0 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ll is part of a 
36bb0 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a  bulk load */.){.
36bc0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
36bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36be0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
36bf0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
36c00 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
36c10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36c20 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
36c30 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
36c40 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
36c50 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
36c60 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
36c70 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
36c80 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
36c90 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
36ca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36cb0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
36cc0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
36cd0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
36ce0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36cf0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
36d00 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
36d10 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
36d20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36d30 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
36d40 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
36d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
36d60 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
36d70 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
36d80 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
36d90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
36da0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
36db0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
36dc0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
36dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
36de0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
36df0 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
36e00 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
36e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36e20 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
36e30 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
36e40 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
36e50 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
36e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
36e70 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
36e80 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
36e90 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
36ea0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
36eb0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
36ec0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
36ed0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
36ee0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
36ef0 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
36f00 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
36f10 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
36f20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
36f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
36f40 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
36f50 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
36f60 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
36f70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
36f80 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
36f90 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
36fa0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
36fb0 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
36fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
36fd0 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
36fe0 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
36ff0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
37000 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
37010 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
37020 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
37030 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
37040 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
37050 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
37060 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
37070 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
37080 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b  */.  u8 *pRight;
37090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370a0 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e    /* Location in
370b0 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74   parent of right
370c0 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72  -sibling pointer
370d0 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
370e0 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20  NB-1];          
370f0 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
37100 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
37110 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
37120 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
37130 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
37140 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
37150 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
37160 20 20 69 6e 74 20 63 6e 74 4f 6c 64 5b 4e 42 2b    int cntOld[NB+
37170 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
37180 2a 20 4f 6c 64 20 69 6e 64 65 78 20 69 6e 20 61  * Old index in a
37190 43 65 6c 6c 5b 5d 20 61 66 74 65 72 20 69 2d 74  Cell[] after i-t
371a0 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
371b0 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
371c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
371d0 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
371e0 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
371f0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
37200 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
37210 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
37220 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
37230 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
37240 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
37250 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
37260 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
37270 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
37280 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
37290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
372a0 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
372b0 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
372c0 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ells */.  Pgno p
372d0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
372e0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76         /* Temp v
372f0 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61  ar to store a pa
37300 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a  ge number in */.
37310 20 20 75 38 20 61 62 44 6f 6e 65 5b 4e 42 2b 32    u8 abDone[NB+2
37320 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
37330 2a 20 54 72 75 65 20 61 66 74 65 72 20 69 27 74  * True after i't
37340 68 20 6e 65 77 20 70 61 67 65 20 69 73 20 70 6f  h new page is po
37350 70 75 6c 61 74 65 64 20 2a 2f 0a 20 20 50 67 6e  pulated */.  Pgn
37360 6f 20 61 50 67 6e 6f 5b 4e 42 2b 32 5d 3b 20 20  o aPgno[NB+2];  
37370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
37380 65 20 6e 75 6d 62 65 72 73 20 6f 66 20 6e 65 77  e numbers of new
37390 20 70 61 67 65 73 20 62 65 66 6f 72 65 20 73 68   pages before sh
373a0 75 66 66 6c 69 6e 67 20 2a 2f 0a 20 20 75 31 36  uffling */.  u16
373b0 20 61 50 67 46 6c 61 67 73 5b 4e 42 2b 32 5d 3b   aPgFlags[NB+2];
373c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
373d0 67 73 20 66 69 65 6c 64 20 6f 66 20 6e 65 77 20  gs field of new 
373e0 70 61 67 65 73 20 62 65 66 6f 72 65 20 73 68 75  pages before shu
373f0 66 66 6c 69 6e 67 20 2a 2f 0a 0a 20 20 6d 65 6d  ffling */..  mem
37400 73 65 74 28 61 62 44 6f 6e 65 2c 20 30 2c 20 73  set(abDone, 0, s
37410 69 7a 65 6f 66 28 61 62 44 6f 6e 65 29 29 3b 0a  izeof(abDone));.
37420 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d    pBt = pParent-
37430 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
37440 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
37450 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
37460 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37470 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37480 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
37490 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a  Page) );..#if 0.
374a0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
374b0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
374c0 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
374d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
374e0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23  arent->pgno));.#
374f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74  endif..  /* At t
37500 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e  his point pParen
37510 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f  t may have at mo
37520 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20  st one overflow 
37530 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a  cell. And if.  *
37540 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  * this overflow 
37550 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c  cell is present,
37560 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20   it must be the 
37570 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20  cell with .  ** 
37580 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78  index iParentIdx
37590 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20  . This scenario 
375a0 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e  comes about when
375b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
375c0 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69   ** is called (i
375d0 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20  ndirectly) from 
375e0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
375f0 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  te()..  */.  ass
37600 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
37610 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
37620 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
37630 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
37640 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
37650 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
37660 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50  t->aiOvfl[0]==iP
37670 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69  arentIdx );..  i
37680 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29  f( !aOvflSpace )
37690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
376a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
376b0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69    /* Find the si
376c0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62  bling pages to b
376d0 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63  alance. Also loc
376e0 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  ate the cells in
376f0 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74   pParent .  ** t
37700 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73  hat divide the s
37710 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65  iblings. An atte
37720 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
37730 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
37740 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  on .  ** either 
37750 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d  side of pPage. M
37760 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
37770 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
37780 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a  side, however, .
37790 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72    ** if there ar
377a0 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
377b0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
377c0 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70  other side. If p
377d0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
377e0 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
377f0 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
37800 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
37810 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20  t are taken.  . 
37820 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
37830 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68  op also drops th
37840 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
37850 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
37860 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  page. This.  ** 
37870 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64  way, the remaind
37880 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  er of the functi
37890 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  on does not have
378a0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e   to deal with an
378b0 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  y.  ** overflow 
378c0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72  cells in the par
378d0 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20  ent page, since 
378e0 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74  if any existed t
378f0 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61  hey will.  ** ha
37900 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
37910 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20  removed..  */.  
37920 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
37930 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
37940 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
37950 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
37960 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
37970 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d    assert( bBulk=
37980 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29  =0 || bBulk==1 )
37990 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e  ;.    if( iParen
379a0 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20  tIdx==0 ){      
379b0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
379c0 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
379d0 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65   }else if( iPare
379e0 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20  ntIdx==i ){.    
379f0 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42    nxDiv = i-2+bB
37a00 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ulk;.    }else{.
37a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 42        assert( bB
37a20 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ulk==0 );.      
37a30 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49  nxDiv = iParentI
37a40 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dx-1;.    }.    
37a50 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d  i = 2-bBulk;.  }
37a60 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20  .  nOld = i+1;. 
37a70 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50   if( (i+nxDiv-pP
37a80 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
37a90 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  )==pParent->nCel
37aa0 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20  l ){.    pRight 
37ab0 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  = &pParent->aDat
37ac0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
37ad0 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65  fset+8];.  }else
37ae0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66  {.    pRight = f
37af0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
37b00 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
37b10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
37b20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62  }.  pgno = get4b
37b30 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77  yte(pRight);.  w
37b40 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72  hile( 1 ){.    r
37b50 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
37b60 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61  ge(pBt, pgno, &a
37b70 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20  pOld[i], 0);.   
37b80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37b90 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
37ba0 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
37bb0 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
37bc0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
37bd0 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
37be0 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
37bf0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
37c00 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
37c10 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d  low;.    if( (i-
37c20 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  -)==0 ) break;..
37c30 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d      if( i+nxDiv=
37c40 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c  =pParent->aiOvfl
37c50 5b 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  [0] && pParent->
37c60 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
37c70 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
37c80 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d  arent->apOvfl[0]
37c90 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
37ca0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
37cb0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
37cc0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
37cd0 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
37ce0 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  ]);.      pParen
37cf0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  t->nOverflow = 0
37d00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37d10 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
37d20 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
37d30 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
37d40 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >nOverflow);.   
37d50 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
37d60 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
37d70 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
37d80 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
37d90 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a  nt, apDiv[i]);..
37da0 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68        /* Drop th
37db0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20  e cell from the 
37dc0 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44  parent page. apD
37dd0 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e  iv[i] still poin
37de0 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  ts to.      ** t
37df0 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74  he cell within t
37e00 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20  he parent, even 
37e10 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65  though it has be
37e20 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20  en dropped..    
37e30 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66    ** This is saf
37e40 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69  e because droppi
37e50 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f  ng a cell only o
37e60 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69  verwrites the fi
37e70 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
37e80 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61  r bytes of it, a
37e90 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
37ea0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
37eb0 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
37ec0 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
37ed0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
37ee0 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  . So the pointer
37ef0 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a   is safe to use.
37f00 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f        ** later o
37f10 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  n.  .      **.  
37f20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69      ** But not i
37f30 66 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75  f we are in secu
37f40 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20  re-delete mode. 
37f50 49 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  In secure-delete
37f60 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20   mode,.      ** 
37f70 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72  the dropCell() r
37f80 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72  outine will over
37f90 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65  write the entire
37fa0 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65   cell with zeroe
37fb0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  s..      ** In t
37fc0 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72  his case, tempor
37fd0 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63  arily copy the c
37fe0 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76  ell into the aOv
37ff0 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  flSpace[].      
38000 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69  ** buffer. It wi
38010 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  ll be copied out
38020 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61   again as soon a
38030 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62  s the aSpace[] b
38040 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  uffer.      ** i
38050 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  s allocated.  */
38060 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
38070 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
38080 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
38090 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
380a0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ;..        iOff 
380b0 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
380c0 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20  INT(apDiv[i]) - 
380d0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
380e0 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  T(pParent->aData
380f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
38100 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28  iOff+szNew[i])>(
38110 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
38120 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
38130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
38140 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
38150 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
38160 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
38170 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
38180 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
38190 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
381a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
381b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
381c0 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d  aOvflSpace[iOff]
381d0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65  , apDiv[i], szNe
381e0 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  w[i]);.         
381f0 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
38200 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
38210 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
38220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38230 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65    }.      dropCe
38240 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
38250 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
38260 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d  erflow, szNew[i]
38270 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
38280 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
38290 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
382a0 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
382b0 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
382c0 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
382d0 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
382e0 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
382f0 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
38300 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
38310 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
38320 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a  ctures.  */.  sz
38330 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
38340 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
38350 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
38360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38370 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
38380 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
38390 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
383a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
383b0 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
383c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 20   pBt->pageSize; 
383d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
383f0 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 61 70 43  aSpace1 */.  apC
38400 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
38410 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
38420 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
38430 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
38440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
38450 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
38460 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
38470 7d 0a 20 20 73 7a 43 65 6c 6c 20